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的理解

SpringBoot自动装配原理详解面试
Spring Boot自动装配原理详解

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方法的定义类,找到运行的主类

SpringBoot自动装配原理详解面试
Spring Boot自动装配原理详解