2016-11-30 37 views
0

我有一个弹簧启动应用程序,我试图注入一个存储库。每次我尝试使用存储库时它都是空的。下面是一个代码片段:如何使组件的依赖注入工作

我的主要应用

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中注入这个仓库时,它工作正常。

+0

你可以发布你的'春季启动主应用程序包名? –

+0

@andolsizied嗨发布我的主要应用程序 – Luke101

+0

你能发布'DevicePostbackRunnable'包名吗? –

回答

1

你应该把@Repository在你的界面DeviceTypeRepository。因此,当您使用@Autowired时,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是弹簧管理组件的任何 通用刻板印象。 @Repository,@Service和@Controller分别是 @Component的特化,用于更具体的用例, 示例,分别在持久层,服务和表示层中分别为 。因此,您可以用@ @Component注释组件类,而是通过@Repository,@Service或@Controller对它们进行注释,而您的类更适合用于通过工具处理或与方面关联的 。例如,这些 原型注释为切入点提供了理想的目标。它也是 @Repository,@Service和@Controller可能会在未来的Spring Framework版本中携带 附加语义。因此, 如果您选择使用@Component或@Service作为 服务层,@Service显然是更好的选择。同样,如上所述 ,已经支持@Repository作为持久层中的自动异常转换的标记。

1

你的接口应具有以下注解之一,以可注射的弹簧:

@Component 
@Service 
@Repository 
@Controller