@Component
@ConfigurationProperties(prefix="person")
publicclassPerson{
}
需要添加依賴才有提示
dependencies{
?? optional "org.springframework.boot:spring-boot-configuration-processor"
}
properties亂碼問題
@Value和@ConfigurationProperties取值的不同
@ConfigurationProperties@Value
功能批量注入配置的屬性值一個(gè)一個(gè)指定
松散語法(下劃線轉(zhuǎn)和字母大寫變量名可識(shí)別)支持不支持
SpEL不支持支持
JSR303數(shù)據(jù)校驗(yàn)支持不支持
@PropertySource和@ImportSource
@PropertySource(value={"classpath:xxx.properties"}),加載另外的配置文件
@ImportResource(locations={"classpath:xxx.xml"}):導(dǎo)入Spring的配置文件,用在配置類上
xml文件替換成配置類
@Configuration
publicclassMyAppConfig{
//<bean></bean>將方法的返回值添加到容器中,容器中該組件的默認(rèn)id就是方法名
@Bean
publicHelloServicehelloService(){
returnnewHelloService();
?? }
}
配置文件占位符
${random.uuid}
${user.name:默認(rèn)值}
profiles標(biāo)識(shí)
不同環(huán)境可以使用不同的配置文件
application.properties
spring.profiles.active=dev? #激活dev環(huán)境的配置
application-dev.properties
springboot配置文件加載順序
file:./config/
file:./
classpath:./config/
classpath:/
優(yōu)先級(jí)由高到低,高的會(huì)覆蓋低的
自動(dòng)配置原理
1)、Springboot啟動(dòng)時(shí)加載主配置類,@SpringBootApplication中啟用了自動(dòng)配置@EnableAutoConfiguration
2)、在@EnableAutoConfiguration中用@Import(AutoConfigurationImportSelector.class)導(dǎo)入組件
3)、在AutoConfigurationImportSelector類中有一個(gè)selectImports方法
4)、在getAutoConfigurationEntry中調(diào)用getCandidateConfigurations從springfactory加載工廠
5)、loadFactoryNames中返回loadFactoryNames從FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";讀取EnableAutoConfiguration.class的內(nèi)容包裝成properties對(duì)象
根據(jù)不同的條件判斷決定該配置類是否生效
?
@Configuration//這是一個(gè)配置類
@EnableConfigurationProperties(HttpProperties.class)//啟用制定類的ConfigurationProperties功能
@ConditionalOnWebApplication(type=ConditionalOnWebApplication.Type.SERVLET)//spring底層@Conditional注解,根據(jù)不同的條件,如果滿足條件該配置類生效
@ConditionalOnClass(CharacterEncodingFilter.class)//判斷當(dāng)前項(xiàng)目有沒有這個(gè)類
@ConditionalOnProperty(prefix="spring.http.encoding",value="enabled",matchIfMissing=true)//判斷配置文件是否存在這些配置,matchIfMissing如果不存在還是返回true
publicclassHttpEncodingAutoConfiguration{
?
? ? privatefinalHttpProperties.Encodingproperties;
?
? ? publicHttpEncodingAutoConfiguration(HttpPropertiesproperties) {
? ? ? ? this.properties=properties.getEncoding();
? ? }
?
? ? @Bean//給容器中添加這個(gè)組件
? ? @ConditionalOnMissingBean//判斷容器中沒有這個(gè)組件時(shí)
? ? publicCharacterEncodingFiltercharacterEncodingFilter() {
? ? ? ? CharacterEncodingFilterfilter=newOrderedCharacterEncodingFilter();
? ? ? ? filter.setEncoding(this.properties.getCharset().name());
? ? ? ? filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
? ? ? ? filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
? ? ? ? returnfilter;
? ? }
?
? ? @Bean
? ? publicLocaleCharsetMappingsCustomizerlocaleCharsetMappingsCustomizer() {
? ? ? ? returnnewLocaleCharsetMappingsCustomizer(this.properties);
? ? }
?
? ? privatestaticclassLocaleCharsetMappingsCustomizerimplements
? ? ? ? ? ? WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>,Ordered{
?
? ? ? ? privatefinalHttpProperties.Encodingproperties;
?
? ? ? ? LocaleCharsetMappingsCustomizer(HttpProperties.Encodingproperties) {
? ? ? ? ? ? this.properties=properties;
? ? ? ? }
?
? ? ? ? @Override
? ? ? ? publicvoidcustomize(ConfigurableServletWebServerFactoryfactory) {
? ? ? ? ? ? if(this.properties.getMapping()!=null) {
? ? ? ? ? ? ? ? factory.setLocaleCharsetMappings(this.properties.getMapping());
? ? ? ? ? ? }
? ? ? ? }
?
? ? ? ? @Override
? ? ? ? publicintgetOrder() {
? ? ? ? ? ? return0;
? ? ? ? }
?
? ? }
?
}
自定義錯(cuò)誤信息繼承DefaultErrorAttributes重寫getErrorAttributes方法調(diào)用super.getErrorAttributes將自己的錯(cuò)誤信息寫入map返回將map放入request域取出異常處理器中的信息(Map<String,Object>)requestAttributes.getAttribute("ext",0);
嵌入式servlet
修改tomcat配置
注冊(cè)servlet(localhost:8080/myServlet)
@Bean
publicServletRegistrationBeanmyServlet(){
ServletRegistrationBeanservletbean=newServletRegistrationBean(newMyServlet(),"/myServlet");
returnservletbean;
}
注冊(cè)filter
@Bean
publicFilterRegistrationBeanmyFilter(){
? ? FilterRegistrationBeanfilterbean=newFilterRegistrationBean();
? ? filterbean.setFilter(newMyFilter());//注冊(cè)過濾器
? ? filterbean.setUrlPatterns(Array.asList("/hello","/myServlet"));//過濾url
? ? returnfilterbean;
}