当前位置: 首页 > news >正文

关于Spring中的@Configuration中的proxyBeanMethods属性

@Configuration的proxyBeanMethods属性

@Configuration注解中,有两个属性:

  • value配置Bean名称
  • proxyBeanMethos,默认是true

这个proxyBeanMethods的默认属性是true。

直接说:当@Configuration注解的proxyBeanMeathods属性是true时,那么此类的Bean就会被Spring代理,被代理就意味着此类中的方法得到的增强处理。那么此类中通过@Bean来对外提供Bean的方法就会被增强

我们可以看一下:

这是一个被@Configuration修饰的类

@Configuration
public class DBConfig {}

我们获取一下这个Bean,打印一下类型

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println(ctx.getBean("DBConfig"));
// com.liumingkai.config.DBConfig$$EnhancerBySpringCGLIB$$ef2610c5@5bfa9431

可以看到,打印出来的类型不是DBConfig,而是被代理后的类型DBConfig$$EnhancerBySpringCGLIB,(可以看到这是CGLib代理出来的类,因为JDK动态代理只能处理有接口的类,而CGlib是通过继承的方式来做代理的)

当设置proxyBeanMethos的属性是false时,得到的就是此类型,不再是代理类

System.out.println(ctx.getBean("DBConfig"));
// com.liumingkai.config.DBConfig@710726a3

我们知道,被@Bean修饰的方法的返回对象,会被注册进入Spring的容器中,受Spring的管理

那将@ConfigurationproxyBeanMethods的属性设置为true会有什么好处呢?
因为@Configuration注解通常用来修饰配置类,会在此类中配置大量的配置项或者用来对外提供Bean

该配置类中通过@Bean来对外提供Bean的方法会被增强,每次都会返回Spring容器管理的Bean

演示一下

例如:在@Configuration修饰的类,在此类中有一个被@Bean修饰的方法,用来对外提供Bean。

我们获取到此类型的Bean后,可以像普通方法一样来调用这个被@Bean修饰的方法,会得到返回的对象。

区别在于:

  • proxyBeanMethods属性为true时,此类被代理,方法得到增强,那么我们每次通过此类型的Bean来调用@Bean修饰的方法,每次返回的都是Spring容器中的单例Bean
  • proxyBeanMethods属性是false时,此类型的Bean就是一个普通的Bean,未被代理,那么每次调用@Bean修饰的方法,这都是一个普通的方法,返回的都是新的普通的对象,不是被Spring容器管理的对象

测试

例如;

  1. 先来看,当proxyBeanMethods为false时
@Configuration(proxyBeanMethods = false)
public class DBConfig {@Beanpublic DruidDataSource getDruidDataSource() {return new DruidDataSource();}
}

测试

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);// 获取此类型的Bean,查看类型
DBConfig dbConfig = ctx.getBean("DBConfig", DBConfig.class);
// 查看类型
System.out.println(dbConfig);
// com.liumingkai.config.DBConfig@f2ff811
// 就是普通的类型,未被代理// 调用此Bean上被@Bean修饰的方法
System.out.println(dbConfig.getDruidDataSource() == dbConfig.getDruidDataSource());
// false 证明此方法就是普通的方法,每次都会创建一个对象
  1. 再来看proxyBeanMethods为true的情况
@Configuration
public class DBConfig {@Beanpublic DruidDataSource getDruidDataSource() {return new DruidDataSource();}
}

测试

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
// 获取此类型的Bean,查看类型
DBConfig dbConfig = ctx.getBean("DBConfig", DBConfig.class);
// 查看类型
System.out.println(dbConfig);
// com.liumingkai.config.DBConfig$$EnhancerBySpringCGLIB$$ef2610c5@5bfa9431
// 可以看到这是一个被代理后的类,不再是原先的类型了// 调用此Bean上被@Bean修饰的方法
// 此方法是被增强后的,每次都会返回Spring容器中的单例Bean
System.out.println(dbConfig.getDruidDataSource() == dbConfig.getDruidDataSource());
// true 证明此方法返回的是Spring容器中的单例Bean

总结

@Configuration修饰的类,本质上也是一个Bean

  • @Configuration中的proxyBeanMethods属性默认是true,意味着这个类会被代理,这个类中通过@Bean修饰的方法会被增强,调用这个方法时,会直接返回受Spring容器管理的Bean(Spring容器中的Bean默认都是单例的)
  • 而如果@Configuration中的proxyBeanMethods属性是false,那么此配置类就是一个普通的类,未被代理。因此调用被@Bean修饰的方法,就是一个普通的方法,每次调用都会返回一个新的对象
http://www.lryc.cn/news/101208.html

相关文章:

  • dp1,ACM暑期培训
  • 大厂程序员的水平比非大厂高很多嘛?
  • Java开发工具MyEclipse发布v2023.1.2,今年第二个修复版!
  • 基于正交滤波器组的语音DPCM编解码算法matlab仿真
  • VS2022和QT混合编程打包发布程序
  • Filebeat学习笔记
  • 【实战】 九、深入React 状态管理与Redux机制(一) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十六)
  • 第九十五回 如何使用dio的转换器
  • Python深度学习“四大名著”之一【赠书活动|第二期《Python机器学习:基于PyTorch和Scikit-Learn》】
  • RAID相关知识
  • DataStructure--Basic
  • Intellij IDEA 双击启动报错ClassNotFoundException: com.licel.b.z@
  • 使用 Logstash 及 enrich processor 实现数据丰富自动化
  • Django模板语法和请求
  • Android跨进程传大图思考及实现——附上原理分析
  • 【动态规划part13】| 300.最长递增子序列、674.最长连续递增序列、718.最长重复数组
  • QMainWindow
  • PV操作解决经典进程同步问题
  • 一文3000字从0到1使用Selenium进行自动化测试
  • 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v9.0版已发布
  • 交叉编译----宿主机x86 ubuntu 64位-目标机ARMv8 aarch64
  • 安防监控视频汇聚平台EasyCVR修改录像计划等待时间较长是什么原因?
  • 深度学习调参指南
  • MYSQL 优化常用方法
  • isp调试工具环境搭建及其介绍!
  • word显示书签并给书签添加颜色
  • Rust系列(四) trait备忘录(持续更新)
  • 贪心算法总结及其leetcode题目N道
  • k8s的namespace一直处于terminating的解法
  • JAVA面试总结-Redis篇章(六)——数据过期策略