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底层注解内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!