为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

RISEBY 2022-12-21 13:58:20
在 Spring 应用程序中,可以使用applicationContext.getBeansOfType(Object.class). 这当然只有在创建了所有 Beans 之后才有可能。所以,如果我在一个 Bean 的构造函数中调用这个方法,我必须很幸运,成为最后一个被创建的 Bean,才能访问所有这些 Bean。据我了解 Spring Beans 的生命周期,在 Bean 初始化之前有一个创建 BeanDefinitions 的阶段。如何在 Bean 的构造函数中检索所有创建的 BeanDefinitions?我还可以检索Class那些 BeanDefinitions 的类型吗?BeanDefinition类型似乎只提供“此 bean 定义的当前 bean 类名”。或者是在构造完所有 Bean 之后获得这些类型的唯一方法(例如@PostConstruct)?
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

也许这段代码可以帮助


    for (String name : applicationContext.getBeanFactory().getBeanDefinitionNames()) {

        BeanDefinition beanDefinition = applicationContext.getBeanFactory().getBeanDefinition(name);

        String className = beanDefinition.getBeanClassName();

        Class<?> clazz = Class.forName(className);

    }

循环让你得到所有的BeanDefinitions 然后你为每个加载类并做你想做的事?


顺便说一句,这可能不是使用 Spring 的好方法,但它会起作用。


查看完整回答
反对 回复 2022-12-21
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

您可以创建最后一个 bean,例如将它放在@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";

    }


}


查看完整回答
反对 回复 2022-12-21
  • 2 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信