<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration //SpringBoot配置类,类似于配置文件。配置类也是容器中的组件。标注在类上标明是一个SpringBoot配置类
@EnableAutoConfiguration //开启SpringBoot自动配置功能
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class,
attribute = "exclude"
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class,
attribute = "excludeName"
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration // 表明该类是一个Spring的配置类
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component // 表明该类是Spring的一个组件
public @interface Configuration {
@AliasFor(
annotation = Component.class
)
String value default "";
boolean proxyBeanMethods() default true;
}
package org.springframework.boot.autoconfigure;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
在SpringBoot项目中的resources文件夹:
SpringBoot使用一个全局配置文件,配置文件名是固定的:
friends:
lastName: Chova
firstName: Vea
行内写法:
friends: {lastName: Chova,firstName: Vea}
pets:
- dog
- cat
- pig
行内写法:
pets: [dog,cat,pig]
@Value | @ConfigurationProperties | |
---|---|---|
功能 | 在属性上一个一个指定注入 | 批量注入配置文件中的属性 |
松散绑定(松散语法) | 不支持 | 支持 |
SpEL | 支持 | 不支持 |
JSR303数据校验 | 不支持 | 支持 |
复杂类型封装 | 不支持 | 支持 |
@PropertySource(value = {"classpath:person.properties"})
@ImportResource(locations={"classpath:beans.xml"})
1.${random.value}
2.${random.int}
3.${random.int(10)}
4.${random.int[1024,65536]}
---
激活指定Profile: 1.在主配置文件application.properties中指定激活:
spring.profiles.active=dev
2.命令行激活:(Program arguments)
--spring.profiles.active=dev
3.虚拟机参数激活:(VM options)
-Dspring.profiles.active=dev
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置
SpringFactoriesLoader.loadFactoryNames();扫描所有jar包类路径下:META-INF/spring.factories。把扫描到的这些文件的内容包装成properties对象,从properties中获取到EnableAutoConfiguration.class(类名)类的值,然后把它们添加在容器中
将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到了容器中。
@Configuration // 表示这是一个配置类,类似配置文件,可以给容器中添加组件
@EnableConfigurationProperties({HttpProperties.class}) // 启用指定类的ConfigurationProperties(从配置文件中获取指定的值和bean的属性进行绑定)功能
@ConditionalOnWebApplication( // Spring底层@conditional注解,根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效(判断当前应用是否为web应用)
type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class}) // 判断当前项目有没有这个类,CharacterEncodingFilter:SpringMVC中进行乱码解决的过滤器
@ConditionalOnProperty( // 判断文件中是否存在某个配置
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true // 即使配置文件中不配置spring.http.encoding.enable=true,也是默认生效的
)
public class HttpEncodingAutoConfiguration {
根据当前不同的条件判断,决定配置类是否生效,就会通过@Bean为容器中添加各种组件,这些组件的值需要从properties中获取,properties中的每一个属性和配置文件绑定。 注意点:
debug=true
可以在控制台打印自动配置报告,可以查看哪些自动配置生效,哪些自动配置不生效。