Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @自动连线和bean创建顺序_Java_Spring_Autowired - Fatal编程技术网

Java @自动连线和bean创建顺序

Java @自动连线和bean创建顺序,java,spring,autowired,Java,Spring,Autowired,在创建其他依赖bean之前,是否可以避免@Autowire某些bean?让我用一个例子更好地解释一下: 我有一个FactoryBean,它创建了一个类型为a的对象,该对象有一个名为a的属性。如果属性为null,则为bean a指定一个默认值 在@Configuration类中,我有: @Autowired private A myBean; @自动连线 私密的蚕豆; 发生的事情是工厂创建bean(我不完全理解如何创建),但工厂中的字段a为null,我需要它使用另一个bean来创建。我无法

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

我有一个FactoryBean,它创建了一个类型为a的对象,该对象有一个名为a的属性。如果属性为null,则为bean a指定一个默认值

在@Configuration类中,我有:

@Autowired private A myBean; @自动连线 私密的蚕豆; 发生的事情是工厂创建bean(我不完全理解如何创建),但工厂中的字段a为null,我需要它使用另一个bean来创建。我无法向工厂添加任何注释,因为它位于外部依赖项内部

问题是,在@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;
    }
@配置
@ImportResource(“类路径:factory context.xml”)
公共类ServiceContextConfig{
@自动连线
私有创建对象;
@Bean(name=“实体列表”)
公共列表getEntity(){
List ls=新的ArrayList();
ls.添加(“countriescatalog”);
返回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"/>

基于您的问题,我假设
@自动连线createdObject
依赖于
@Bean“实体列表”
,但是
createdObject
是在
创建“实体列表”
之前自动连线的

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

在任何特定的
@Configuration
类中,Spring首先解析所有
@Autowired
字段,然后再将任何
@Bean
方法添加到上下文中。但是,
@Import
列表中的任何Bean都将在解析
@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;
        }
    }
}
@配置

@导入(ServiceContextConfig.InnerConfig.class)//请显示工厂如何创建bean,例如,
声明实际上问题有点棘手,没有在问题中显示出来。问题是由于a正在实现ApplicationListener,工厂正在报告应用程序事件而导致的循环引用。因此a注册为e工厂创建了一个。无论如何,@emd响应帮助我理解了这个问题