Java Spring自动连线声明的问题

Java Spring自动连线声明的问题,java,spring,autowired,Java,Spring,Autowired,我正试图按照Petri Kainulainen的《Spring数据》一书中的示例代码创建一个应用程序。我有一个服务寄存联系服务 包com.packtpub.springdata.jpa.service @Service("service") public class RepositoryContactService implements ContactService { My ApplicationContext类将服务包设置为扫描 @Configuration @ComponentScan(

我正试图按照Petri Kainulainen的《Spring数据》一书中的示例代码创建一个应用程序。我有一个服务寄存联系服务 包com.packtpub.springdata.jpa.service

@Service("service")
public class RepositoryContactService implements ContactService {
My ApplicationContext类将服务包设置为扫描

@Configuration
@ComponentScan(basePackages = { "com.packtpub.springdata.jpa.service" })
@EnableTransactionManagement
@EnableWebMvc
@EnableJpaRepositories("com.packtpub.springdata.jpa.repository")
@PropertySource("classpath:application.properties")
public class ApplicationContext extends WebMvcConfigurerAdapter {
我正在运行带有声明的类测试

@Autowired
private static RepositoryContactService service;
并在main方法中编写代码

Contact contact = new Contact("handro1104@gmail.com", "handro");
service.save(contact);

问题是线路service.savecontact;给我的服务是空的

从注释为@Service的类只创建一个bean,因为@Service的默认方式是单例的,所以您不需要静态地自动连接这些类bean

更改:

@Autowired
private static RepositoryContactService service;
致:


Spring无法自动连线RepositoryContactService的原因可能有很多

RepositoryContactService不在@ComponentScan中声明的包中。为此,请尝试添加RepositoryContactService所在的包 ContactService出现在@ComponentScan中的列表中。 你已经写了,你已经写了课堂测试。如果它是一个单元测试类,那么检查用于单元测试的所有注释是否存在。
虽然这不能解决空值问题,但我更喜欢编程接口,并使用限定符告诉spring容器要注入接口的哪个实现。

感谢所有响应者。我发现您无法自动关联静态字段,并尝试

@Component
public class Test {
    @Autowired
    private ContactService service;

    public static void main(String[] args) {
        Test test = new Test();
        Contact contact = new Contact("handro1104@gmail.com", "handro");
        ContactService service = test.service;
        service.save(contact);
    }
但这也不起作用。我也试过了

public class Test {
    public static void main(String[] args) {
        ContactService service = new RepositoryContactService();
        Contact contact = new Contact("handro1104@gmail.com", "handro");
        service.save(contact);
    }

但这里的存储库为空

为了更清楚,我有

@Configuration
@ComponentScan(basePackages = { "com.packtpub.springdata.jpa.service" })
@EnableTransactionManagement
@EnableWebMvc
@EnableJpaRepositories("com.packtpub.springdata.jpa.repository")
@PropertySource("classpath:application.properties")
public class ApplicationContext extends WebMvcConfigurerAdapter {

因此,可以扫描RepositoryContactService,并自动连接com.packtpub.springdata.jpa.repository中的ContactRepository。在某些时候,我甚至将com.packtpub.springdata.jpa.repository添加到@ComponentScan中。

请显示测试类的声明和所有注释。Spring不会@Autowire静态变量-因此您的整体设置无效。您需要创建一个类来保存RepositoryContactService,main将通过Spring的应用程序上下文调用,这样Spring才能帮助您进行设置。
    @Resource // Also tried with @Autowired
    private ContactRepository repository;
@Configurable
public class RepositoryContactService implements ContactService {
    @Override
    public void save(Contact updated) {
        repository.save(updated);
    }
@Configuration
@ComponentScan(basePackages = { "com.packtpub.springdata.jpa.service" })
@EnableTransactionManagement
@EnableWebMvc
@EnableJpaRepositories("com.packtpub.springdata.jpa.repository")
@PropertySource("classpath:application.properties")
public class ApplicationContext extends WebMvcConfigurerAdapter {