簡體   English   中英

@Autowired和bean創建順序

[英]@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM