最近看Nacos的源码,发现很多Configuration配置类上  @Configuration(proxyBeanMethods = false)   都把proxyBeanMethods设置成了false了。特地研究下。

源码中默认是true,对这个属性的解释也可以大概知道。

1: 如果为true, 则表示被@Bean标识的方法都会被CGLIB进行代理,而且会走bean的生命周期中的一些行为(比如:@PostConstruct,@Destroy等 spring中提供的生命周期), 如果bean是单例的,那么在同一个configuration中调用

@Bean标识的方法,无论调用几次得到的都是同一个bean,就是说这个bean只初始化一次。

2:  如果为false,则标识被@Bean标识的方法,不会被拦截进行CGLIB代理,也就不会走bean的生命周期中的一些行为(比如:@PostConstruct,@Destroy等 spring中提供的生命周期),如果同一个configuration中调用@Bean标识的方法,就只是普通方法的执行而已,并不会从容器中获取对象。所以如果单独调用@Bean标识的方法就是普通的方法调用,而且不走bean的生命周期。

所以,如果配置类中的@Bean标识的方法之间不存在依赖调用的话,可以设置为false,可以避免拦截方法进行代理操作,也是提升性能的一种优化。但是需要注意,@Bean标识的返回值对象还是会放入到容器中的,从容器中获取bean还是可以是单例的,会走生命周期。

看下面的例子:

public class MyBean {@PostConstructpublic void init(){System.out.println("MyBean初始化了");}public void hello(){System.out.println("Mybean  hello");}
}
public class YourBean {public MyBean myBean;public YourBean(MyBean myBean){this.myBean=myBean;}@PostConstructpublic void init(){System.out.println("YourBean 初始化了");}public void hello(){System.out.println("YourBean hello");}
}

@Configuration(proxyBeanMethods=true)

@Configuration(proxyBeanMethods = true)
public class ConfigureTest {@Beanpublic OrderEntity getOrderEntity(){return new OrderEntity();}@Beanpublic MyBean myBean(){return new MyBean();}@Beanpublic YourBean yourBean(){return new YourBean(myBean());}
}

测试方法:

@Component
public class InitClass implements InitializingBean , ApplicationContextAware {ApplicationContext applicationContext;@Overridepublic void afterPropertiesSet() throws Exception {YourBean bean = this.applicationContext.getBean(YourBean.class); // 第一行YourBean bean1 = this.applicationContext.getBean(YourBean.class);  // 第二行MyBean myBean = this.applicationContext.getBean(MyBean.class);    // 第三行myBean.hello();bean.hello();bean1.hello();}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext=applicationContext;}
}

第一行执行完:MyBean和YourBean都进行初始化了,说明在new YourBean(myBean())中myBean()走了bean的生命周期,说明被CGLIB进行代理了。

第二,三行执行完,没什么内容输出,说明YourBean,MyBean都初始化一次。


@Configuration(proxyBeanMethods=false)

@Configuration(proxyBeanMethods = false)
public class ConfigureTest {@Beanpublic OrderEntity getOrderEntity(){return new OrderEntity();}@Beanpublic MyBean myBean(){return new MyBean();}@Beanpublic YourBean yourBean(){return new YourBean(myBean());}
}

执行完第一行,只有YourBean初始化有输出:看到里面的MyBean属性是@5351

执行完第二行,没有内容输出,bean1中的MyBean属性也是@5351

第三行执行完,MyBean的初始化才输出,而且从容器中得到的这个bean是@5360

看到这里应该能体会到,proxyBeanMethods的含义了吧。为false的时候,@Bean标识的方法调用就是普通的方法调用,不会被代理。

@Configuration(proxyBeanMethods = false) 设置这个为false有啥用相关推荐

  1. Keras TensorFlow 混编中 trainable=False设置无效

    Keras TensorFlow 混编中 trainable=False设置无效 这是最近碰到一个问题,先描述下问题: 首先我有一个训练好的模型(例如vgg16),我要对这个模型进行一些改变,例如添加 ...

  2. GridView xml中设置android:focusable=false无效的原因

