Java @自动连线和bean创建顺序
在创建其他依赖bean之前,是否可以避免@Autowire某些bean?让我用一个例子更好地解释一下: 我有一个FactoryBean,它创建了一个类型为a的对象,该对象有一个名为a的属性。如果属性为null,则为bean a指定一个默认值 在@Configuration类中,我有: @Autowired private A myBean; @自动连线 私密的蚕豆; 发生的事情是工厂创建bean(我不完全理解如何创建),但工厂中的字段a为null,我需要它使用另一个bean来创建。我无法向工厂添加任何注释,因为它位于外部依赖项内部 问题是,在@Autowired向工厂请求对象之前,我需要设置a的值。考虑到我的限制,有可能吗 编辑 代码如下: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来创建。我无法
@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响应帮助我理解了这个问题