当前位置: 首页 > 知识库问答 >
问题:

@自动拥有和bean创建顺序

刘高驰
2023-03-14

在创建其他依赖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的建议将它包装到工厂中

共有2个答案

倪灿
2023-03-14

基于你的问题,我假设@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,这一点尤其有用。

姜建德
2023-03-14

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

把工厂包在自己的工厂里。在你自己的工厂自动布线。用原厂构造对象,注入字段并返回对象。

例子:

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定义顺序就可以了。我不想要他们注册的顺序。我想要创建它们的顺序(依赖关系树)