    最近Tv项目中有个小问题,需要gridview展示内容,但是不可获取焦点,于是xml中设置android:focusable="false",设想会成功,但是实际操作,发现还是可以 ...

  3. Thread 设置 IsBackground true false 的 运行差别

    1.这是一个 后台线程,IsBackground=true,  主线程完成后,后台子线程也停止了,即使 子线程 还有没运行完,也要停止 class Program{static void Main(s ...

  4. ValidateInput(false)与this.ValidateRequest = false无效的解决方案

    ValidateInput(false)与this.ValidateRequest = false无效的解决方案 鼓捣了半天 终于解决了这个问题 写出来 叫后人少费点劲 在最外层的web.config ...

  5. SourceTree提交vue前端代码报错git -c diff.mnemonicprefix=false -c core.quotepath=false commit -q -F C:\Users\

    完整报错如下: git -c diff.mnemonicprefix=false -c core.quotepath=false commit -q -F C:\Users\honry.guan\Ap ...

  6. SourceTree提交代码报错git -c diff.mnemonicprefix=false -c core.quotepath=false commit -q -F C:\Users\honry

    完整报错 git -c diff.mnemonicprefix=false -c core.quotepath=false commit -q -F C:\Users\honry.guan\AppDa ...

  7. 【错误记录】未安装该应用 ( 在 Android 12 之后 组件设置 android:exported=“false“ 属性 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 报错信息 : 点击应用图标后 , 应用并未启动 , 并弹出 " 未安装该应用 " 提示信息 ; 二.解决方案 排查了一下相关地方 ...

  8. Vue Admin Template关闭eslint校验,lintOnSave:false设置无效解决办法

    目录 第一步:lintOnSave:false 第二步:修改package.json中的配置 最后一步: 使用Vue Admin Template 二次开发是一件非常愉悦的事情,可是它里面的eslin ...

  9. CheckBox设置Enabled为False后,无法修改ForeColor

    设置CheckBox的AutoCheck为False,Enabled为True,即可解决. 转载于:https://www.cnblogs.com/JustYong/p/6015611.html

最新文章

  1. SearchRequestBuilder常用方法说明
  2. ajax实现简单计算器,一个简单的jQuery计算器实现了连续计算功能
  3. 怎样的财报让百度市值一夜暴涨400亿?净利逆势大涨219%;李彦宏:将在中国经济的复苏中受益...
  4. linux切换到顶层命令,一些在Linux下提高工作效率的常用命令
  5. C语言程序设计之编程求鸡和兔的只数,用穷举法解决
  6. oracle 约束 Oracle 10g学习系列(5)
  7. Kali Linux 从入门到精通(十)-漏洞挖掘之缓冲区溢出
  8. 解决DesignMode不能正确反应是否处于设计模式的问题
  9. Beyond Compare 4常用配置
  10. std::map,不同的插入方式,会导致崩溃
  11. WPS中设置一级、二级、三级标题以及正文和目录
  12. php + redis 实现延迟队列
  13. 矩阵论——矩阵的标准型
  14. Android WebView点击返回键回到上一个html
  15. office 宏病毒分析
  16. 如何让XP系统能够访问Https
  17. 计算机的常见故障处理实验报告,实训13 微机常见故障处理实训报告.doc
  18. Docker 高级篇
  19. 面试算法———回溯经典题目
  20. GNSS-导航卫星受力分析

热门文章

  1. Android基础入门教程——2.5.1 Toast(吐司)的基本使用
  2. 小程序组件获取元素宽高失效 和canvas绘制问题
  3. cmd html 查找汉子字,cmd搜索字符串加换行 在cmd(命令提示符)中怎样换行
  4. 文件异常与文本文件处理
  5. 普通代码块,静态代码块,构造代码块,构造方法
  6. java——重试机制
  7. 微信小程序 如何等待onLaunch拿到后端数据后,再执行onLoad
  8. 有一个美女程序媛是一种什么样的体验,分享一下她所推荐的学习资料给你
  9. android studio新闻界面,课内资源 - 基于Android Studio实现的新闻APP
  10. 知乎周源微信_每周源代码33-Google Chrome中的Microsoft Open Source