2013-05-27 98 views
0

我有以下情況。從外部bean注入bean屬性

我有兩個豆類,例如:

<bean id="service1" parent="txProxyTemplate"> 
    <property name="target"> 
     <bean autowire="byName" class="Class1"/> 
    </property> 
</bean> 

<bean name="manager1" parent="txProxyServiceTemplate"> 
    <property name="target"> 
     <bean autowire="byName" class="ManagerClass1"/ 
    </property> 
</bean> 

,我有三豆這是真正注入到這兩個baens:

<bean name="supportBean" parent="txProxyServiceTemplate"> 
    <property name="target"> 
     <bean autowire="byName" class="SupportBeanClass"> 
     </bean> 
    </property> 
</bean> 

有豆類服務1串「路徑」欄(path =「第一路徑」)和manager1(path =「第二路徑」)。 當supportBean被注入到service1和manager1時,我希望supportBean中的某些字符串字段(例如「actualPath」)是從兩個封閉的bean自動啓動的。春天我怎麼能做到這一點?

PS:我需要的服務1和manager1具有supportBean有兩個不同的字段(Service1類supportBean有actualPath = 「第一路」,在manager1類supportBean有actualPath =「第二條路徑)

我希望你明白我,謝謝!

回答

1

沒有看到任何實際的代碼,你能不能在SupportBeanSupportBean設置封閉bean的設置?SupportBean將需要有一個原型的範圍,以便可以維護單獨的狀態。

因此fo [R例如,如果您SupportBean看起來是這樣的:

@Component 
@Scope("prototype") 
public class SupportBean { 

    private String actualPath; 

    public void setActualPath(String actualPath) { 
     this.actualPath = actualPath 
    } 
} 

然後,你可以設置在SupportBean的實際路徑在封閉豆的制定者。所以Service1可能是這個樣子:

@Service 
public class Service1 { 

    private String path = "first path"; 
    private SupportBean supportBean; 

    @Autowired 
    public void setSupportBean(SupportBean supportBean) { 
     this.supportBean = supportBean; 
     this.supportBean.setActualPath(this.path); 
    } 
} 

而且Manager1這樣的:

@Service 
public class Manager1 { 

    private String path = "second path"; 
    private SupportBean supportBean; 

    @Autowired 
    public void setSupportBean(SupportBean supportBean) { 
     this.supportBean = supportBean; 
     this.supportBean.setActualPath(this.path); 
    } 
} 

如果你想用構造函數注入則只是下降的setter和自動裝配構造:

@Service 
public class Service1 { 

    private String path = "first path"; 
    private SupportBean supportBean; 

    @Autowired 
    public Service1(SupportBean supportBean) { 
     this.supportBean = supportBean; 
     this.supportBean.setActualPath(this.path); 
    } 
} 
+0

這是相當不錯的變體,謝謝:) 但我怎麼能避免通過setter設置「路徑」?我能通過構造函數以某種方式做到這一點嗎? – Dedyshka

+0

@Dedyshka - 您可以使用構造函數注入來自動裝載服務。如果你的意思是可以通過它的構造函數在'SupportBean'上設置實際的路徑 - 這將更加困難,因爲Spring已經在自動裝載服務的時候創建了SupportBean。您也許可以創建一個'SupportBeanFactory'或類似的自動裝配。然後,工廠可以創建'SupportBean',將相關路徑提供給'SupportBean'的構造函數。這將取決於你想要達到的目標。 –

相關問題