欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關于Spring中的@Configuration中的proxyBeanMethods屬性

 更新時間:2023年07月31日 10:44:17   作者:秋天code  
這篇文章主要介紹了關于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的管理

那將@ConfigurationproxyBeanMethods的屬性設置為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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論