无需显式配置即可更改 Bean 后处理顺序
-
11-12-2019 - |
题
我知道 bean 加载的顺序是由依赖项和传递依赖项隐式确定的。
想象一下,您有一组带注释的 bean,它们为您提供某种元数据,您希望将其应用到另一组 AwareBeans。因此,只有在收集了 N 个 bean 的所有元数据之后,才可以对 AwareBeans 进行后处理。您通常使用 org.springframework.beans.factory.config.BeanPostProcessor
对于这种东西。那么如何处理订单呢?我认为即使设置 depends-on
就加载顺序而言,明确地不优先于依赖项,对吗?
有一个界面 org.springframework.core.Ordered
它只决定 beanPostProcessors 的应用顺序,而不是 bean 的顺序。
我可以用 org.springframework.beans.factory.config.BeanFactoryPostProcessor
但是在bean实例化之前bean定义没有足够的信息。例如 beanDef.getBeanClass()
返回bean类名等。
您还能想到如何做我想做的事吗?
解决方案 2
我通过使用解决了它 org.springframework.beans.factory.config.BeanFactoryPostProcessor
并通过类加载器加载类,以便我可以使用反射来获取注释。我认为它不应该破坏任何东西,因为之后当 spring 进行类加载时,bean 类类加载器会检查该类是否已加载,如果是,则不会加载它。否则它会加载它。
其他提示
你可以:
a) 将所有元数据 bean 注入到 BeanPostProcessor
.
b) 让您的后处理器在启动时主动从应用程序上下文中获取所有元数据 bean。
每种方式都有优点和缺点,但效果是一样的:后 BeanPostProcessor
后构造,每个元数据 bean 也已经被后构造。