SpringBoot配置类的proxyBeanMethods

5/26/2021 SpringBoot

​ 在spring boot2中,@configuration注解多了一个属性,叫proxyBeanMethods。这个属性默认是true的。

​ 这个属性是并不是决定容器中的组件是单例还是多例的。如果说他是true,就是单例。如果说是false,但却不是多例。当他为true的时候,我们在容器中获取到的对象总是同一个,即便是我们调用了创建对象的方法,那获取到的还是同一个。但是当是多例的时候,如果我们调用了创建对象的方法,那就不是同一个了。但是我们如果是用getBeans方法去获取的话,那样还是单例的,我们得到的还是同一个对象。

@Configuration(proxyBeanMethods = true) //告诉springboot这是一个配置类 == 配置文件
public class MyConfig {
    /*
    在外部无论对配置类中的这个组件注册方法调用多少次
    获取的都是之前注册容器中的单实例对象
     */
    @Bean//给容器中添加组件,以方法名作为组件的id,返回类型就是组件类型,返回的值,就是组件在容器中的实例
    public User user01(){
        return new User("zhangsan",18);
    }
    @Bean("tom")
    public Pet tomcat(){
        return new Pet("tomcat");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

​ 实际上就是这个属性的字面意思:==代理bean方法==,如果为true的时候,Springboot会在IOC容器中采用cglib的方式代理这个配置类,也就是说这个配置类有一个实例对象,为了保证每个组件的单实例性,在调用配置类函数时会被拦截判断是否存在该实例,所以无论怎么调用配置类的中的函数得到的返回对象都为同一个,但当为false时,IOC容器中就不会有这样一个配置类实例,调用配置类的方法时就是真的在调用该方法,而就会返回一个普通的对象了。

​ 所以当为true时被称为full模式,且当有组件依赖时,必须采用full模式(为了保证组件是单实例的),其他则被称为Lite模式。