在实例化阶段之前/期间检索Bean类

时间:2019-05-28 13:37:26

标签: java spring spring-boot

在Spring应用程序中,可以使用applicationContext.getBeansOfType(Object.class)检索所有(?)Bean。当然,只有在创建了所有Bean之后,这才有可能。

因此,如果我在Bean的构造函数中调用此方法,我必须很幸运,成为最后一个要创建的Bean,才能访问所有它们。

据我所知,Spring Bean的life cycle在初始化Bean之前有一个阶段,即创建BeanDefinition。

  • 如何在Bean的构造函数中检索所有创建的BeanDefinition?
  • 我还可以检索那些BeanDefinitions的类型(作为Class)吗?类型BeanDefinition似乎只提供“此bean定义的当前bean类名称”

或者是在构造完所有Bean(例如@PostConstruct)之后获取那些类型的唯一方法吗?

2 个答案:

答案 0 :(得分:1)

您可以通过以最小的初始化顺序将它放置在@Configuration类中来创建最后一个bean,这样它就是最后一个 @Order(Ordered.LOWEST_PRECEDENCE),就这样:

@Configuration
@Order(Ordered.LOWEST_PRECEDENCE)
public class Last {

    @Autowired
    ApplicationContext applicationContext;

    @Bean
    public String lastBean() {

        applicationContext.getBeanDefinitionNames();    //retrive all created BeanDefinitions in the constructor of a Bean

        applicationContext.getBeansOfType(Object.class); //retrive the types (as Class) 

        return "lastBean";
    }

}

答案 1 :(得分:1)

也许这段代码有帮助

    for (String name : applicationContext.getBeanFactory().getBeanDefinitionNames()) {
        BeanDefinition beanDefinition = applicationContext.getBeanFactory().getBeanDefinition(name);
        String className = beanDefinition.getBeanClassName();
        Class<?> clazz = Class.forName(className);
    }

循环使您获得所有BeanDefinition,然后为每个加载类并执行所需的操作?

通过这种方式,这可能不是使用Spring的好方法,但它可以工作。