關于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動態(tài)代理只能處理有接口的類,而CGlib是通過繼承的方式來做代理的)
當設置proxyBeanMethos
的屬性是false時,得到的就是此類型,不再是代理類
System.out.println(ctx.getBean("DBConfig")); // com.liumingkai.config.DBConfig@710726a3
我們知道,被@Bean
修飾的方法的返回對象,會被注冊進入Spring的容器中,受Spring的管理
那將@Configuration
的proxyBeanMethods
的屬性設置為true
會有什么好處呢?因為@Configuration
注解通常用來修飾配置類,會在此類中配置大量的配置項或者用來對外提供Bean
該配置類中通過@Bean
來對外提供Bean的方法會被增強,每次都會返回Spring容器管理的Bean
演示一下
例如:在@Configuration
修飾的類,在此類中有一個被@Bean
修飾的方法,用來對外提供Bean。
我們獲取到此類型的Bean后,可以像普通方法一樣來調用這個被@Bean
修飾的方法,會得到返回的對象。
區(qū)別在于:
- 當
proxyBeanMethods
屬性為true時,此類被代理,方法得到增強,那么我們每次通過此類型的Bean來調用@Bean
修飾的方法,每次返回的都是Spring容器中的單例Bean - 當
proxyBeanMethods
屬性是false時,此類型的Bean就是一個普通的Bean,未被代理,那么每次調用@Bean
修飾的方法,這都是一個普通的方法,返回的都是新的普通的對象,不是被Spring容器管理的對象
測試
例如;
先來看,當proxyBeanMethods
為false時
@Configuration(proxyBeanMethods = false) public class DBConfig { @Bean public 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 證明此方法就是普通的方法,每次都會創(chuàng)建一個對象
再來看proxyBeanMethods
為true的情況
@Configuration public class DBConfig { @Bean public 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
修飾的方法,就是一個普通的方法,每次調用都會返回一個新的對象
到此這篇關于關于Spring中的@Configuration中的proxyBeanMethods屬性的文章就介紹到這了,更多相關Spring proxyBeanMethods屬性內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot使用過濾器、攔截器和監(jiān)聽器的案例代碼(Springboot搭建java項目)
這篇文章主要介紹了SpringBoot使用過濾器、攔截器和監(jiān)聽器(Springboot搭建java項目),本文是基于Springboot搭建java項目,結合案例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02Java中I/O流讀取數(shù)據(jù)不完整的問題解決
本文主要介紹了ava中I/O流讀取數(shù)據(jù)不完整的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05基于java SSM springboot實現(xiàn)景區(qū)行李寄存管理系統(tǒng)
這篇文章主要介紹了基于java SSM springboot實現(xiàn)的景區(qū)行李寄存管理系統(tǒng),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08業(yè)務系統(tǒng)的Prometheus實踐示例詳解
這篇文章主要為大家介紹了業(yè)務系統(tǒng)的Prometheus實踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04