在创建其他依赖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;
}
然后factory-context.xml是这样的:
<bean id="client-factory" class="ClientFactory">
<property name="entities" ref="entities-list"/>
</bean>
实际上配置要大一点。我没有尝试过这样一个简化的例子。我将尝试用这样一个简化的上下文来重现它,看看是否可以按照@emd的建议将它包装到工厂中
基于你的问题,我假设@autoweledA 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;
}
}
}
如果无法编辑其他配置factory-context.xml
,这一点尤其有用。
我希望我正确理解了这个问题。但这里有一个例子,你可以做:
把工厂包在自己的工厂里。在你自己的工厂自动布线。用原厂构造对象,注入字段并返回对象。
例子:
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;
}
}
Spring部分:
<bean id="myFactory" class="aa.aa.MyFactory">
<constructor-arg ref="originalFactory" />
</bean>
<bean id="createdObject" factory-bean="myFactory" factory-method="getInstance"/>
在试图通过浏览器访问我的应用程序时,我遇到了不少错误。错误包括: 无法自动连线方法:public void com。ProjectOne。Util。自定义HibernatedAOSupport。anyMethodName(org.hibernate.SessionFactory);嵌套的异常是org。springframework。豆。工厂NoSuchBeanDefinitionException
问题内容: 有时我从那里下载python源代码,却不知道如何安装所有依赖项。如果没有文件,则必须手动创建。问题是:给定python源代码目录,是否可以从import部分自动创建? 问题答案: 如果使用虚拟环境,就可以了。 IF NOT ,pigar将是您不错的选择。 顺便说一句,我不确定它是否可以在2.6下使用。 更新 : 建议使用Pipenv或其他工具来改善您的开发流程。 对于 Python 3
有时我从下载python源代码,但不知道如何安装所有依赖项。如果没有文件,我必须手工创建它。问题是:给定python源代码目录,是否可以从import部分自动创建?
我试图在同一个类中创建一个简单的JFrame和JPanel,但我不想扩展JFrame或JPanel Java类中的任何一个。我还希望能够包括我自己的paintComponent(),它将覆盖Panel paint组件,这样我就可以绘制我自己的paint组件。我想创建我的 类别:
有没有办法在刷新Spring上下文后找出bean创建顺序(或至少依赖顺序)? 只要简单的bean定义顺序就可以了。我不想要他们注册的顺序。我想要创建它们的顺序(依赖关系树)