免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
EnvironmentPostProcessor怎么做單元測試?阿里P7解答

簡介

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

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

使用示例

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

spring.datasource.password=js8sbAwkduzPTEWQrlDbTw==

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

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

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

1.實現(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)用,可以實現(xiàn)Ordered接口,或者使用@Order注解。

2.注冊實現(xiàn)類

想要在Spring Boot啟動過程中調(diào)用這個實現(xiàn)類,我們還需要在META-INF/ Spring .factories中注冊這個實現(xiàn)類:

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

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

單元測試

下面介紹本文的重點:怎么做EnvironmentPostProcessor實現(xiàn)類的單元測試,話不多說,直接上代碼:

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));    }    /**     * 獲取一個經(jīng)過EnvironmentPostProcessor處理過的Environment     *     * @param processor  EnvironmentPostProcessor實現(xiàn)類的實例     * @param properties 預(yù)置準(zhǔn)備做單元測試的屬性     * @return 處理過的Environment     */    private ConfigurableEnvironment getEnvironment(EnvironmentPostProcessor processor, Properties properties) {        // 創(chuàng)建一個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)備做單元測試的屬性        environment.getPropertySources()                .addFirst(new PropertiesPropertySource("test", properties));        processor.postProcessEnvironment(environment, springApplication);        context.close();        return environment;    }}

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

附:加解密工具類代碼

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;    }}
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
前端對稱加密
33、springboot整合springcloud
RSA/ECB/PKCS1Padding加密
JAVA實現(xiàn)DES加密
使用RSA進(jìn)行信息加密解密的WebService示例
mybatis源碼分析(1)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服