浦东做网站公司,黄浦集团网站建设,怀仁建设局网站,南昌市,做网站的公司Configuration的proxyBeanMethods属性
在Configuration注解中#xff0c;有两个属性#xff1a;
value配置Bean名称proxyBeanMethos#xff0c;默认是true
这个proxyBeanMethods的默认属性是true。
直接说#xff1a;当Configuration注解的proxyBeanMeathods属性是true…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$$ef2610c55bfa9431可以看到打印出来的类型不是DBConfig而是被代理后的类型DBConfig$$EnhancerBySpringCGLIB(可以看到这是CGLib代理出来的类因为JDK动态代理只能处理有接口的类而CGlib是通过继承的方式来做代理的
当设置proxyBeanMethos的属性是false时得到的就是此类型不再是代理类
System.out.println(ctx.getBean(DBConfig));
// com.liumingkai.config.DBConfig710726a3我们知道被Bean修饰的方法的返回对象会被注册进入Spring的容器中受Spring的管理
那将Configuration的proxyBeanMethods的属性设置为true会有什么好处呢 因为Configuration注解通常用来修饰配置类会在此类中配置大量的配置项或者用来对外提供Bean
该配置类中通过Bean来对外提供Bean的方法会被增强每次都会返回Spring容器管理的Bean
演示一下
例如在Configuration修饰的类在此类中有一个被Bean修饰的方法用来对外提供Bean。
我们获取到此类型的Bean后可以像普通方法一样来调用这个被Bean修饰的方法会得到返回的对象。
区别在于
当proxyBeanMethods属性为true时此类被代理方法得到增强那么我们每次通过此类型的Bean来调用Bean修饰的方法每次返回的都是Spring容器中的单例Bean当proxyBeanMethods属性是false时此类型的Bean就是一个普通的Bean未被代理那么每次调用Bean修饰的方法这都是一个普通的方法返回的都是新的普通的对象不是被Spring容器管理的对象
测试
例如
先来看当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.DBConfigf2ff811
// 就是普通的类型未被代理// 调用此Bean上被Bean修饰的方法
System.out.println(dbConfig.getDruidDataSource() dbConfig.getDruidDataSource());
// false 证明此方法就是普通的方法每次都会创建一个对象再来看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$$ef2610c55bfa9431
// 可以看到这是一个被代理后的类不再是原先的类型了// 调用此Bean上被Bean修饰的方法
// 此方法是被增强后的每次都会返回Spring容器中的单例Bean
System.out.println(dbConfig.getDruidDataSource() dbConfig.getDruidDataSource());
// true 证明此方法返回的是Spring容器中的单例Bean总结
被Configuration修饰的类本质上也是一个Bean
当Configuration中的proxyBeanMethods属性默认是true意味着这个类会被代理这个类中通过Bean修饰的方法会被增强调用这个方法时会直接返回受Spring容器管理的BeanSpring容器中的Bean默认都是单例的而如果Configuration中的proxyBeanMethods属性是false那么此配置类就是一个普通的类未被代理。因此调用被Bean修饰的方法就是一个普通的方法每次调用都会返回一个新的对象