2016-11-30 38 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