- 如果
@Configuration(proxyBeanMethods = true)
代理对象调用方法。SpringBoot总会检查在容器中是否有这个组件。 - 如果
@Configuration(proxyBeanMethods = false)
代理对象调用方法。SpringBoot重新创建这个组件。 - 单实例适用于有依赖关系的场景下,因为有依赖关系要保持依赖类的实例是同一个实例。
- 多实例适用于没有依赖关系的场景下,因为没有依赖关系不用保持依赖类的实例是同一个实例。直接重新创建实例即可。
验证**User类依赖Employee类情况下获取单实例**:
@Configuration(proxyBeanMethods = true)
与@Configuration(proxyBeanMethods = false)
getUser()方法中从 User类 获取的 Employee类 的实例与 getEmployee()方法获取Employee类 自身实例,是否为同一个实例。
实现步骤:**
1、创建启动类:MainApplication
2、创建两个Bean类。Employee、User。
3、用注解@Configuration(proxyBeanMethods = true)与注解@Configuration(proxyBeanMethods = false)
创建配置文件类,并用@Bena
组件注解,创建Employee、User的方法组件,在User中注入Employee,使User依赖Employee。
4、启动类中。获取容器里面的Employee组件,获取User中Employee组件,比较地址值。true为单实例。false为多实例。启动启动类验证。如果
@Configuration(proxyBeanMethods = true)
获取两次Employee类的实例,判断两个实例都否相等,如果相等就是单实例。
第一步:创建启动类:MainApplication
第二步:创建两个普通类
package com.wzy.boot.bean;
public class Employee {
private String employeeName;
private Integer employeeId;
private Employee employee;
//有参与无参构造方法
//gettet与setter方法
}
package com.wzy.boot.bean;
import java.security.PrivateKey;
public class Employee {
private String employeeName;
private Integer employeeId;
//有参与无参构造方法
//gettet与setter方法
}
第三步:**用注解@Configuration(proxyBeanMethods = true)
与注解@Configuration(proxyBeanMethods = false)
创建配置文件类,并用@Bena
组件注解,创建Employee、User的方法组件,在User中注入Employee,使User依赖Employee。
_
package com.wzy.boot.config;
//@Configuration(proxyBeanMethods = true)
@Configuration(proxyBeanMethods = false)
public class MyConfig {
@Bean
public Employee getEmployee(){
return new Employee("工程部",05);
}
@Bean
public User getUser(){
User user = new User();
user.setName("张三");
user.setAge(25);
user.setEmployee(getEmployee());//通过set方法注入,依赖getEmployee()
return user;
}
}
第三步:通过启动类MyController 测试
@Configuration(proxyBeanMethods = false)
时:
判断 getUser() 方法中从 User类 获取的 Employee类 的实例与 getEmployee()方法获取Employee类 自身实例,是否为同一个实例。
结果为:false。故不能在有依赖情况下使用。
@Configuration(proxyBeanMethods = true)
时:
结果为:true。故能使用在有依赖情况下。
package com.wzy.boot;
/*@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.wzy.controller")*/
@SpringBootApplication(scanBasePackages = "com.wzy.boot") //这是一个SpringBoot应用
public class MainApplication {
public static void main(String[] args) {
//1.获取IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2.查看容器里的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//3.从容器中获取组件。
Employee employee3 = run.getBean("getEmployee", Employee.class);
User user2 = run.getBean("getUser", User.class);
System.out.println(user2.getEmployee() == employee3);
}
}