pringboot自动在启动的时候加载了主配置类,而且开启了自动配置功能
@SpringBootApplication:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@EnableAutoConfiguration:
@Import({AutoConfigurationImportSelector.class})
//利用这个选择器给容器中导入一些组件
将springframework.boot:spring-boot-autoconfigure(antoconfigure的类路径)下的META-INF下的spring-factories中的EnableAutoConfiguration下的类加入spring的IOC容器中。
作用:使用这些XxxAutoConfiguration类(自动配置类)来实现springboot的自动配置功能
这里以HttpEncodingAutoConfiguration来分析自动配置原理:这个类上面有许多个注解:
HttpEncodingAutoConfiguration.class
@Configuration(proxyBeanMethods = false)//表示这是一个配置类
@EnableConfigurationProperties({ServerProperties.class})//启用指定类的properties功能,就是说可以使用properties文件进行配置,将
配置文件中的值和这个类绑定起来了
@ConditionalOnWebApplication(type = Type.SERVLET)//这是spring的底层@Conditional注解,on后面跟着的是条件,本例中表示如果这是一个
web应用,这个配置类里面的配置就会生效,否则无效。
@ConditionalOnClass({CharacterEncodingFilter.class})//判断文件中有没有这个类(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding",value = {"enabled"},matchIfMissing = true)
//判断配置文件中是否存在这个配置属性(server.servlet.encoding.enabled),后面的话表示:就算不匹配也返回true。
public class HttpEncodingAutoConfiguration {
private final Encoding properties;//当只有一个有参的构造器的时候就会从配置文件中获取指定的值
public HttpEncodingAutoConfiguration(ServerProperties properties) {
this.properties = properties.getServlet().getEncoding();。
}
ServerProperties.class
@ConfigurationProperties(//从properties文件中获取指定的值
prefix = "server",
ignoreUnknownFields = true
)
public class ServerProperties {//这个类中的属性都可以进行配置
小总结:所有在配置文件中所有可以配置的值,都是在Xxxproperties类中封装着。
这些自动配置类是怎么实现自动配置的呢?(重点)
首先根据不同的条件(条件以Conditinal后面跟着的这些)判断当前这个自动配置类是0否生效,一旦配置类生效,这个配置类就会给容器中添加各种组件,这些组件是从对应的Xxxproperties文件中获取的,这些类中的每一个属性都是可以在配置文件中配置的。
精髓:
1)、SpringBoot启动会加载大量的自动配置类
2)、我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;
3)、我们再来看这个自动配置类中到底配置了哪些组件; ( 只要我们要用的组件有,我们就不需要再来配置了)
4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指
定这些属性的值;
怎么知道那些自动配置的类会生效呢?
配置文件中添加配置:debug=true。控制台就会打印自动配置报告