wordpress 焦點(diǎn)圖seo搜索引擎優(yōu)化課程
一 背景
springboot 在啟動時候會將系統(tǒng)的環(huán)境變量、項(xiàng)目的啟動時設(shè)置的屬性?、application.yml文件(或application.properties文件)、@PropertySource定義的配置文件中的屬性加載到Environment對象中,分布式配置中心框架也會把配置加載到Environment中。而springboot的屬性注入即@Value、@ConfigurationProperties、xml文件的${.....},就是從Environment拿的數(shù)據(jù),再進(jìn)行解析的,我們要做的就是對Environment的數(shù)據(jù)源添加自定義的數(shù)據(jù)和解析過程中執(zhí)行我們自定義的解析代碼。
二 詳細(xì)需求
?1 根據(jù)配置中的內(nèi)容,動態(tài)的添加自定義的配置
如配置文件中只配置了一個用戶的id,啟動時根據(jù)這個id去獲取用戶信息,并把獲取到的信息添加到springboot的配置中,也就是定制我們自己獲取屬性的方式。這樣啟動后就能直接用到這個id對應(yīng)的用戶姓名、性別等數(shù)據(jù)(不可變的數(shù)據(jù),可變的數(shù)據(jù)就涉及到配置動態(tài)刷新了,后面再講),無需再手動調(diào)用接口獲取。效果如下
1.1 application.yml文件中配置用戶id
user:id: 123
1.2 通過這個用戶id “123”來使用這個用戶的相關(guān)信息
1.2.1?@Value
@Value("${user.123.name}")private String user123Name;@Value("${user.123.sex}")private String user123Age;
1.2.2?@ConfigurationProperties
@Data
@Component
@ConfigurationProperties(prefix = "user.123")
public class UserConfiguration {/*** 姓名*/private String name;/*** 性別*/private String sex;
}
@Autowiredprivate UserConfiguration userConfiguration;
1.2.3?Environment
@Autowiredprivate Environment environment;public void configTest() {String user123Age = environment.getProperty("user.123.sex");String user123Name = environment.getProperty("user.123.name");}
2 自定義屬性解析方法
如希望對一個配置文件中的屬性執(zhí)行我們自定義的方法,讓實(shí)際使用這個屬性的時候,用的是這個方法轉(zhuǎn)換后的屬性,如我配置了一個加密的屬性,想通過一個方法解密,使得使用時就是明文
spring:redis:password: decode(abc123)
這個decode就是我們自定義的方法,方法的入?yún)⑹且粋€密文,通過這個abc123可以獲取到實(shí)際的密碼。
具體的使用場景如下
1. 在不改變屬性名的情況下,對已有的配置做一個增強(qiáng)比如上述說的解密或者追加、替換一些字符,如整合redis的時候需要的密碼,不想直接暴漏到項(xiàng)目中,因?yàn)閷傩悦强隙ú荒茏兊?#xff08;redis根據(jù)屬性名來找屬性的),那么就可以自定義一個解密方法來將他的屬性值進(jìn)行解密。
2.將屬性值改為之前不存在的屬性,如上述1.2中動態(tài)新增的屬性,當(dāng)然可以直接這樣用
spring:redis:password: ${user.123.name}
,但如果是在執(zhí)行org.springframework.context.support.PropertySourcesPlaceholderConfigurer#postProcessBeanFactory后添加進(jìn)去的,那么springboot會找不到這個user.123.name屬性,是會直接報錯的(ignoreUnresolvablePlaceholders = false時,默認(rèn)就是false),所以可以自定義一個函數(shù)先越過這個校驗(yàn),在后面再進(jìn)行真正的賦值。
spring:redis:password: getPassword(user.123.name)
不過這個場景比較雞肋,因?yàn)橹灰覀兛刂坪脛討B(tài)新增屬性的時機(jī)那么就完全可以直接用${...}來替換