自动配置原理
- 在运行SpringBoot项目启动类(@SpringBootApplication标注启动类)启动SpringBoot项目时,@SpringBootApplication是一个混合注解,包括
- @SpringBootConfiguration()标识该类是一个配置类,其中可以定义一些Bean的配置信息。
- @EnableAutoConfiguration(启用自动配置功能,默认条件下,Spring Boot会根据项目的依赖和配置信息,自动配置相应的组件和功能。该注解会自动加载启动类所在包及其子包定义的所有的自动配置类)
- @ComponentScan(启用组件扫描,默认条件下,Spring Boot会自动扫描并注册启动类所在包及其子包带有@Component、@Controller、@Service、@Repository等注解的Bean。)
存在问题
- 在上述的描述中可以发现,如果一个SpringBoot项目添加了一个第三方依赖(在pom.xml文件中天添加),默认情况下(注解作用范围默是启动类所在包及其子包),是无法将该依赖jar包中的bean以及配置类加载到当前SpringBoot项目的IOC容器中的。
解决方案
-
方案一
- @ComponentScan组件扫描
- 在启动类上加入该注解,设置要扫描的包(注意默认扫描的包会被覆盖)
- 不建议使用,因为一个SpringBoot项目会使用到非常多第三方依赖,一一添加扫描的包繁琐且不现实
-
package com.example.tlias; import org.dom4j.io.SAXReader; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.stereotype.Component; // Generated by https://start.springboot.io // 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn @ServletComponentScan // todo 使当前项目于支持Servlet组件,Filter组件属于Servlet @SpringBootApplication @ComponentScan({"com.example.tlias","com.ithema"}) public class TliasApplication { public static void main(String[] args) { SpringApplication.run(TliasApplication.class, args); } }
- @ComponentScan组件扫描
-
方案二
- @Import导入
- 使用@Import导入的类会被Spring加载到IOC容器中,成为bean对象,导入形式主要有以下几种:
- 导入普通类
- 导入配置类
- 导入ImportSelector接口实现类
- 在自定义的该实现类中可以设置要交个IOC容器管理的bean对象和配置类
- 在引入的第三方依赖中,一般会自动定义一个注解类(一般叫@Enablexxxx注解,并且封装了@Import注解)设置在该依赖中哪些bean和配置类需要注入到IOC容器中,所以我们也可以在启动类中添加上该注解来将需要注入到IOC容器中的bean对象和配置类进行注入。(方便简洁)
- 如下为一个依赖中注解类的示例
- 如下为一个依赖中注解类的示例