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

春靴厂Bean创建订单

卫琛
2023-03-14

实际应用程序注册一个BeanDefinitionRegistryPostProcessor来添加bean定义。实例本身是通过starter项目中定义的另一个bean构造的,而starter项目本身将另一个bean作为依赖项。

为了使用动态注册的bean,我创建了一个用@component注释的类,并定义了一个将所述bean作为参数的构造函数。当我通过设置@autowired(required=false)来调试应用程序时,我可以看到在创建动态bean之前调用了组件的构造函数。而且,当时连工厂豆都还没有创建出来。

将带有工厂bean名称的@dependson添加到组件中,会首先创建工厂,而不是动态bean。

编辑:

我能够在示例库中再现这个问题:
https://github.com/maveeee/spring-dynamic-bean-demo/

共有1个答案

向泽语
2023-03-14

您可以使用@order注释,它为带注释的组件或bean定义排序顺序。

考虑到在Spring4.0之前,该注释仅用于AspectJ执行顺序。Spring4.0之后,支持将注入的组件排序到集合中。因此,Spring将根据它们的order值注入相同类型的自动连线bean。

例如:

interface IBean {
    String getName();
}

public class BeanX implements IBean {
    public BeanX() {}

    @Override
    public String getName() {
        return "BeanX";
    }
}

public class BeanY implements IBean {
    public BeanY() {}

    @Override
    public String getName() {
        return "BeanY";
    }
}

@Component
public class RandomComponent {
    @Autowired
    private List<IBean> beans;

    @PostConstruct
    public void getBeanValues() {
        System.out.println("\n---@Bean---\n");
        for (IBean b : beans) {
            System.out.println(b.getName());
        }
    }

    @Bean
    @Order(1)
    public IBean getBeanX() {
        return new BeanX();
    }

    @Bean
    @Order(0)
    public IBean getBeanY() {
        return new BeanY();
    }
}

将打印:

---@Bean---

BeanY
BeanX
    null
 类似资料:
  • 我想在我的Junit5单元测试中将值注入到带有@Value注释的私有字段。 我引用了这个,并使用了ReflectionTestUtils。setField通过注入值解决了我的问题,但在验证方法被调用的次数时失败。 MyClass(我的类别): 测试类: 运行上述测试时出错 我想kafkaTemplate.sendMessage();被调用一次,但被调用两次后添加反射TestUtils。 需要关于如

  • 问题内容: 我使用ektorp连接到CouchDB。 构建ektorp 实例的方法是使用构建器模式: 我对Spring比较陌生。请为我提供有关如何在上下文中配置以便通过进行创建的建议。 一种方法是使用。还有其他选择吗? 问题答案: 您可以尝试实现接口: 并添加到配置以下bean定义: 然后,您可以将此bean注入另一个bean,它将作为实例进行解析。

  • 我必须根据tenantIdentifier创建一个数据源bean以实现多租户。我正在考虑开箱即用的解决方案,添加新租户就像在context.xml中添加配置和在应用程序属性文件中添加租户属性一样简单,公开一个API来刷新我的context.xml以便从spring cloud config和属性文件中加载。 目前,我被这个错误所困扰: 我的DataSourceFactoryBean如下所示: 我有

  • 我想在我的spring boot项目中使用Kafka Streams实时处理。所以我需要Kafka Streams配置,或者我想使用KStreams或KTable,但我在互联网上找不到示例。 我做了制作人和消费者现在我想流实时。

  • 我有一个factory-ish bean,它在启动时创建了许多对象,我希望这些对象本身就是Spring bean。 如果我创建一个对象,我可以使用工厂方法进行实例化,例如(来自Spring文档第4.3.2.3节): 如果我提前知道我有n个对象,我可以调用n个不同的方法,但是我没有——我的工厂创建了任意数量的对象,而这些对象是提前不知道的。 有人知道怎么做吗? 目标是让它们成为“合适的”Spring

  • 我有一些Spring托管类(通过xml配置),其中一个是SessionFactory,它被注入到另一个Spring托管类中。每当该类需要一个新的会话时,它就调用SessionFactory上的createSession。