在Spring Boot中,自动装配是一种强大的功能,它允许开发者快速、简单地配置和管理应用程序的组件。以下是对Spring Boot自动装配原理的详细解释:
-
Spring BootApplication注解源码:
-
@SpringBootApplication注解是一个复合注解,它包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan扫描三个注解。
-
@SpringBootConfiguration:表示当前类是一个配置类,通过@Configuration与@Bean结合,可以将Bean注册到IoC容器。
-
@EnableAutoConfiguration:一旦加上此注解,那么将会开启自动装配功能。Spring会试图在项目的classpath下找到所有配置的Bean然后进行装配。
-
@ComponentScan:用于指定Spring容器扫描的包路径,让Spring容器自动识别并加载所需的组件。
-
-
自动装配的核心:
-
一切的开始都是从SpringApplication.run()方法开始的。这是自动装箱的核心,即这个run方法的执行过程。创建Bean之前的准备工作是必要的。
-
SpringApplication.run()方法需要传入两个参数,第一个参数就是启动类本身,用于在之后解析启动类(解析标记的注解、启动类作为一个配置类,也需要解析),后面那个args是传入的虚拟机参数。
-
-
解析启动类:
-
在SpringApplication.run()方法中,首先解析启动类。解析过程中会解析启动类上的注解,如@SpringBootApplication等。解析后的结果会被用于创建IoC容器。
-
-
自动装配的过程:
-
当Spring Boot应用程序启动时,IoC容器会根据@EnableAutoConfiguration注解自动配置Bean。容器会扫描classpath下的所有Bean,并根据条件判断是否需要进行自动装配。
-
自动装配时,容器会根据Bean之间的依赖关系,自动将需要的Bean注入到相应的Bean中。这大大简化了配置工作,并提高了开发效率。
-
-
循环依赖问题:
-
在自动装配过程中,可能会出现循环依赖的问题。例如,Bean A依赖于Bean B,同时Bean B也依赖于Bean A。为了避免这种情况,开发者需要合理设计组件之间的依赖关系,或者使用其他方式解决循环依赖问题。
-
-
自定义自动装配:
-
在某些情况下,开发者可能需要自定义自动装配的规则。这时可以使用@Autowired注解进行自定义装配规则的配置。例如,可以指定装配的Bean类型、名称等。
-
-
总结:
Spring Boot的自动装配功能大大简化了配置工作,提高了开发效率。开发者需要了解其原理和注意事项,以便更好地利用这一功能。同时,也需要合理设计组件之间的依赖关系,避免出现循环依赖等问题。
面试官问: 说说springboot自动装配的原理?
我需要说:
主配置类启动,通过@SringBootApplication 中的@EnableAutoConfguration 加载所需的所 有自动配置类,然后自动配置类生效并给容器添加各种组件。那么@EnableAutoConfguration 其实是通过它里面的@AutoConfigurationPackage 注解,将主配置类的所在包皮下面所有子包 里面的所有组件扫描加载到 Spring 容器中; 还通过@EnableAutoConfguration面的 AutoConfigurationImportSelector 选择器中的 SringFactoriesLoader.loadFactoryNames()方法,获取类路径下的 META-INF/spring.factories 中的 资源并经过一些列判断之后作为自动配置类生效到容器中,自动配置类生效后帮我们进行自 动配置工作,就会给容器中添加各种组件:这些组件的属性是从对应的 Properties 类中获取 的,这些 Properties 类里面的属性又是通过@ConfigurationProperties 和配置文件绑定的:所以 我们能配置的属性也都是来源于这个功能的 Properties 类。SpringBoot 在自动配置很多组件 的时候,先判断容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置 的,如果没有,才自动配置;如果有些组件可以有多个就将用户配置和默认配置的组合起来