proxyBeanMethods = false 代表关闭代理
proxyBeanMethods = true 代表开启cglib代理
proxyBeanMethods = true 或不写,是Full模式
proxyBeanMethods = false 是lite模式
一般@Configuration配置类里面,含有带有@Bean的对象。
看了很多博客说proxyBeanMethods = true的时候,得到的对象是同一个。而proxyBeanMethods = false对象则非同一个。为此有了疑问,当@Bean配置了@Scope时,会怎样。
注:teacher1 和 teacher2 是 ApplicationContext.getConfig.getTeacher()得到的
bean1 和 bean2 是 ApplicationContext.getBean(Teacher.class) 得到的
1)proxyBeanMethods = true ,@Scope("singleton");返回同一个对象
2)proxyBeanMethods = true ,@Scope("prototype");返回四个对象
3)proxyBeanMethods = false,@Scope("singleton");返回三个对象
4)proxyBeanMethods = false,@Scope("prototype");返回四个对象
主方法:
package com.irving;
import com.irving.config.TestConfig;
import com.irving.entity.Teacher;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(HelloApplication.class, args);
TestConfig bean = run.getBean(TestConfig.class);
Teacher teacher1 = bean.getTeacher();
System.out.println("teacher1:"+teacher1);
Teacher teacher2 = bean.getTeacher();
System.out.println("teacher2:"+teacher2);
Teacher bean1 = run.getBean(Teacher.class);
System.out.println("bean1:"+bean1);
Teacher bean2 = run.getBean(Teacher.class);
System.out.println("bean2:"+bean2);
}
}
config类
package com.irving.config;
import com.irving.entity.Teacher;
import com.irving.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
/**
* @author zdq
* @version 1.0
* @date 2022/4/13 0:22
* @describe
*/
@Configuration(proxyBeanMethods = trur)
public class TestConfig {
@Bean
@Scope("singleton")
public Teacher getTeacher(){
return new Teacher();
}
}