• 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容器中。
        
      




  • 相关阅读:
    [刘阳Java]_eayui-pagination分页组件_第5讲
    [刘阳Java]_easyui-draggable拖动组件_第4讲
    [刘阳Java]_easyui-panel组件入门级_第3讲
    [刘阳Java]_TortoiseSVN基础应用_第1讲
    [刘阳Java]_SpringMVC文件上传第2季_第11讲
    [刘阳Java]_Spring中IntrospectorCleanupListener的用途【补充】_第16讲
    使用fetch代替ajax请求 post传递方式
    react购物车demo
    react-redux异步数据操作
    redux模块化demo
  • 原文地址:https://www.cnblogs.com/gaojf/p/12941944.html
Copyright © 2020-2023  润新知