• 如果@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
    image.png

    第二步:创建两个普通类
    image.png

    1. package com.wzy.boot.bean;
    2. public class Employee {
    3. private String employeeName;
    4. private Integer employeeId;
    5. private Employee employee;
    6. //有参与无参构造方法
    7. //gettet与setter方法
    8. }
    1. package com.wzy.boot.bean;
    2. import java.security.PrivateKey;
    3. public class Employee {
    4. private String employeeName;
    5. private Integer employeeId;
    6. //有参与无参构造方法
    7. //gettet与setter方法
    8. }


    第三步:**用注解@Configuration(proxyBeanMethods = true)与注解@Configuration(proxyBeanMethods = false)创建配置文件类,并用@Bena组件注解,创建Employee、User的方法组件,在User中注入Employee,使User依赖Employee。
    image.png_

    1. package com.wzy.boot.config;
    2. //@Configuration(proxyBeanMethods = true)
    3. @Configuration(proxyBeanMethods = false)
    4. public class MyConfig {
    5. @Bean
    6. public Employee getEmployee(){
    7. return new Employee("工程部",05);
    8. }
    9. @Bean
    10. public User getUser(){
    11. User user = new User();
    12. user.setName("张三");
    13. user.setAge(25);
    14. user.setEmployee(getEmployee());//通过set方法注入,依赖getEmployee()
    15. return user;
    16. }
    17. }

    第三步:通过启动类MyController 测试

    • @Configuration(proxyBeanMethods = false)时:

    判断 getUser() 方法中从 User类 获取的 Employee类 的实例与 getEmployee()方法获取Employee类 自身实例,是否为同一个实例。
    结果为:false。故不能在有依赖情况下使用。

    • @Configuration(proxyBeanMethods = true)时:

    结果为:true。故能使用在有依赖情况下。

    1. package com.wzy.boot;
    2. /*@SpringBootConfiguration
    3. @EnableAutoConfiguration
    4. @ComponentScan("com.wzy.controller")*/
    5. @SpringBootApplication(scanBasePackages = "com.wzy.boot") //这是一个SpringBoot应用
    6. public class MainApplication {
    7. public static void main(String[] args) {
    8. //1.获取IOC容器
    9. ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
    10. //2.查看容器里的组件
    11. String[] names = run.getBeanDefinitionNames();
    12. for (String name : names) {
    13. System.out.println(name);
    14. }
    15. //3.从容器中获取组件。
    16. Employee employee3 = run.getBean("getEmployee", Employee.class);
    17. User user2 = run.getBean("getUser", User.class);
    18. System.out.println(user2.getEmployee() == employee3);
    19. }
    20. }