SpringBoot--自动配置Demo实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ONROAD0612/article/details/82023787

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
[email protected]
demo.user.name=liutao

注入对应自动配置bean。

@Autowired
    private Demo demo;

启动程序,我们就可以看见对应的自动配置信息完成写入到demo 中。

本人写了一个Demo,使用SpringBoot的自动配置功能实现的RSA自动加密Http输入和输出参数,源码地址:RSA自动加密解密工具,喜欢的点下星星哦,谢谢

猜你喜欢

转载自blog.csdn.net/ONROAD0612/article/details/82023787