SpringBoot2核心技术与响应式编程——容器功能

1、组件添加

1.1、@Configuration

  • 基本使用
  • Full模式与Lite模式
    • 示例
    • 实践
      • 配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断。
      • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

配置类:

 1 /**
 2  * 1. @Configuration 告诉SpringBoot这是一个配置类
 3  * 2. @Bean 配置类中使用@Bean标注在方法上给容器注册组件,默认为单实例
 4  * 3. proxyBeanMethods:代理Bean方法
 5  *     3.1 Full(proxyBeanMethods = true) 保证每个@Bean方法被调用多少次返回的组件都是单实例的
 6  *     3.2 Lite(proxyBeanMethods = false) 每个@Bean方法被调用多少次返回的组件都是新创建的
 7  *     组件依赖必须使用Full模式。其他默认是否则使用Lite模式
 8  * 4.适用场景
 9  *      4.1 组件依赖
10  */
11 @Configuration(proxyBeanMethods = true)
12 public class MyConfig {
13 
14     /**
15      * @Bean 向容器中添加组件,以方法名作为组件id,返回类型为组件类型,返回的值,就是组件在容器中的实例
16      * 外部无论对配置类中的这个组件注册方法注册多少遍,获取的都是之前注册到容器中的单实例
17      * @return
18      */
19     @Bean
20     public User userA(){
21         return new User("zhangsan", 3);
22     }
23 
24     @Bean("tom")
25     public Pet tomcatPet() {
26         return new Pet("tomcat");
27     }
28 }

配置类测试

/**
 * 称为主程序类
 * 告诉SpringBoot这是一个SpringBoot应用
 */
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        //1.返回IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        //2.查看容器里的组件
        String[] beanDefinitionNames = run.getBeanDefinitionNames();

        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println("组件名称: " + beanDefinitionName);
        }

        //3.从容器中获取组件
        Pet tom01 = run.getBean("tom", Pet.class);
        Pet tom02 = run.getBean("tom", Pet.class);
        System.out.println("tom01等于tom02吗? " + (tom01 == tom02));

        //4. cn.mxz.boot.config.MyConfig$$EnhancerBySpringCGLIB$$b24b3179@1d8e2eea
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println("MyConfig组件: " + bean);

        /**
         * 1.如果@Configuration(proxyBeanMethods = true)代理对象调用方法,SpringBoot总会检查这个组件是否已经存在于容器中,
         * 要保持组件的单实例
         */
        User user = bean.userA();
        User user1 = bean.userA();
        System.out.println("user等于user1吗? " + (user == user1));

    }
}
======控制台输出======
......
组件名称: org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
组件名称: characterEncodingFilter
组件名称: localeCharsetMappingsCustomizer
组件名称: org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
组件名称: multipartConfigElement
组件名称: multipartResolver
组件名称: spring.servlet.multipart-org.springframework.boot.autoconfigure.web.servlet.MultipartProperties
组件名称: org.springframework.aop.config.internalAutoProxyCreator
tom01等于tom02吗? true
MyConfig组件: cn.mxz.boot.config.MyConfig$$EnhancerBySpringCGLIB$$b24b3179@1d8e2eea
user等于user1吗? true

 

======未完待续======

上一篇:SpringBoot web开发


下一篇:客户端创建queue并绑定exchange呢?fanout模式就是大名鼎鼎