springboot 学习(一) springboot简述 及其启动类自动配置
简述:
springboot是一个javaweb的的开发框架,但它不是一个新的框架,他默认配置了很多框架的使用方式,是一个整合了其他框架,其他资源包的框架,同时在pom.xml中,对于其要导入的资源的明确版本,省去了开发中的一些版本冲突。同时它有一个开箱即用的特点,可以自动配置这些配置类,并提供对应模板给我们用。
启动类即自动配置:
当一个类有了@SpringBootApplication这个注解他就是主启动类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用
@SpringBootApplication
public class Springboot02ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot02ConfigApplication.class, args);
}
}
进入这个注解,可以看到他还有其他注解,如下:
前四个为元注解,第五个注解@SpringBootConfiguration,点进去,可以看到他有一个注解:@Configuration, 表明他是一个配置类,相当于是一个spring配置文件
springboot的核心是第六个注解@EnableAutoConfiguration,开启自动配置功能,以前我们需要自己手动配的东西,现在springboot帮我们配
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
进入@EnableAutoConfiguration注解,如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
这个注解主要有以下两个注解:
@AutoConfigurationPackage 这个注解进去后有一个@Import(AutoConfigurationPackages.Registrar.class)注解,如下:
@import :Spring底层注解@import , 给容器中导入一个组件 可以导入三种形式
AutoConfigurationPackages.Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器 所以以后的类只要有了@component这个注解,就表示是一个组件,并且扫描到了spring容器;
这个分析完了,退到上一步,继续看
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
@Import({AutoConfigurationImportSelector.class}) :给容器导入组件 ;
AutoConfigurationImportSelector :自动配置导入选择器,那么它会导入哪些组件的选择器呢?我们点击去这个类看源码
这个类代码有点多,需要自行去查看,有一出源码如下:
看见,自动配置的类是在这个路径下查找 META-INF/spring.factories.
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
通过导入依赖的,可见这个路径下代码如下:
可见自动配置的类就是该路径的这些类

随便点一个配置类进行查看:WebMvcAutoConfiguration 如下:
@Configuration 配置类,是一个组件
@@ConditionalXXXX条件判断,满足才生效,所以自动配的类里,满足条件才会进行配置
- @ConditionalOnWebApplication 是不是一个web项目
- @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) 是否包含这些三个类
- @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) 是否没有这个组件
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
某些自动配置类还存在这个注解 @EnableConfigurationProperties 使配置了@ConfigurationProperties 这个注解的类注册到IOC容器中,将配置文件中对应的值和这个类绑定起来
例如:@EnableConfigurationProperties(ServerProperties.class)
进入ServerProperties.class,可以看见有个注解@ConfigurationProperties,表明这个类会被自动注册,同时也和SpringBoot的配置文件映射
springboot的配置文件 表明我们可以修改默认的配置,学习(二)会讲
、
小扩展 当有个类配置了@ConfigurationProperties,除了在使用他的类上加上@EnableConfigurationProperties 这个注解,也可以在本类中加上@component或者@Configuration 这样也会注册,并且存在容器中
以上就是自动配置的原理了
值得注意的是:
可进行自动配置类的名字都是这样开头了:xxxAutoConfiguration
可进行属性自动配置的类开头都是这样的:xxxProperties
类中条件判断注解:ConditionalOnxxx
精髓
1、SpringBoot启动会加载大量的自动配置类
2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
xxxxAutoConfigurartion:自动配置类;给容器中添加组件
xxxxProperties:封装配置文件中相关属性;
关于ConditionalOn的判断:
使用了狂神的图

那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。
我们怎么知道哪些自动配置类生效?
我们可以通过启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;
#开启springboot的调试类debug=true
Positive matches:(自动配置类启用的:正匹配)
Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)
Unconditional classes: (没有条件的类)
测试如下:





浙公网安备 33010602011771号