【问题标题】:Change beans post processing order without explicit configuration在没有显式配置的情况下更改 bean 后处理顺序
【发布时间】:2012-09-21 00:42:24
【问题描述】:

我知道 bean 加载的顺序是由依赖项和传递依赖项隐式确定的。

假设您有一组带注释的 bean,它们为您提供某种元数据,您希望将这些元数据应用于另一组 AwareBean。因此,只有在您从 N 个 bean 中收集了所有元数据之后,您才能对 AwareBeans 进行后期处理。你通常使用org.springframework.beans.factory.config.BeanPostProcessor 来处理这类事情。但是如何处理订单?我认为即使明确设置depends-on 也不会优先于加载顺序的依赖关系,对吧?

有一个接口org.springframework.core.Ordered 只决定应用beanPostProcessor 的顺序,而不决定bean 的顺序。

我可以使用org.springframework.beans.factory.config.BeanFactoryPostProcessor,但 bean 定义在 bean 实例化之前没有足够的信息。例如beanDef.getBeanClass() 返回 bean 类名等。

你能想到如何做我想做的事吗?

【问题讨论】:

    标签: java spring post-processing


    【解决方案1】:

    你可以:

    a) 将您的所有元数据 bean 注入您的 BeanPostProcessor

    b) 让您的后处理器在启动时主动从应用程序上下文中获取所有元数据 bean。

    各有优劣,但效果是一样的:在BeanPostProcessor postconstruction之后,每个metadata bean也都已经postconstructed了。

    【讨论】:

    • 我故意提到“没有显式配置”,这意味着:“我正在做一个供第三方使用的库”,这使得 a) 没有用...关于 b) ,由于存在bean依赖关系,这没有意义......
    【解决方案2】:

    我通过使用org.springframework.beans.factory.config.BeanFactoryPostProcessor 并通过类加载器加载类来解决它,以便我可以使用反射来获取注释。我认为它不应该破坏任何东西,因为之后当spring要类加载时,bean类类加载器会检查该类是否已经加载,如果是则不加载它。否则它会加载它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多