目录
配置第三方组件
步骤 1:添加依赖
步骤 2:配置数据源
步骤 3:配置 MyBatis-Plus
实现自动装配
自动扫描机制
指定扫描包(使用别的包下的配置类时,指定包名来进行自动装配)
通过扫描spring.factories 文件(Spring Boot 2.7之前)
文件格式
后续使用方式
1. 自动配置类的定义
2. 自动配置类的加载
3. 条件化配置
文件格式与内容
工作原理
使用示例
1. 创建自动配置类
2. 创建 AutoConfiguration.imports 文件
3. 应用启动
@Configuration
注解@Configuration
注解用于定义配置类,本质上是一个特殊的 @Component
,它标记的类会被 Spring 容器识别为配置类,通常会在该类中使用 @Bean
注解来定义和注册 Bean。@Configuration
注解。例如,配置数据库连接池、第三方组件的 Bean 等。在 pom.xml
中添加 MyBatis-Plus 的依赖:
com.baomidou
mybatis-plus-boot-starter
3.4.3.4
在 application.yml
中配置数据源信息:
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
可以通过 Java 配置类来配置 MyBatis-Plus 的一些特性,例如分页插件:、
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
Spring Boot 默认会扫描主应用类所在包及其子包下的所有带有特定注解的类。主应用类是指带有 @SpringBootApplication
注解的类。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在上述代码中,DemoApplication
是主应用类,Spring Boot 会自动扫描 com.example.demo
包及其子包下的所有带有 @Component
及其派生注解的类,并将它们注册为 Spring Bean。
如果需要扫描主应用类所在包之外的其他包,可以使用 @ComponentScan
注解。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.otherpackage", "com.example.anotherpackage"})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
通过扫描spring.factories
文件(Spring Boot 2.7之前)spring.factories
文件位于 META-INF
目录下,采用 Java 属性文件的格式,使用键值对的形式来指定接口和对应的实现类。键是接口的全限定名,值是实现类的全限定名,多个实现类之间用逗号分隔。示例如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.MyAutoConfiguration1,\
com.example.demo.MyAutoConfiguration2
自动配置类通常使用 @Configuration
注解标记,并且可以结合其他注解(如 @ConditionalOnClass
、@ConditionalOnMissingBean
等)来实现条件化配置。示例如下:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAutoConfiguration {
@Bean
public MyService myService() {
return new MyService();
}
}
Spring Boot 在启动时,会自动扫描所有依赖库中的 META-INF/spring.factories
文件,并根据其中的配置信息加载相应的自动配置类。具体步骤如下:
spring.factories
文件:Spring Boot 会在类路径下查找所有的 META-INF/spring.factories
文件。spring.factories
文件中的键值对,找到 org.springframework.boot.autoconfigure.EnableAutoConfiguration
对应的自动配置类列表。为了避免不必要的配置和 Bean 创建Spring Boot 提供了一系列条件注解,如 @ConditionalOnClass
、@ConditionalOnMissingBean
等。这些注解可以在自动配置类或 Bean 方法上使用,用于指定配置或 Bean 创建的条件。例如:避免一些不是基于SpringMVC 框架的服务但是引用了使用SpringMVC 框架的服务而导致的报错 所以利用条件来筛选 比如下面例子:我们都知道SpringMVC的核心api是DispatcherServlet 只要有SpringMVC就一定有DispatcherServlet,所以我们就基于这个条件来筛选使用SpringMVC 框架的服务,从而避免了报错。示例如下:
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService() {
return new MyService();
}
}
PS:
Spring Boot 3.0 后META -INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
替代了
spring.factories
部分功能的引入了新机制
spring.factories
存在一些性能问题,因为它在启动时会加载大量候选自动配置类,然后再通过条件注解进行筛选,这可能导致不必要的类加载和资源消耗。而 AutoConfiguration.imports
文件能更精准地指定要加载的自动配置类,减少了不必要的扫描和处理。META - INF/spring
目录下。com.example.demo.config.MyAutoConfiguration1
com.example.demo.config.MyAutoConfiguration2
其工作原理与spring.factories相似
META - INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件。@Conditional
系列注解(如 @ConditionalOnClass
、@ConditionalOnMissingBean
等)进行条件判断,决定是否最终生效。import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAutoConfiguration {
@Bean
public MyService myService() {
return new MyService();
}
}
AutoConfiguration.imports
文件在 src/main/resources/META - INF/spring
目录下创建 org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件,内容如下:
com.example.demo.config.MyAutoConfiguration
当 Spring Boot 应用启动时,会自动加载 MyAutoConfiguration
类,并根据其中的配置创建 MyService
Bean。