• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

springboot 学习(一) springboot简述 及其启动类自动配置

开发技术 开发技术 3小时前 3次浏览

简述:

  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;
    }

通过导入依赖的,可见这个路径下代码如下:

可见自动配置的类就是该路径的这些类

springboot 学习(一) springboot简述 及其启动类自动配置

 

 

 

随便点一个配置类进行查看: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 该注解会自动配置类的属性,所以springboot帮我们配置的都是一些默认属性

例如:@EnableConfigurationProperties(ServerProperties.class)

表明会自动配置属性,进如这个{ServerProperties.class},可以看见有个注解@ConfigurationProperties,表明

springboot 学习(一) springboot简述 及其启动类自动配置

 

 


喜欢 (0)