如何使依赖注入为组件工作

时间:2016-11-30 15:00:37

标签: java spring spring-mvc spring-boot

我有一个spring boot应用程序,我试图注入一个存储库。每次我尝试使用存储库时为null。这是一段代码:

我的主要申请

package com.cisco.ido.no2.deployment;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableAutoConfiguration
@SpringBootApplication
public class No2AlDeviceDeploymentIdApplication {

    public static void main(String[] args) {
        SpringApplication.run(No2AlDeviceDeploymentIdApplication.class, args);
    }
}

我的组件

@Component
@PostBack(route = "no2.deployment", dataClass = String.class, queue = "no2-deployment")
public class DevicePostbackRunnable extends PostBackRunnable<String> {

    @Autowired
    private DeviceTypeRepository deviceTypeRepository;

    public DevicePostbackRunnable() {}

    public DevicePostbackRunnable(Class<String> dataClass) {
        super(dataClass);
    }

    @Override
    public void processTaskResult(String result, RunningTask runningTask) {
        DeviceType dt = deviceTypeRepository.findOne((long)12);  // <-----here
        int yy = 90;
    }
}

这是我的存储库代码:

package com.cisco.ido.no2.deployment.repositories;

import com.cisco.ido.no2.deployment.entities.DeviceType;
import org.springframework.data.repository.CrudRepository;

public interface DeviceTypeRepository extends CrudRepository<DeviceType, Long> {

}

我的DevicePostBackRunnable包名是com.cisco.ido.no2.deployment。当我呼叫DeviceType dt = deviceTypeRepository.findOne时,它始终为空。有没有办法让这项工作?此外,当我在Rest Controller中注入此存储库时,它可以正常工作。

2 个答案:

答案 0 :(得分:1)

您的界面应具有以下注释之一,以便在春季注射:

@Component
@Service
@Repository
@Controller

答案 1 :(得分:1)

您应该将@Repository放在界面 DeviceTypeRepository 中。以便 当您使用@Autowired时,Spring容器会自动检测该类,作为容器组件扫描过程的一部分。

来自Spring文档:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/beans.html#beans-stereotype-annotations

  

@Repository注释是任何满足该类的类的标记   存储库的角色或构造型(也称为数据访问对象)   或DAO)。这个标记的用途之一是自动翻译   第20.2.2节“异常翻译”中描述的例外情况。

     

Spring提供了进一步的构造型注释:@Component,@ Service,   和@Controller。 @Component是任何的通用构造型   Spring管理的组件。 @ Repository,@ Service和@Controller都是   对于更具体的用例,@ Component的特化   例如,在持久性,服务和表示层中,   分别。因此,您可以使用注释组件类   @Component,但是用@ Repository,@ Service或者注释它们   相反,@ Controller更适合你的类   通过工具处理或与方面相关联。例如,这些   构造型注释成为切入点的理想目标。也是   @Repository,@ Service和@Controller可能会携带   Spring框架的未来版本中的其他语义。从而,   如果您选择使用@Component或@Service作为您的   服务层,@ Service显然是更好的选择。同样,如   如上所述,已经支持@Repository作为标记   持久层中的自动异常转换。