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
======未完待续======