zoukankan      html  css  js  c++  java
  • SpringBoot---自动配置原理

    SpringBoot项目无需各种配置文件,一个main方法,就能把项目启动起来。那么我们看看SpringBoot是如何进行自动配置和启动的。

    先看下图的SpringBoot项目的启动类

    SpringBoot程序能够实现自动配置主要来源于@SpringBootApplication注解,这个注解是个复合注解,其中有三个注解是比较重要的:

    1.@SpringBootConfiguration注解

       这个注解的底层是一个@Configuration注解,表明这是一个配置类,支持JavaConfig的方式来进行配置;

    2.@ComponentScan注解(扫描注解)

      默认扫描当前类所在的包及其子包下包含的注解,将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中;

    3.@EnableAutoConfiguration注解

       字面意思为启动自动装配,里面包含两个比较重要的注解@AutoConfigurationPackage和@Import。

    再看一下@AutoConfigurationPackage注解和@Import注解

     

    1.@AutoConfigurationPackage注解

       此注解和@ComponentScan一样,也是将主配置类所在的包及其子包里面的组件扫描到IOC容器中。

       区别是@AutoConfigurationPackage扫描@Enitity、@MapperScan等第三方依赖的注解。

       @ComponentScan只扫描@Controller/@Service/@Component/@Repository等常见注解。两个注解扫描的对象是不一样的。

    2.@Import(AutoConfigurationImportSelector.class)注解

       此注解是自动装配的核心注解,其导入的AutoConfigurationImportSelector类中有个selectImports方法,

       selectImports()方法通过 SpringFactoriesLoader.loadFactoryNames()来扫描所有具有目录为META-INF/spring.factories的jar包。

    spring-boot-autoconfigure-x.x.x.x.jar里就有一个在META-INF目录下的spring.factories文件。

    spring.factories文件由一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,

    而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔。

      @EnableAutoConfiguration注解通过@SpringBootApplication注解被间接的标记在了SpringBoot的启动类上,springboot项目启动时,SpringApplicaton.run方法的内部就会执行selectImports方法,进而找到所有JavaConfig配置类全限定名对应的class,然后将所有自动配置类加载到IOC容器中。

      SpringBoot不需要写配置文件的原因是,SpringBoot所有配置都是在启动的时候进行扫描并加载,SpringBoot的所有自动配置类都在Spring.factories里面,但是不一定会生效,生效前要判断条件是否成立,只要导入了对应的start,就有对应的启动器,有了启动器就能帮我们进行自动配置类

    我话讲完!谁赞成?谁反对?
  • 相关阅读:
    网页特效代码
    禁止直接在浏览器输入网址访问的代码
    javaScriptalert使用方法
    URL中特殊字符的含义
    Predator:比微软Kinect更强的视频追踪算法来自捷克博士论文(转)
    干净简洁的CSS表单设计实例
    javascript IP 正则表达
    开发者最容易犯的13个JavaScript错误(转)
    一个帮助你处理延迟,重复,循环操作的jQuery插件 timing
    【简报】微软Metro/win8风格的web开发框架 BootMetro
  • 原文地址:https://www.cnblogs.com/wffzk/p/14793450.html
Copyright © 2011-2022 走看看