Spring自动连线声明的问题

时间:2018-09-01 20:33:53

标签: java spring autowired

我正在尝试按照Petri Kainulainen在“ Spring Data”一书中的示例代码创建一个应用程序。我有一个服务RepositoryContactService 包com.packtpub.springdata.jpa.service;

@Service("service")
public class RepositoryContactService implements ContactService {

我的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 {

我正在运行带有声明的Test类

@Autowired
private static RepositoryContactService service;

和主要方法中的代码

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

问题在于“ service.save(contact);”行给我的服务为空。

3 个答案:

答案 0 :(得分:1)

从带注释的@Service的类中,仅创建一个bean,因为@Service的默认方式是Singleton,因此您无需静态自动连接这些类bean。

更改:

@Autowired
private static RepositoryContactService service;

收件人:

@Autowired
private RepositoryContactService service;

答案 1 :(得分:0)

感谢所有回应。我发现您无法自动连接静态字段并尝试

@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);
    }

使用

    @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 {

以便扫描RepositoryContactService并可以自动装配com.packtpub.springdata.jpa.repository中的ContactRepository。有时我甚至将com.packtpub.springdata.jpa.repository添加到@ComponentScan。

答案 2 :(得分:-1)

Spring无法自动连接RepositoryContactService的原因很多。

  1. RepositoryContactService不在@ComponentScan中声明的程序包中。为此,请尝试添加其中RepositoryContactService的软件包 并且ContactService出现在@ComponentScan中的列表中。
  2. 您已经编写了书面的Test课程。如果它是单元测试类,则检查是否存在用于单元测试的所有注释。

尽管这不会解决null问题,但我更喜欢对Interface进行编程,并使用Qualifier告诉spring容器要注入哪个Interface的实现。