• springboot核心注解以及自动装配原理


    1. springboot的核心注解

     

    @SpringBootApplication,其中又包含以下三个注解:

    @SpringBootConfiguration:Spring Boot的配置类;标注在某个类上,表示这是一个Spring Boot的配置类;@Configuration:配置类上来标注这个注解;
    配置类 ----- 配置文件;配置类也是容器中的一个组件;@Component
    @EnableAutoConfiguration:开启自动配置功能;
    以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置,会帮我们自动去加载 自动配置类
    @ComponentScan : 扫描包 相当于在spring.xml 配置中 但是并没有指定basepackage,如果没有指定,spring底层会自动扫描当前配置类所有在的包

    其中最重要的就是@EnableAutoConfiguration,

    @AutoConfigurationPackage     
    @Import({AutoConfigurationImportSelector.class})

    源码中可以看到,在@EnableAutoConfiguration注解内使用到了@import注解来完成导入配置的功能,而EnableAutoConfigurationImportSelector 实现了DeferredImportSelectorSpring内部在解析@Import注解时会调用getAutoConfigurationEntry方法;

    getAutoConfigurationEntry方法进行扫描具有META-INF/spring.factories文件的jar包。

    1. protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
    2. if (!this.isEnabled(annotationMetadata)) {
    3. return EMPTY_ENTRY;
    4. } else {
    5. AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
    6. List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
    7. configurations = this.removeDuplicates(configurations);
    8. Set exclusions = this.getExclusions(annotationMetadata, attributes);
    9. this.checkExcludedClasses(configurations, exclusions);
    10. configurations.removeAll(exclusions);
    11. configurations = this.getConfigurationClassFilter().filter(configurations);
    12. this.fireAutoConfigurationImportEvents(configurations, exclusions);
    13. return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
    14. }
    15. }

     


    自动装配原理

    自动装配与核心注解密不可分

    @EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(...)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中;

  • 相关阅读:
    React创建一个脚手架-以类组件的方式实现一个CRUD项目
    spring的redis注解@Cacheable @Cacheput @CacheEvict的condition、unless
    服务器有哪些用途呢
    uniapp 开发微信小程序 出现启用组件按需注入问题如何解决
    优雅解决spring事务中异步发送MQ,Redis,RPC
    Chromium 消息循环和线程池详解
    mysql日志管理 、备份与恢复
    90道Python面试题,做对80%直击年薪40w
    springboot2.X整合mybatis使用joda时间格式变量完成插入操作
    编程,不止有代码,还有艺术
  • 原文地址:https://blog.csdn.net/Learning_foolish/article/details/126677300