美文网首页
spring -boot 学习笔记之AutoConfig

spring -boot 学习笔记之AutoConfig

作者: linking12 | 来源:发表于2016-01-20 11:50 被阅读4434次

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

    Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。

    spring-boot的自动配置

    在Spring Boot项目中,xxxApplication.java会作为应用程序的入口,负责程序启动以及一些基础性的工作。@SpringBootApplication是这个注解是该应用程序入口的标志,然后有熟悉的main函数,通过SpringApplication.run(xxxApplication.class, args)来运行Spring Boot应用。

    使用:

    @SpringBootApplication
    public class HelloSpringBoot {
    
        public static void main(String[] args) throws Exception {
            SpringApplication app = new SpringApplication(HelloSpringBoot.class);
            app.addListeners(new ApplicationStartedEventDemo());
            app.run(args);
        }
    }
    

    原理

    @Configuration
    @EnableAutoConfiguration
    @ComponentScan
    public @interface SpringBootApplication 
    

    从代码来看,SpringBootApplication只是把几个注解糅合在一起

    • @Configuration 说明该类是spring的一个配置文件,如同xml的beans
    • @EnableAutoConfiguration springboot新加的一个注解,将spring的@Enable***系列注解全部包含进来而无需开发者显式声明
    • @ComponentScan 组件扫描,使用了该注解下的类所在的路径,包含子路径都进行组件扫描
      所以最终实现自动配置的就是@EnableAutoConfiguration这个注解,其源码如下:
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(EnableAutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
    
        /**
         * Exclude specific auto-configuration classes such that they will never be applied.
         * @return the classes to exclude
         */
        Class<?>[] exclude() default {};
    
        /**
         * Exclude specific auto-configuration class names such that they will never be
         * applied.
         * @return the class names to exclude
         * @since 1.3.0
         */
        String[] excludeName() default {};
    
    }
    

    EnableAutoConfigurationImportSelector:
    使用的是spring-core模块中的SpringFactoriesLoader#loadFactoryNames()方法,它的作用是在类路径上扫描META-INF/spring.factories文件中定义的类:

    # Initializers
    org.springframework.context.ApplicationContextInitializer=\
    org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
    
    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
    org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
    

    注意:
    @Import 与xml配置方式下的作用一样。支持导入的类型有:

    • 一个或多个拥有 @Configuration 注解的配置类
    • ImportSelector 接口的实现类
    • ImportBeanDefinitionRegistrar 的实现类

    <blockquote>
    <p>如果Import注解中Class为ImportSelector子类,通过invokeAwareMethods(selector)设置aware值,如果类型为DeferredImportSelector则添加到deferredImportSelectors集合中,待前面的parser.parse(configCandidates)
    方法中processDeferredImportSelectors()处理;如果不是,则执行selectImports方法,将获取到的结果递归调用processImports,解析selectImports得到的结果</p>
    <p>如果Import注解中Class为ImportBeanDefinitionRegistrar子类,则添加到importBeanDefinitionRegistrars中,注意该部分的数据在执行完parser.parse(configCandidates)后调用this.reader.loadBeanDefinitions(configClasses)解析,否则执行配置信息的解析操作。</p>
    </blockquote>

    相关文章

      网友评论

          本文标题:spring -boot 学习笔记之AutoConfig

          本文链接:https://www.haomeiwen.com/subject/jxklkttx.html