3

在创建其他依赖豆之前,是否可以避免@Autowire 一些豆?让我用一个例子更好地解释它:

我有一个 FactoryBean,它创建一个类型为A的对象,该对象具有一个名为a的属性。如果该属性为 null,它会为 bean A分配一个默认值。

在@Configuration 类中,我有:

    @自动连线
    私有的一个 myBean;

发生的事情是工厂创建了 bean(我不完全理解如何)但是工厂中的字段a为空,我需要它需要另一个用于创建A的 bean 。我无法向 Factory 添加任何注释,因为它位于外部依赖项中。

问题是我需要在 @Autowired 向工厂请求对象之前设置a的值。考虑到我的限制,有可能吗?

编辑 继承人的代码:

@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 的建议修复它包装工厂

4

2 回答 2

1

我希望我正确理解了这个问题。但这里有一个例子,你可以做什么:

把工厂包裹在自己的工厂里。在您自己的工厂中自动连接该字段。用原厂构造对象,注入字段,返回对象。

例子:

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"/>
于 2013-03-21T21:23:24.510 回答
1

根据您的问题,我假设@Autowired A createdObject依赖于@Bean "entities-list",但在创建createdObject之前正在自动装配"entities-list"

我遇到了类似的问题并找到了解决方案。

在任何特定的类中,Spring在将任何方法添加到上下文之前@Configuration首先解析所有字段。但是,列表中的任何 bean都将在解析字段之前添加到上下文中。@Autowired@Bean@Import@Autowired

因此,我们可以通过创建一个内部配置类来解决我们的问题:

@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.

于 2017-03-06T21:37:42.507 回答