我們經(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)
- 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嚼锄。