zoukankan      html  css  js  c++  java
  • SpringBoot自动装配原理详解面试

    Spring Boot自动装配原理详解

    主程序类,主入口类

    package com.kuang;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SpringbootStudyApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootStudyApplication.class, args);
        }
    
    }
    

    ​ @SpringBootApplication:spring boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(
        excludeFilters = {@Filter(
        type = FilterType.CUSTOM,
        classes = {TypeExcludeFilter.class}
    ), @Filter(
        type = FilterType.CUSTOM,
        classes = {AutoConfigurationExcludeFilter.class}
    )}
    )
    
    @SpringBootConfiguration:Spring Boot的配置类;

    ​ 标注在某个类上,表示这是一个SpringBoot的配置类;

    			@Configuration:配置类上标注这个注解;
    

    ​ 配置类-------配置文件:配置类也是容器中的一个组件;@Component

    @EnableAutoConfiguration:开启自动配置功能:

    ​ 以前我们需要配置的东西,SpringBoot帮我们自动配置:@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效

    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
    
    				@AutoConfigurationPackage自动配置包
    

    ​ @Import(AutoConfigurationPackages.Registrar.class):

    ​ Spring的底层注解@import,给容器导入一个组件,导入的组件由AutoConfigurationPackages.Registrar.class;

    ​ 将主配置类(@SpringBootApplication)标注的类的所在包以及下面所有子包里面的所有组件扫描导Spring容器

    				@Import(AutoConfigurationImportSelector.class):给容器导入组件
    

    ​ AutoConfigurationImportSelector:导入哪些组件的选择器;

    ​ 将所有需要导入的组件以全类名的方式返回;这些组件会被添加其中

    ​ 会给容器中导入非常多的自动配置类(xxxAutoConfiguration):就是给容器中导入这个场景需要的所有组件,并配置好这些组件

    有了自动配置类,免去了我们手动编写配置注入功能组等的工作

    ​ SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,beanClassLoader)

    ​ (loadFactoryNames)方法,用类加载器获取一个资源

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

    以前我们需要自己配置的东西,自动配置类帮我们做了

    1. SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
    2. 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
    3. 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
    4. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
    5. 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

    SpringBoot面试题

    谈谈你对SpringBoot的理解

    1.Spring的自动装配原理:Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,通过@Bean导入到Spring容器中,以Properties结尾命名的类是和配置文件进行绑定的。它能通过这些以Properties结尾命名的类中取得在全局配置文件中配置的属性,我们可以通过修改配置文件对应的属性来修改自动配置的默认值,来完成自定义配置

    2.run方法的作用

    1、推断应用的类型是普通的项目还是Web项目

    2、查找并加载所有可用初始化器 , 设置到initializers属性中

    3、找出所有的应用程序监听器,设置到listeners属性中

    4、推断并设置main方法的定义类,找到运行的主类

  • 相关阅读:
    Sqli-labs less 36
    python3操作mysql数据库增删改查
    python3连接MySQL数据库
    修改(python) mysql 数据库 使其可以支持插入中文
    十九 Django框架,发送邮件
    十八 Django框架,生成二维码
    十七 Django框架,文件上传
    十六 Django框架,信号
    十五 Django框架,缓存
    十四 Django框架,中间件
  • 原文地址:https://www.cnblogs.com/cxxxxxx/p/13417469.html
Copyright © 2011-2022 走看看