2016-05-23 52 views
0

我無法將Bean類型注入屬性文件的構造函數參數中。 我可以通過直接將值傳遞給@Qualifier(「beanName」)來注入它,如下所示。使用Spring註解將Bean注入構造函數參數並使用Property佔位符

@Component("circle") 
public class Circle implements Shape { 

} 

@RestController 
class MyController {  
    private final Shape shape; 

    @Autowired 
    public MyClass(@Qualifier("circle") 
      Shape shape) { 
    this.shape = shape;  
    } 
} 

但是,下面的代碼示例不起作用。

這將返回Null。

​​

到位@Qualifier使用@Resource(NAME = 「$ {}形」)這裏提到( Spring: Using @Qualifier with Property Placeholder) 但讓編譯器錯誤 「 '@資源' 並不適用於參數」 嘗試

@Resource( 「$ {}形」)給出了錯誤 「找不到方法 '價值'」

這並不工作過:

@RestController 
class MyController {  
    @Value("${shape}") 
    private final String shapeBean; //Compiler error : "Variable 'shapeBean' might not have been initialised" 
    //Not declaring shapeBean as final will give a compiler error at @Qualifier: "Attribute value must be constant" 
    private final Shape shape; 

    @Autowired 
    public MyClass(@Qualifier(shapeBean) 
      Shape shape) { 
    this.shape = shape;  
    } 
} 

下面的代碼不起作用。在@Qualifier中給出編譯器錯誤:「屬性值必須是常量」。

@RestController 
class MyController {  
    @Value("${shape}") 
    private final String shapeBean; 
    private final Shape shape; 

    @Autowired 
    public MyClass(@Qualifier(shapeBean) 
      Shape shape) { 
    this.shape = shape;  
    } 
} 

還嘗試了以下內容。在嘗試訪問形狀時都拋出NullPointerException。

@Resource(name="${shape}") 
private Shape shape; // In addition, throws a warning saying, "Private field 'shape' is never assigned" 

@Autowired 
@Resource(name="${shape}") 
private Shape shape; 

如果構造函數參數是一個基元或一個字符串,我可以只使用@Value(「$ {shape}」)並將值注入到變量中。但因爲它是一個類,我不知道如何完成它。
有人可以告訴我,如果我配置不正確或我應該做什麼?

+0

所以你想在運行時選擇不同的形狀?一般來說,你會使用像這樣的配置文件。你能對你的實際應用更具體嗎? – chrylis

+0

從上面的例子中可以看出,我有一個Shape接口和具體類實現形狀。但現在在我的控制器中,我只想將圓形狀注入到Shape對象中。我之前使用的@Qualifier(「circle」)完美運作。但由於我不想保留硬編碼,我想從屬性文件中獲取它。有什麼辦法可以從屬性文件中獲取值,然後將該值插入到Shape對象中? – Arthas

回答

0

不會Circle具有在Shape中定義的所有方法嗎? - 只要形狀合同得到滿足,你應該沒問題。現在,如果您有多個呈現三角形,矩形和圓形的形狀,並且出於某種原因想要動態加載確切的子類,則可能需要使用ApplicationContext.getBean(「」)來獲取特定的bean。

您可以通過重寫afterPropertiesSet()來維護對各種可能形狀的引用 - 查看InitialingBean並在運行時使用正確的bean。

+0

現在我正在使用Circle提供的服務。在某些時候,我可能會停止使用_Circle_提供的服務,並訂閱_Triangle_提供的服務。因此,爲了解決問題,我想在我的屬性文件中聲明服務提供者,而不是在我的Controller中聲明它。有沒有辦法使用註釋分配屬性值? – Arthas

+0

是的,最簡單的方法是使用spring配置文件根據spring.profile.active env變量激活一組bean。簡單教程在 https:// spring下面給出。io/blog/2011/02/14/spring-3-1-m1-introduction-profile/ http://www.mkyong.com/spring/spring-profiles-example/ – JVXR

相關問題