SpringBoot的自动装配机制

1,基于你对于Springboot的理解,描述一下什么是Springboot?

    springboot框架是为了能够帮助spring开发者快速高效的构建一个基于spring框架及spring生态体系的应用的解决方案,它是对“约定优于配置”这个理念下的一个最佳实现方案,因此它是一个服务于框架的框架,服务的范围是简化配置文件。

2,约定优于配置指的是什么?

    (1),maven目录:默认打包方式为jar,默认新建好了resources资源文件夹
    (2),spring-boot-web-start:包含了webmvc相关的依赖以及内嵌了tomcat容器,使得构建一个web应用更加简单
    (3),默认提供了application.properties/yml文件
    (4),默认通过spring.profiles.active属性来决定运行环境时读取的配置文件
    (5),EnableAutoConfiguration默认对于依赖的start进行自动装配

3,@SpringBootApplication由哪几个注解组成,这几个注解分别表示什么作用?

    (1),Configuration:将一个类申明为一个IoC容器配置类,该类中任何标注了@Bean的方法,它的返回值都会作为Bean定义注册到Spring容器中,方法名默认称为这个Bean的id
    (2),ComPonentScan:默认扫描当前包下的被@Component、@Repository、@Service、@Controller标识的类到IoC容器中。
    (3),EnableAutoConfiguration:帮助springboot将所有符合条件的configuration配置加载到springboot创建的IoC容器中。其实这里借助了spring框架提供的一个工具类:SpringFactoriesLoader的支持,以及用到了spring提供的条件注解Conditional
    分析:我们发现它有一个Import注解,那么这个注解是干嘛的呢?
            第一:基于普通的Bean或者带有Configuration注解的Bean进行注入
            第二:实现ImportSelector接口进行动态注入
            第三:实现ImportBeanDefinitionRegistrar接口进行动态注入


4,springboot自动装配的实现原理

    我理解的自动装配是:其实EnableAutoConfiguration上有个Import注解,这个注解里面包含了一个实现了ImportSelector的类,在它里面的selectImports方法可以选择注入需要的Bean,
    分析塔源码可以看到,
    第一步:扫描META-INF/spring-autoconfigure-metadata.properties文件,它里面定义了很多的Conditional条件,例如ConditionalOnClass
    第二部:扫描META-INF/spring.factories,结合前面扫描到的进行过滤,原因是很多@Configuration其实是依托于其它的框架来加载的,如果当前classpath下没有相关的依赖,则意味着这些类没必要加载,所以通过这种条件过滤可以有效的减少@Configuration类的数量从而降低启动时间。

5,springboot中的spi机制的原理

    很多开源框架库里都直接或间接使用了Java 的SPI机制。比如Spring就有类似的SPI机制,通过SpringFactoriesLoader代替JDK中ServiceLoader,通过META-INF/spring.factories文件代替META-INF/service目录下的描述文件,具体实现步骤不同,但原理都是使用Java 的反射机制。META-INF/spring.factories文件,根据key来加载对应的类到springIoC容器中。
    
  




posted @ 2020-05-23 12:12  gnice512  阅读(3349)  评论(0编辑  收藏  举报