1 概述
上一篇文章(SpringBoot--自动配置原理解析)我们学习了SpringBoot自动配置的原理,对自动配置到底是怎么回事进行了详细地学习,那么现在我们就需要自己来实现一个自动配置的功能,以加深自己对自动配置的了解与认识。
2 工程结构
首先直接上工程结构的截图:
我们来看一下我们的pom文件里面需要添加的一些内容。
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>springboot.enable.demo</groupId>
<artifactId>enable.demo</artifactId>
<version>3.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
按照SpringBoot enable****的效果我们要达到的目的就是在启动类上加上我们自己的enable***注解就能实现我们自己的自动配置。
首先我们来实现配置类DemoProperties。
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author: LIUTAO
* @Date: Created in 2018/8/24 16:03
* @Modified By:
*/
@ConfigurationProperties(prefix = "demo.user") //读取配置文件demo.user开始的属性
public class DemoProperties {
private String name;
private int age;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
针对demo自动配置,我们可以配置name、age、email属性。当获取到这些配置属性的时候,我们需要将这些配置属性设置到相应的bean。
/**
* @author: LIUTAO
* @Date: Created in 2018/8/24 16:08
* @Modified By:
*/
public class Demo {
private String name;
private int age;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
上面的代码就是Demo类的源码,接下来我们看看DemoAutoConfig又做了什么呢?其实我们可以猜到这里肯定要产生一个Bean,并且将配置类的属性设置到对应的bean。
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author: LIUTAO
* @Date: Created in 2018/8/24 16:05
* @Modified By:
*/
@Configuration
@ConditionalOnClass({Demo.class})
@EnableConfigurationProperties(DemoProperties.class)
public class DemoAutoConfig {
@Bean
public Demo getDemo(DemoProperties demoProperties){
Demo demo = new Demo();
demo.setName(demoProperties.getName());
demo.setAge(demoProperties.getAge());
demo.setEmail(demoProperties.getEmail());
return demo;
}
}
注意:上面的Configuration也可以不添加,由于这里我们在EnableAutoDemoConfig注解中使用Import导入了ImportSelector的子类,并且子类返回了自动配置类的全名。
其实到这里为止,如果我们能够随时扫描到DemoAutoConfig所在包,我们就可以实现Demo bean的自动配置。但是入果我们不知道DemoAutoConfig的名称,甚至不知道所在包全名呢?这就需要用到我们的Enable****注解了。
我们来看一下EnableAutoDemoConfig注解干了什么。
import org.springframework.context.annotation.Import;
import java.lang.annotation.*;
/**
* @author: LIUTAO
* @Date: Created in 2018/8/24 16:28
* @Modified By:
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({AutoConfigurationImportSelectorDemo.class})
public @interface EnableAutoDemoConfig {
}
这里是不是很简单,其实就Import了一个ImportSelector的子类AutoConfigurationImportSelectorDemo。
public class AutoConfigurationImportSelectorDemo implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//获取EnableAutoDemoConfig所在的META-INF/spring.fctories里面的
//EnableAutoDemoConfig类全名为key对应的值的Class全名
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), null);
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return StringUtils.toStringArray(configurations);
}
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoDemoConfig.class;
}
}
上面的注释,说白了就是获取
这下面的自动配置类全名来进行自动配置。
到此为止我们的自动配置功能就完成了,当然install然后在其他工程下测试一下,注意其余工程的包名不要和这里的包名相同,不然在体现不出来自动配置的EnableAutoDemoConfig注解的作用。
引入enabledemo生成的jar包。
<dependency>
<groupId>springboot.enable.demo</groupId>
<artifactId>enable.demo</artifactId>
<version>3.0-SNAPSHOT</version>
</dependency>
在启动类上加上@EnableAutoDemoConfig,
@SpringBootApplication
@EnableAutoDemoConfig
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
配置文件中添加相应配置,
demo.user.age=1
demo.user.email=liutao0612@126.com
demo.user.name=liutao
注入对应自动配置bean。
@Autowired
private Demo demo;
启动程序,我们就可以看见对应的自动配置信息完成写入到demo 中。
本人写了一个Demo,使用SpringBoot的自动配置功能实现的RSA自动加密Http输入和输出参数,源码地址:RSA自动加密解密工具,喜欢的点下星星哦,谢谢