追查Spring“不符合自动代理资格”的原因

追查Spring“不符合自动代理资格”的原因,第1张

追查Spring“不符合自动代理资格”的原因

请遵循以下方法:

  1. BeanPostProcessorChecker
    在你的IDE中打开(这是的内部类
    AbstractApplicationContext
  2. if (logger.isInfoEnabled())
    {在方法上设置一个断点
    postProcessAfterInitialization
  3. 运行你的代码
  4. 当你达到断点时,
    getBean(String,Class<T>)
    在堆栈跟踪中查找对的调用

这些调用之一将尝试创建一个

BeanPostProcessor
。那个豆应该是罪魁祸首。

背景

想象一下这种情况:

public class FooPP implements BeanPostProcessor {    @Autowire    private Config config;}

当必须创建Spring时

config
(因为它是的依赖项
FooPP
),它有一个问题:合同规定
BeanPostProcessor
必须将所有内容应用于所创建的每个bean。但是当Spring需要时
config
,至少有一个PP(即
FooPP
)尚未准备好服务!

当你使用

@Configuration
类定义此bean 时,情况会变得更糟:

@Configurationpublic class BadSpringConfig {     @Lazy @Bean public Config config() { return new Config(); }     @Lazy @Bean public FooPP fooPP() { return new FooPP(); }}

每个配置类都是一个bean。这意味着要从中建立一个bean工厂

BadSpringConfig
,Spring需要应用后处理器
fooPP
但是为此,它首先需要bean工厂…

在此示例中,可以打破循环依赖之一。你可以

FooPP
实现
BeanFactoryAware
让Spring注入
BeanFactory
到后处理器。这样,你就不需要自动装配。

在代码的后面,你可以请求bean:

private LazyInit<Config> helper = new LazyInit<Config>() {    @Override    protected InjectionHelper computevalue() {        return beanFactory.getBean( Config.class );    }};@Overridepublic Object postProcessBeforeInitialization( Object bean, String beanName ) throws BeansException {     String value = helper.get().getConfig(...);}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4934309.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-13
下一篇2022-11-12

发表评论

登录后才能评论

评论列表(0条)

    保存