SpringBootStarter 分析及其实现
stater可以帮助我们省略很多的配置,我们不如分析下,SpringBoot的stater,然后实现一版自己的starter:主要是类似Mybatis那种自动根据条件注入的功能
mybatis-spring-boot-starter
Mybatis-starter主要包含两个pom文件点进去可以看到:
<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.0</modelVersion>
<parent>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot</artifactId>
<version>1.1.1</version>
</parent>
<artifactId>mybatis-spring-boot-starter</artifactId>
<name>mybatis-spring-boot-starter</name>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-autoconfigure</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</project>
打开mybatis-spring-boot-autoconfigure的jar包可以看到:
其中SpringFactories配置文件的内容是使用@ConfigureRation 注解会扫描的注解类,打开注解类可以看到
@Configuration //表明这是注解类
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class }) //只有存在括号里面的类才会加载
@ConditionalOnBean(DataSource.class) //只有注入了这个bean才会加载
@EnableConfigurationProperties(MybatisProperties.class) //
@AutoConfigureAfter(DataSourceAutoConfiguration.class) //注入先后顺序
@EnableConfigurationProperties
关于这个注解我们不得不先说下@ConfigurationProperties
有时候有这样子的情景,我们想把配置文件的信息,读取并自动封装成实体类,这样子,我们在代码里面使用就轻松方便多了,这时候,我们就可以使用@ConfigurationProperties,它可以把同类的配置信息自动封装成实体类
首先在配置文件里面,这些信息是这样子滴
connection.username=admin
connection.password=kyjufskifas2jsfs
connection.remoteAddress=192.168.1.1
这时候我们可以定义一个实体类在装载配置文件信息
@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {
private String username;
private String remoteAddress;
private String password ;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getRemoteAddress() {
return remoteAddress;
}
public void setRemoteAddress(String remoteAddress) {
this.remoteAddress = remoteAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在spring-boot中,
1、如果@ConfigurationProperties所注的类可以被springboot扫描并添加进容器中作为bean(比如使用@Component等注解,或者配置扫描该类所在包等手段),那么spring容器会自动使该类上的@ConfigurationProperties生效,创建一个该类的实例,然后把对应配置属性绑定进该实例,再把该实例作为bean添加进spring容器。
2、如果该类只使用了@ConfigurationProperties注解,然后该类没有在扫描路径下或者没有使用@Component等注解,导致无法被扫描为bean,那么就必须在配置类上使用@EnableConfigurationProperties注解去指定这个类,这个时候就会让该类上的@ConfigurationProperties生效,然后作为bean添加进spring容器中
Spring框架还提供了很多@Condition给我们用
@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean;可以给该注解传入参数例如@ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行。
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)
@ConditionalOnProperty(当有配置信息时生效)
@EnableConfigurationProperties 注解在类上,声明开启属性注入,使用@Autowired注入。
@AutoConfigureAfter 在指定的自动配置类之后再配置。
@ImportResource 虽然Spring提倡零配置,但是还是提供了对xml文件的支持,这个注解就是用来加载xml配置的。
当然Mybatis也是通过这些注解完成判断你是不是自定义了自己的实现。
实现
代码:https://gitee.com/xinshuai/Sprring-Starter