前言
为什么需要自定义spring自动配置?
在很多时候,我们会需要开发一些公共组件jar包,同时我们又希望能在项目启动时自动
加载,所以可以通过自定义自动配置包来到达此目的。
准备工作
自动配置原理
如果不懂springboot自动配置原理,可以看先之前一篇springboot自动配置原理
maven引入springboot核心依赖
版本依赖父工程的springboot版本号,可自行决定
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>your-version</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
开发需要自动注入的组件
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class AutoConfigDemo {
@Bean
@ConditionalOnClass(PooledDataSource.class)
public DataSource MyDataSource() {
//比如自己注入一个apache的数据源
return new PooledDataSource();
}
}
上述代码首先在类上添加了@configuration注解,说明这是一个配置类,此时这个类就相当于
ssm项目中的applicationContext.xml
, @Bean
标注的方法则相当于applicationContext.xml
中如下配置:
说明:@ConditionalOnClass(PooledDataSource.class)
意为当PooledDataSource
类存在时才注入这个bean,可以实现注入bean控制
<bean id="MyDataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource"/>
但是这个项目如果直接作为jar包导入你的主项目里,还不能实现自动注入,还需要在resource目录下建立 META-INF/spring.factories
文件, 如自动配置文中所述位置, 需要注意的是 文件夹必须叫META-INF
,文件名也必须是spring.factories
,否则无法实现自动注入, 最后 spring.factories
添加如下内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xxx.xxx.xxx.AutoConfigDemo
文件路径如下:
com.xxx.xxx.xxx.AutoConfigDemo 是我们的配置类全类名
测试
将项目打成jar包,在主项目中引入,启动主项目,实现自动注入