2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

EnvironmentPostProcessor怎么做單元測(cè)試?阿里P7解答

 路人甲Java 2021-05-17

簡(jiǎn)介

從Spring Boot 1.3開(kāi)始,我們可以在應(yīng)用程序上下文刷新之前使用EnvironmentPostProcessor來(lái)自定義應(yīng)用程序的Environment。Environment表示當(dāng)前應(yīng)用程序運(yùn)行的環(huán)境,它可以統(tǒng)一訪問(wèn)各種屬性源中的屬性,如屬性文件、JVM系統(tǒng)屬性、系統(tǒng)環(huán)境變量和Servlet上下文參數(shù)。使用EnvironmentPostProcessor可以在bean初始化之前對(duì)Environment進(jìn)行修改。

文章持續(xù)更新,微信搜索「萬(wàn)貓學(xué)社」第一時(shí)間閱讀,關(guān)注后回復(fù)「電子書(shū)」,免費(fèi)獲取12本Java必讀技術(shù)書(shū)籍。

使用示例

讓我們?cè)O(shè)想一個(gè)需求,配置文件中的數(shù)據(jù)庫(kù)密碼是加密后的密文,如:

spring.datasource.password=js8sbAwkduzPTEWQrlDbTw==

在應(yīng)用啟動(dòng)時(shí),對(duì)密文進(jìn)行解密后再進(jìn)行數(shù)據(jù)庫(kù)的連接。

針對(duì)這種需求,就可以通過(guò)EnvironmentPostProcessor對(duì)密文進(jìn)行解密,重新放到Environment中。

文章持續(xù)更新,微信搜索「萬(wàn)貓學(xué)社」第一時(shí)間閱讀,關(guān)注后回復(fù)「電子書(shū)」,免費(fèi)獲取12本Java必讀技術(shù)書(shū)籍。

1.實(shí)現(xiàn)EnvironmentPostProcessor

package one.more;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;

import java.util.Properties;

public class DecodeEnvironmentPostProcessor implements EnvironmentPostProcessor {

    public static final String SPRING_DATASOURCE_PASSWORD = "spring.datasource.password";
    public static final String AES_SECRET = "OneMore";

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        String password = environment.getProperty(SPRING_DATASOURCE_PASSWORD);
        Properties properties = new Properties();
        properties.setProperty(SPRING_DATASOURCE_PASSWORD, AESUtil.decrypt(password, AES_SECRET));
        PropertiesPropertySource propertiesPropertySource = new PropertiesPropertySource(SPRING_DATASOURCE_PASSWORD,
                properties);
        environment.getPropertySources().addFirst(propertiesPropertySource);
    }
}

如果你希望EnvironmentPostProcessor按照特定的順序被調(diào)用,可以實(shí)現(xiàn)Ordered接口,或者使用@Order注解。

2.注冊(cè)實(shí)現(xiàn)類(lèi)

想要在Spring Boot啟動(dòng)過(guò)程中調(diào)用這個(gè)實(shí)現(xiàn)類(lèi),我們還需要在META-INF/ Spring .factories中注冊(cè)這個(gè)實(shí)現(xiàn)類(lèi):

org.springframework.boot.env.EnvironmentPostProcessor=
  one.more.DecodeEnvironmentPostProcessor

文章持續(xù)更新,微信搜索「萬(wàn)貓學(xué)社」第一時(shí)間閱讀,關(guān)注后回復(fù)「電子書(shū)」,免費(fèi)獲取12本Java必讀技術(shù)書(shū)籍。

單元測(cè)試

下面介紹本文的重點(diǎn):怎么做EnvironmentPostProcessor實(shí)現(xiàn)類(lèi)的單元測(cè)試,話不多說(shuō),直接上代碼:

package one.more;

import org.junit.Assert;
import org.junit.Test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;

import java.util.Properties;

public class DecodeEnvironmentPostProcessorTest {

    @Test
    public void testPostProcessEnvironment() {
        DecodeEnvironmentPostProcessor processor = new DecodeEnvironmentPostProcessor();
        String password = "one-more";
        Properties properties = new Properties();
        properties.setProperty(DecodeEnvironmentPostProcessor.SPRING_DATASOURCE_PASSWORD,
                AESUtil.encrypt(password, DecodeEnvironmentPostProcessor.AES_SECRET));
        ConfigurableEnvironment environment = getEnvironment(processor, properties);

        Assert.assertEquals(password,
                environment.getProperty(DecodeEnvironmentPostProcessor.SPRING_DATASOURCE_PASSWORD));

    }

    /**
     * 獲取一個(gè)經(jīng)過(guò)EnvironmentPostProcessor處理過(guò)的Environment
     *
     * @param processor  EnvironmentPostProcessor實(shí)現(xiàn)類(lèi)的實(shí)例
     * @param properties 預(yù)置準(zhǔn)備做單元測(cè)試的屬性
     * @return 處理過(guò)的Environment
     */
    private ConfigurableEnvironment getEnvironment(EnvironmentPostProcessor processor, Properties properties) {
        // 創(chuàng)建一個(gè)SpringApplication
        SpringApplication springApplication = new SpringApplicationBuilder()
                .sources(DecodeEnvironmentPostProcessor.class)
                .web(WebApplicationType.NONE).build();
        // 獲取應(yīng)用上下文
        ConfigurableApplicationContext context = springApplication.run();
        // 獲取Environment
        ConfigurableEnvironment environment = context.getEnvironment();
        //添加準(zhǔn)備做單元測(cè)試的屬性
        environment.getPropertySources()
                .addFirst(new PropertiesPropertySource("test", properties));
        processor.postProcessEnvironment(environment, springApplication);
        context.close();
        return environment;
    }
}

文章持續(xù)更新,微信搜索「萬(wàn)貓學(xué)社」第一時(shí)間閱讀,關(guān)注后回復(fù)「電子書(shū)」,免費(fèi)獲取12本Java必讀技術(shù)書(shū)籍。

附:加解密工具類(lèi)代碼

package one.more;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

public class AESUtil {

    private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
    private static final String KEY_ALGORITHM = "AES";

    public static String encrypt(String content, String password) {
        try {
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(password));
            byte[] result = cipher.doFinal(byteContent);
            return Base64.encodeBase64String(result);
        } catch (Exception ex) {

        }
        return null;
    }

    public static String decrypt(String content, String password) {
        try {
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, getSecretKey(password));
            byte[] result = cipher.doFinal(Base64.decodeBase64(content));
            return new String(result, "utf-8");
        } catch (Exception ex) {
        }
        return null;
    }

    private static SecretKeySpec getSecretKey(final String password) {
        KeyGenerator kg = null;
        try {
            kg = KeyGenerator.getInstance(KEY_ALGORITHM);
            kg.init(128, new SecureRandom(password.getBytes()));
            SecretKey secretKey = kg.generateKey();
            return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);
        } catch (NoSuchAlgorithmException ex) {

        }
        return null;
    }
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多