1. 程式人生 > >SpringBoot--自動配置Demo實現

SpringBoot--自動配置Demo實現

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自動加密解密工具,喜歡的點下星星哦,謝謝

相關推薦

SpringBoot--自動配置Demo實現

1 概述 上一篇文章(SpringBoot--自動配置原理解析)我們學習了SpringBoot自動配置的原理,對自動配置到底是怎麼回事進行了詳細地學習,那麼現在我們就需要自己來實現一個自動配置的功能,以加深自己對自動配置的瞭解與認識。 2 工程結構 首先直接上工程結構的

SpringBoot 為什麼能夠自動的注入一些常用的Bean ?詳細分析SpringBoot 自動配置實現

有一個問題一直讓我好奇,為什麼在SpringBoot中有的bean 我們都沒有配置卻能夠自動注入,這個比如說我們使用JdbcTemplate 的時候那個物件明明我們都沒有配置但是卻能獲取到。再比如SpringBoot在結合Redis的時候,我們也沒有注入redisTempla

springboot原始碼解析:自己實現一個springboot自動配置

上兩篇將到了springboot自動配置和條件註解是如何實現,這篇在前兩篇的基礎上自己實現一個springboot的自動配置,用到條件註解。 需求:加入自己手寫的jar。直接就可以使用StringRedisTemplate。 1.新建一個maven專案,pom.xml如下:

SpringBoot自動配置的原理及實現

SpringBoot自動配置的實現原理 SpringBoot的核心就是自動配置,自動配置又是基於條件判斷來配置Bean。關於自動配置的原始碼在spring-boot-autoconfigure-2.0.3.RELEASE.jar 回顧配置屬性 在通常需要我們在

SpringBoot自動配置xxxAutoConfiguration 的使用

調用棧 是否 PE provider onf pub div 存在 ring 以MybatisAutoConfiguration為例1. 在jar包中/META-INF/spring.factories中配置org.springframework.boot.autoconf

SpringBoot自動配置原理

override activity eve rop 哪些 isf 代碼 文件 multi SpringBoot自動配置原理 備註:該SpringBoot自動配置原理不適合java剛入門學者以及不熟悉Spring4+Springmvc+maven的同學 1、當Sprin

SpringBoot-自動配置原理

factory ESS bean att cond active tor 條件判斷 common 可配置項參考: https://docs.spring.io/spring-boot/docs/2.0.1.BUILD-SNAPSHOT/reference/htmlsingl

(轉)入門SpringBoot-自動配置原理(三)

leg ebs jdbc 路徑 ket dao posit 把他 exc 1、自動配置原理: 1)、SpringBoot啟動的時候加載主配置類,開啟了自動配置功能 ==@EnableAutoConfiguration== 2)、@EnableAutoConfigurat

SpringBoot自動配置

介紹下開發環境 JDK版本1.8 springboot版本是1.5.2 開發工具為 intellij idea(2018.2) 開發環境為 15款MacBook Pro 結束語 增加自動配置 使用自動配置,我們需要配置的東西很少,也就新增下檔案

SpringBoot自動配置註解原理解析

1. SpringBoot啟動主程式類: 1 @SpringBootApplication 2 public class DemoApplication { 3 public static void main(String[] args) { 4 5 SpringApp

springboot 自動配置的原理

在spring程式main方法中 新增@SpringBootApplication或者@EnableAutoConfiguration         會自動去maven中讀取每個starter中的spring.factories檔案  該檔案裡配置了所有需要被建立sprin

SpringBoot專欄:SpringBoot自動配置原理以及細節(第三講)

  自動配置原理 1)、SpringBoot啟動的時候載入主配置類,開啟了自動配置功能 @EnableAutoConfiguration 2)、@EnableAutoConfiguration 作用:        利用EnableA

SpringBoot-自動配置原始碼解析

接著上一篇部落格《 SpringBoot-快速搭建WEB工程》提出的需要分析的三個方面:我們來深入的探究SpringBoot是如何在沒有一個配置檔案的情況下為我們啟動好一個完整的WEB工程的,首先我們從@SpringBootApplication 開始這裡的分析

搭建springboot自動配置,基於自己的RedisUtil

1.建立專案如下 2.加入一下pom依賴 //這個是之前的部落格例子,對jedis連線操作的簡單分裝 <dependency> <groupId>com.cdy</groupId> <artifactId&

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

spring boot自動配置實現原理——@Conditional

spring 4中引入了@Conditional註解,可以讓spring在滿足特定條件時才將一個類註冊到spring容器中,具體的條件由org.springframework.context.annotation.Condition介面來描述,該介面的定義如下

SpringBoot之十六:SpringBoot自動配置的原理

Spring Boot在進行SpringApplication物件例項化時會載入META-INF/spring.factories檔案,將該配置檔案中的配置載入到Spring容器。 一、初始化

SpringBoot學習筆記(三) SpringBoot 自動配置原理

SpringBoot自動配置 SpringBoot自動配置的註解是@EnableAutoConfiguration 所以來看@EnableAutoConfiguration註解的原始碼: 1、首先@EnableAutoConfiguration是包含在@S

springboot 自動配置原理

8、自動配置原理 配置檔案到底能寫什麼?怎麼寫?自動配置原理; 配置檔案能配置的屬性參照   1、自動配置原理: 1)、SpringBoot啟動的時候載入主配置類,開啟了自動配置功能 @EnableAutoConfiguration 2)、@EnableAutoConfigu

Springboot第二章 springboot 自動配置原理

springboot 官方文件記錄了properties/yml   能寫的所有配置 1、自動配置原理: 1)Sprintboot 啟動的時候,載入住配置類,開啟自動配置功能, @EnableAutoConfiguration 利用 @Import(Auto