目录 1. @Configuration 2. @bean 3. @Import 4. @Conditional条件装配 5. 配置绑定 SpringBoot自动配置原理(源码分析) 1. @Configuration 放在类前注释 用于表示配置类,配置类也是一个组件 @Configuration(
目录
- 1. @Configuration
- 2. @bean
- 3. @Import
- 4. @Conditional条件装配
- 5. 配置绑定
- SpringBoot自动配置原理(源码分析)
1. @Configuration
—— 放在类前注释 用于表示配置类,配置类也是一个组件
@Configuration(proxyBeanMethods = true) // 配置类 == 配置文件 public class MyConfig { }
通过 proxyBeanMethods 很好的解决了组件依赖的问题 ——
- 只是注册组件,组件间无依赖(false)
- 有组件依赖(true)
测试组件依赖及测试类本身是组件
// 配置类本身也是一个组件 MyConfig bean = run.getBean(MyConfig.class); System.out.println(bean); run.getBean("user01", User.class); run.getBean("tom", Pet.class); System.out.println("用户的宠物是不是容器中的宠物" + (user01.getPet() == tom01));
2. @bean
—— 放在方法前表示给容器中注册组件 (单实例)
注:目前我对容器、组件的理解有限, 后期如果有更深入的理解,会更新此处
@Bean // 给容器中添加组件,方法名作为组件id, 返回类型是组件类型 , 返回的值是组件在容器中的实例 public User user01(){ User zangsan = new User("zangsan", 18); zangsan.setPet(tomcatPet()); return zangsan; }
测试是否注册成功
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); // 查看容器里的组件 String[] names = run.getBeanDefinitionNames(); for(String s: names){ System.out.println(s); }
3. @Import
—— 放在配置类前,用于导入组件
@Import({User.class, DBHelper.class}) // 给容器中自动创建出这两个类型的组件 @Configuration // 配置类 == 配置文件 public class MyConfig { }
测试导入组件是否成功
DBHelper bean1 = run.getBean(DBHelper.class);
4. @Conditional条件装配
—— 用于注册组件需要特定条件的情况
例如: 用户需要宠物,若无宠物tom组件,不能注册用户组件
@ConditionalOnBean(name = "tom") // 表示有 tom 组件才能注册 user01 组件 @Bean // 给容器中添加组件,方法名作为组件id, 返回类型是组件类型 , 返回的值是组件在容器中的实例 public User user01(){ User zangsan = new User("zangsan", 18); zangsan.setPet(tomcatPet()); return zangsan; }
测试
System.out.println("容器中是否含有宠物组件" + run.containsBean("tom")); System.out.println("容器中是否含有用户组件" + run.containsBean("user01"));
5. 配置绑定
绑定核心配置文件 (application.properities)
方法一:
@Component // 将组件加到容器中 @ConfigurationProperties(prefix = "mycar") // 配置属性名
方法二:
// 功能一:开启Car的属性配置 // 功能二:把指定的组件导入容器中 @EnableConfigurationProperties(Car.class)
测试类:
@Autowired Car car; @RequestMapping("/car") public Car car(){ System.out.println(car); return car; }
SpringBoot自动配置原理(源码分析)
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration // 当前是一个配置类 @EnableAutoConfiguration @ComponentScan( // 指定扫描那些Spring注解 excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} )
@EnableAutoConfiguration
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage //——@Import({AutoConfigurationPackages.Registrar.class}) @Import({AutoConfigurationImportSelector.class})
核心注解1:
@AutoConfigurationPackage 利用Registrar给容器中批量注册组件
—— 将指定包下的组件批量导入 (MainAppliaction 包下)
核心注解2
@Import({AutoConfigurationImportSelector.class})
—— 利用 getAutoConfigurationEntry() 方法给容器中批量导入组件
配置类位置
总结: SpringBoot 所有自动配置全部加载, 按照条件装配 —— 导入相关场景才能生效
- springboot 加载所有自动配置类, 按条件生效 —— 生效的配置类为容器中装配组件(默认绑定配置文件中的值)
- 用户有自己配置的组件, 以用户的为先
- 定制化配置 —— 自己替换底层组件 / 修改底层组件配置文件中的值
到此这篇关于SpringBoot底层注解超详细介绍的文章就介绍到这了,更多相关SpringBoot底层注解内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!