栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

追查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(...);}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381153.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号