2016-05-09 62 views
1

假設我有一個名爲SomeClass的類,它在構造函數中取值並填充該字段。具有值的彈簧自動裝配對象

String text; 
String sometext; 

public someClass(String text, String sometext){ 
this.text = text; 
this.sometext = sometext; 
} 

SomeClass有一種創建新對象的方法。在Java中,當我們創建一個新的對象,我們可以用數值實例一樣

ClassName variable = new ClassName(text, sometext); 

,並使用構造

public ClassName(String text, String sometext){ 
this.text = text; 
this.sometext = sometext; 
} 

但在春季使用自動裝配,我們該怎麼做填充字段ClassName這樣嗎?

@Autowired 
public ClassName(SomeClass someClass){ 
this.text = someClass.text; 
this.sometext = someClass.sometext; 
} 

這不會工作。春怎麼會知道這SomeClass


UPDATE的實例:

我錯了。我沒有想到DI的方式。而不是自動裝配SomeClass。我不得不autowire ClassName

沒有DI我創建了一個新的對象類ClassName

的方法當使用DI我不得不在類的方法自動裝配ClassName

@Autowired 
ClassName className; 

我可以填充直接使字段公開的字段

className.text = text; 
className.sometext = sometext; 

我可以使用javabeans。 但如何通過構造函數來完成。

注意:彈簧配置沒有任何問題。基本掃描已啓用。

回答

1

你是正確的,即春季將不會自動知道所有的類或創建所需的豆類。春天不像魔術一樣工作。我們可以使用註釋,但我們仍然需要告訴Spring要創建哪些bean以及如何創建它們。那就是@Component,@Service,@Repository,@Controller發揮作用。看看here。當您想SomeClass成爲ClassName中的依賴項時,您必須明確地讓Spring知道需要創建一個SomeClass的bean,然後才能將其注入作爲ClassName中的依賴項,並且您通過使用正確的註釋註釋SomeClass來做到這一點。此外,您還需要爲Spring執行<context:component-scan base-package="com.your.package"/>以在其自動裝入依賴關係之前正確解析所有註釋。

此外,您必須認識到,如果您的SomeClass構造函數參數依賴於動態值,您將無法立即創建該bean,並且您將無法將其作爲依賴項注入ClassName使用@Autowired,因爲spring在部署期間需要知道這些值。如果是這種情況,對於SomeClass的實例,我寧願使用獲取器設置器方法代替ClassName

注意:這是回答是考慮到春季的註釋。您也可以通過在XML中定義Spring Beans來做同樣的事情。

+0

所以你說我不能通過構造函數使用自動裝配插入動態值? – user2471976

+0

@ user2471976是的,你根本無法做到這一點。 Spring在部署時需要知道任何構造函數的參數值,因爲只有在正確創建了所有bean的情況下才部署應用程序。看看[這個](http://stackoverflow.com/questions/6739566/anyway-to-autowire-a-bean-that-requires-constructor-arguments)和[this](http://stackoverflow.com/questions/34046451/spring-autowire-with-dynamic-constructor-parameters-using-annotation-approach)post。對於這種情況,你最好的選擇就是** getter setter方法**,就像我在我的回答中提到的那樣。 –

+0

感謝您的快速回復。 – user2471976

1

你不能在Spring中使用new,所有東西都必須在spring上下文中創建。在您的例子您的Spring配置將

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <bean class="SomeClass"> 
     <constructor-arg index="0" name="text" value="some value" /> 
     <constructor-arg index="1" name="sometext" value="some other value" /> 
    </bean> 

</beans> 

您的代碼woud是

@Autowired 
private SomeClass someClass; 
+0

文本和sometext不是值。他們是字符串變量 – user2471976

+0

這個答案有一個錯誤的代碼片段。它應該是'' –

+0

同意上面的2條評論,我的答案有點快。 –