少学习多摸鱼

day129--springboot -- 底层@Configuration详解

springboot -- 底层@Configuration详解

配置类标注@Configuration其本身也是一个组件

@Configuration//告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {}

配置类中给方法标注@Bean给容器注册组件,注册的组件默认是单实例的

给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例

@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {

   /**
    * Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
    * @return
    */
   @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
   public User user01(){
       User zhangsan = new User("zhangsan", 18);
       //user组件依赖了Pet组件
       zhangsan.setPet(tomcatPet());
       return zhangsan;
  }

   @Bean("tom")
   public Pet tomcatPet(){
       return new Pet("tomcat");
  }
}

新增的proxyBeanMethods

是一个代理bean的方法

Full(proxyBeanMethods = true)(保证每个@Bean方法被调用多少次返回的组件都是单实例的)(默认)

Lite(proxyBeanMethods = false)(每个@Bean方法被调用多少次返回的组件都是新创建的)

Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象

测试

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
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、从容器中获取组件
       Pet tom01 = run.getBean("tom", Pet.class);
       Pet tom02 = run.getBean("tom", Pet.class);
       System.out.println("组件:"+(tom01 == tom02));

   //4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892
       MyConfig bean = run.getBean(MyConfig.class);
       System.out.println(bean);

   //如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。
       //保持组件单实例
       User user = bean.user01();
       User user1 = bean.user01();
       System.out.println(user == user1);

       User user01 = run.getBean("user01", User.class);
       Pet tom = run.getBean("tom", Pet.class);

       System.out.println("用户的宠物:"+(user01.getPet() == tom));
  }
}

注意

配置类组件之间无依赖关系时使用Lite模式加速容器启动过程,减少判断

配置类组件之间有依赖关系,方法会被调用得到之前的单实例组件,使用Full模式,默认情况下是此模式

posted @ 2023-11-04 21:53  北海之上  阅读(53)  评论(0)    收藏  举报
/* 粒子吸附*/