spring-boot
可以省略众多的繁琐配置,它的众多starter
可以说是功不可没。
例如spring-boot
中集成redis
,只需要pom.xml
中引入spring-boot-starter-data-redis
,配置文件中加入spring.redis.database
等几个关键配置项即可,常用的starter
还有spring-boot-starter-web
、spring-boot-starter-test
、spring-boot-starter-jdbc
,相比于传统的xml
配置可以说是大大减少了集成的工作量。
利用starter
实现自动化配置只需要两个条件——maven
依赖、配置文件,这里简单介绍下starter
实现自动化配置的流程。
引入maven
实质上就是导入jar
包,spring-boot
启动的时候会找到starter
jar
包中的resources/META-INF/spring.factories
文件,根据spring.factories
文件中的配置,找到需要自动配置的类,如下:
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnBean({DataSource.class})
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisAutoConfiguration {
//....
}
这是一个mybatis-spring-boot-autoconfigure
中的自动配置类。
简单说明一下其中的注解:
注解 | 说明 |
---|---|
@Configuration | 表明是一个配置文件,被注解的类将成为一个bean配置类 |
@ConditionalOnClass | 当classpath 下发现该类的情况下进行自动配置 |
@ConditionalOnBean | 当classpath 下发现该类的情况下进行自动配置 |
@EnableConfigurationProperties | 使@ConfigurationProperties 注解生效 |
@AutoConfigureAfter | 完成自动配置后实例化这个bean |
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.4.RELEASEversion>
<relativePath/>
parent>
<groupId>com.ouyanglolgroupId>
<artifactId>starter-demoartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>starter-demoname>
<description>spring-boot-starter demodescription>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-source-pluginartifactId>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>jar-no-forkgoal>
goals>
execution>
executions>
plugin>
plugins>
build>
project>
spring-boot-starter
就不用说了,spring-boot-configuration-processor
的作用是编译时生成 spring-configuration-metadata.json
,在IDE
中编辑配置文件时,会出现提示。
打包选择jar-no-fork
,因为这里不需要main
函数。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface EnableDemoConfiguration {
}
这个不是必须的,建议有这样一个注释,作为自动配置相关属性的入口。
@Data
@ConfigurationProperties(prefix = "demo")
public class DemoProperties {
private String name;
private Integer age;
}
name
和age
对应application.properties
里面的demo.name
和demo.age
@Configuration
@ConditionalOnBean(annotation = EnableDemoConfiguration.class)
@EnableConfigurationProperties(DemoProperties.class)
public class DemoAutoConfiguration {
@Bean
@ConditionalOnMissingBean
DemoService demoService (){
return new DemoService();
}
}
这里设置自动配置的相关条件,和相关操作,由于这里只想写一个最简单的demo,所以这里只需要简单注入一个bean
,没有复杂逻辑,实际开发中,这个类是最关键的。
public class DemoService {
@Autowired
private DemoProperties demoProperties;
public void print() {
System.out.println(demoProperties.getName());
System.out.println(demoProperties.getAge());
}
}
这里不需要@Service
,因为已经通过DemoAutoConfiguration
注入spring
容器了。
在resources/META-INF/
下创建spring.factories
文件:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ouyanglol.starterdemo.config.DemoAutoConfiguration
告诉spring-boot
,启动时需要扫描的类。
本地mvn install
之后,在新的spring-boot
项目里面引入
<dependency>
<groupId>com.ouyanglolgroupId>
<artifactId>starter-demoartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
demo.name = ooo
demo.age = 11
如果使用的是IDEA
,在编辑时会出现提示。
@SpringBootApplication
@EnableDemoConfiguration
public class Demo1Application {
@Autowired
private DemoService demoService;
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
@PostConstruct
public void test() {
demoService.print();
}
}
启动main
函数,控制台会打印出配置文件中的name
和age
,一个简单的spring-boot-starter
就写好了
github:spring-boot-starter-demo