[英]@Autowired and bean creation order
是否有可能避免@Autowire一些豆,直到創建了其他依賴豆類? 讓我用一個例子更好地解釋一下:
我有一個FactoryBean,它創建一個A類型的對象,它有一個名為a的屬性。 如果屬性為null,則為bean A分配一個默認值。
在@Configuration類中,我有:
@Autowired private A myBean;
發生的事情是工廠創建bean(我不完全理解如何),但工廠中的字段a為null,我需要它用於創建A的另一個bean。 我無法向Factory添加任何注釋,因為它位於外部依賴項中。
事情是,我需要設置的值的@Autowired請求對象方可出廠。 是否可以給予我的限制?
編輯繼承人代碼:
@Configuration
@ImportResource("classpath:factory-context.xml")
public class ServiceContextConfig {
@Autowired
private A createdObject;
@Bean(name = "entities-list")
public List<String> getEntity() {
List<String> ls = new ArrayList<String>();
ls.add("countriescatalog");
return ls;
}
然后factory-context.xml看起來像這樣:
<bean id="client-factory" class="ClientFactory">
<property name="entities" ref="entities-list"/>
</bean>
實際上配置有點大。 我沒有嘗試這樣的簡化示例。 我將嘗試使用這樣的簡化上下文重現它,看看我是否可以修復它包裝工廠@emd建議
我希望我能理解這個問題。 但這里有一個例子,你可以做什么:
在自己的工廠包裝工廠。 在您自己的工廠中自動裝配該字段。 使用原始工廠構造對象,注入字段並返回對象。
例:
public class MyFactory {
@Autowired
private A a;
private final OriginalFactory originalFactory;
public MyFactory(OriginalFactory originalFactory) {
this.originalFactory=originalFactory;
}
public CreateObject getInstance() {
CreatedObject createdObject = originalFactory.getInstance();
createdObject.setA(a);
return createdObject;
}
}
春季部分:
<bean id="myFactory" class="aa.aa.MyFactory">
<constructor-arg ref="originalFactory" />
</bean>
<bean id="createdObject" factory-bean="myFactory" factory-method="getInstance"/>
基於您的問題,我假設@Autowired A createdObject
依賴於@Bean "entities-list"
,但createdObject
在創建"entities-list"
之前正在自動裝配。
我遇到了類似的問題並找到了解決方案。
在任何特定的@Configuration
類中,Spring首先解析所有@Autowired
字段,然后將任何@Bean
方法添加到上下文中。 但是,在解析@Autowired
字段之前, @Import
列表中的任何bean都將添加到上下文中。
因此,我們可以通過創建內部配置類來解決我們的問題:
@Configuration
@Import(ServiceContextConfig.InnerConfig.class) // <-- don't forget to add here
@ImportResource("classpath:factory-context.xml")
public class ServiceContextConfig {
@Autowired
private A createdObject;
@Configuration
static class InnerConfig { // <-- wrap bean in an "inner-configuration"
@Bean(name = "entities-list")
public List<String> getEntity() {
List<String> ls = new ArrayList<String>();
ls.add("countriescatalog");
return ls;
}
}
}
如果您無法編輯其他配置factory-context.xml
,這將特別有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.