spring boot外部配置與運行原理

我們經(jīng)常用到常規(guī)屬性配置相叁,如下方式注入屬性值:

application.properties配置文件中

    student.name = xaioming
    student.age = 12

class文件中

     @value("${student.name}")
     private String name;
     @value("${student.age}")
     private String age; 

類型安全的配置

如果通用的屬性值珊随,上述中使用@value注入每個配置在實際項目中會顯得格外麻煩拟逮,要注入很多次猖凛,spring boot還提供了基于類型安全的配置方式
通過@ConfigurationProperties將properties屬性和一個Bean及其屬性關聯(lián)

  1. student.properties配置文件中
    student.name = xaioming
    student.age = 12

2.類型安全的Bean

@Data  //Lombock
@Component
@ConfigurationProperties(prefix = "student",locations = {"classpath:config/student.properties"})
public class StudentProperties{
    private String name;
    private Long age;
}

3.引用

 @RestController
@SpringBootApplication
public class Test{

    @Autowired
    private StudentProperties stu;
    @RequestMapping("/test")
    public String index(){
        return stu.getName;
    }

    public static void main(String[] args) {
        SpringApplication.run(Test.class, args);
    }
}

運行原理

1.了解spring boot內(nèi)置自動配置
常規(guī)項目web.xml設置編碼

<filter>
<filter-name>encodingEilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

所以:

自動配置要滿足兩個條件:
(1)能配置這個CharacterEncodingFilter這個Bean
(2)能配置encoding和forceEncoding這兩個參數(shù)毒坛。

2.配置參數(shù)
基于上述類型安全的配置,springBoot的自動配置也是基于這一點實現(xiàn)的
這里的配置類可以在中直接設置,源碼如下:


@ConfigurationProperties(prefix="spring.http.encoding")//1
public class HttpEncodingProperties{

public static final Charset DEEAULT_CHARSET=Charset.forName("UTF-8")
private Charset charset-DEFAULT_CHARSET;  //2

private boolean force=true; //3

public Charset getCharset((
    return this.charset;
}
public void setcharset(Charset charset)(
    this.charset=charset;
}
public boolean isForce(){
    return this.force;
}
public void setForce(boolean force){
    this.force-force;
}

代碼解析:

①在application.properties配置的時候前綴是spring.http.encoding
②默認編碼方式為UTF-8,若修改可使用spring.http.encoding.charset=編碼;
③設置forceEncoding,默認為tue,若修改可使用 spring.http.encoding.force = false

即項目中平常修改編碼:

spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true

3.配置Bean
通過調(diào)用上述配置,并根據(jù)條件配置CharacterEneodingFriter的Bean,我們來看看源碼:

@Configuration
@EnableConfigurationProperties(HttpEncodingProperties.class)//1
@ConditionalonClass(CharacterEncodingFilter,class)//2
@ConditionalOnProperty(prefix="spring.http.encoding",value="enabled",
matchIfMissing=true)//3
public class HttpEncodingAutoConfiguration (

@Autowire
private HttpEncodingProperties httpEncodingProperties;//3

@Bean//4
@ConditionalOnMissingBean(CharacterEncodingFilter.class)//5
public CharacterEncodingFilter characterEncodingFilter(){
    CharacterEncodingFilter filter = new OrderedcharacterEncodingFilter();
    filter.setEncoding(this.httpEncodingProperties.getcharset().name());
    filter.setForceEncoding(this.httpEncodingProperties.isForce());
    return filter;
}

代碼解析:

①開啟屬性注入,通過 @EnableConfigurationProperties 聲明,使用 @Autowire 注入蚪缀;
②當 CharacterEneodingFriter 在類路徑的條件下;
③當設置 spring.http.encoding=enabled 的情況下,如果沒有設置則默認為true,即條件符合;
④像使用Java配置的方式配置 CharacterEneodingFriter 這個Bean;
⑤當容器中沒有這個Bean的時候新建Bean.
注意點:
@ConfigurationProperties注解的作用是把yml或者properties配置文件轉(zhuǎn)化為bean修肠。
@EnableConfigurationProperties注解的作用是使@ConfigurationProperties注解生效贺辰。如果只配置@ConfigurationProperties注解,在spring容器中是獲取不到y(tǒng)ml或者properties配置文件轉(zhuǎn)化的bean的嵌施。

總結(jié)

1饲化、@Configuration&與@Bean->基于java代碼的bean配置

2、@EnableConfigurationProperties與@ConfigurationProperties->讀取配置文件轉(zhuǎn)換為bean吗伤。

3吃靠、@EnableAutoConfiguration->實現(xiàn)bean發(fā)現(xiàn)與加載。

補充:
類似@ConditionalOnMissingBean注解還有
常見的條件依賴注解有:

@ConditionalOnBean足淆,僅在當前上下文中存在某個bean時巢块,才會實例化這個Bean礁阁。

@ConditionalOnClass,某個class位于類路徑上族奢,才會實例化這個Bean姥闭。

@ConditionalOnExpression,當表達式為true的時候越走,才會實例化這個Bean泣栈。

@ConditionalOnMissingBean,僅在當前上下文中不存在某個bean時弥姻,才會實例化這個Bean南片。

@ConditionalOnMissingClass,某個class在類路徑上不存在的時候庭敦,才會實例化這個Bean疼进。

@ConditionalOnNotWebApplication,不是web應用時才會實例化這個Bean秧廉。

@AutoConfigureAfter伞广,在某個bean完成自動配置后實例化這個bean。

@AutoConfigureBefore疼电,在某個bean完成自動配置前實例化這個bean嚼锄。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔽豺,隨后出現(xiàn)的幾起案子区丑,更是在濱河造成了極大的恐慌,老刑警劉巖修陡,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沧侥,死亡現(xiàn)場離奇詭異,居然都是意外死亡魄鸦,警方通過查閱死者的電腦和手機宴杀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拾因,“玉大人旺罢,你說我怎么就攤上這事【罴牵” “怎么了扁达?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庭惜。 經(jīng)常有香客問我罩驻,道長,這世上最難降的妖魔是什么护赊? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任惠遏,我火速辦了婚禮砾跃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘节吮。我一直安慰自己抽高,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布透绩。 她就那樣靜靜地躺著翘骂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帚豪。 梳的紋絲不亂的頭發(fā)上碳竟,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音狸臣,去河邊找鬼莹桅。 笑死,一個胖子當著我的面吹牛烛亦,可吹牛的內(nèi)容都是我干的诈泼。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼煤禽,長吁一口氣:“原來是場噩夢啊……” “哼铐达!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起檬果,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤瓮孙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后汁汗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衷畦,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年知牌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斤程。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡角寸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忿墅,到底是詐尸還是另有隱情扁藕,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布疚脐,位于F島的核電站亿柑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棍弄。R本人自食惡果不足惜望薄,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一疟游、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痕支,春花似錦颁虐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至花嘶,卻和暖如春笋籽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椭员。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工车海, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拆撼。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓容劳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闸度。 傳聞我的和親對象是個殘疾皇子竭贩,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容