自动配置原理:
- SpringBoot启动的时候加载主配置类,开启了自动配置功能 注解:@EnableAutoConfiguration
- @EnableAutoConfiguration作用:
利用@Import({AutoConfigurationImportSelector.class})给容器中导入了一些组件
可以查看selectImports()方法的内容;
List configurationns = autoConfigurationEntry.getConfigurations() ; 获取候选的配置
把扫描到的这些文件的内容包装成properties对象
从properties中获取到AutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中
将类路径下 META-INF/spring.factories里面配置的所有的EnableAutoConfiguration的值加入到了容器中
每一个xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置
-每一个自动配置类进行自动配置类功能
以**HttpEncodingAutoConfiguration **为例解释自动配置原理(Http编码自动配置)
- 查看HttpEncodingAutoConfiguration
@Configuration(
proxyBeanMethods = false
) //表示这是一个配置类,和编写的配置文件一样,也可以给容器添加组件
@EnableConfigurationProperties({ServerProperties.class}) //启动指定类的ConfigurationPproperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把ServerProperties加入到ioc容器中
@ConditionalOnWebApplication(
type = Type.SERVLET
) //Spring底层@Conditional注解,根据不同条件,如果满足指定的条件,整个配置类里面的配置就会生效; 该处的作用是 判断当前应用是否是Web应用,如果是,当前配置类生效,否则不生效
@ConditionalOnClass({CharacterEncodingFilter.class}) //判断当前项目有没有这个类 CharacterEncodingFilter:SpringMVC中进行乱码解决过滤器;
@ConditionalOnProperty(
prefix = "server.servlet.encoding",
value = {"enabled"},
matchIfMissing = true
) //判断配置文件中是否存在某个配置 server.servlet.encoding.enabled;如果不存在,判断也是成立的 matchIfMissing表示即使配置文件中不配置server.servlet.encoding.enabled=true,也是默认生效的
public class HttpEncodingAutoConfiguration {
//代表他已经和SpringBoot的配置文件映射了
private final Encoding properties;
//只有一个有参构造器的情况下,参数的值就会从容器中拿
public HttpEncodingAutoConfiguration(ServerProperties properties) {
this.properties = properties.getServlet().getEncoding();
}
@Bean //给容器中添加一个组件,这个组件的某些值,需要从properties中获取
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE));
return filter;
}
根据当前不同的条件判断,决定这个配置类是否生效
但这个配置类生效,这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的
- 点入ServerProperties.class
@ConfigurationProperties(
prefix = "server",
ignoreUnknownFields = true
) //从配置文件中获取指定的值和Bean属性进行绑定
public class ServerProperties {
所有在配置文件中能配置的属性都是在xxxxProperties类中封装者,配置文件能配置什么就可以参照某个功能对应的这个属性类
精髓
- SpringBoot启动会加载大量的自动配置类
- 看需要的功能有没有SpringBoot默认写好的自动配置类
- 查看自动配置类中到低配置了而哪些组件(如果有,则不需要再配置)
- 给容器中自动配置类中添加组件的时候,会从properties类中获取某些属性 ,可以在配置文件中指定这些属性的值