试图探索springboot自动配置实现原理

springboot自动配置原理探索

回顾我们以前的SSM项目,为了启动项目实现特定功能必须要引入一大堆配置。像包括我们老的HAP,HMAP框架就是典型代表。springboot的目的

Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention over configuration and is designed to get you up and running as quickly as possible.

就是为了让我们简化各种xml配置,达到开箱即用的效果。在使用springboot的过程中,需要什么第三方依赖只需要引入特定的启动器就可以实现相应配置的引入,而这背后的原因是什么呢?有点好奇,趁着周末来总结一波。

从上文springboot完成CRUD的Demo来看,一样是MVC三层,可是却没了以前的什么springMvc.xml。甚至日志也没有引入logback.xml却能通过yaml文件配置打印出各种级别的日志。对比以往的ssm项目,发现多的就是这个*Application结尾的类和一个application.yaml文件,那么看来奥妙就在这里面了,我们一起来看看吧!

这个类的构成:一个注解,一个run方法,其他的没了…

前奏:需要引入源码,右上角点击下载源码,IDEA是CTRL+ALT+方向箭头来进行步骤的回退和前进

我们先来看注解:@SpringBootApplication


@SpringBootApplication
public class ProducerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProducerApplication.class, args);
    }
}

点进去,嗯,出来了下面一大堆注解:

@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) })
public @interface SpringBootApplication {

元注解不用管,我们先来看看:@SpringBootConfiguration这个注解

在这里插入图片描述

这样乍一看,没啥东西啊,就一个@Configuration,这个注解用来表明这个类是一 配置 类,包含 在 Spring 应用 上下文中如何创建 bean的细节。

我们再来看看这个注解 @EnableAutoConfiguration //启用自动配置


在这里插入图片描述

凭什么我们的控制器没加扫描配置能起作用呢?

在这里插入图片描述

@ComponentScan

在这里插入图片描述

这样的好处就是不管是spring的扫描配置还是springmvc的配置都交给了一个容器去扫描加载,避免了父子容器带来异常情况!

启用了自动配置,为什么能自动配置呢,从上面我们没看出答案来,那我们试着来看看这个所谓启动类的另一个特殊之处run方法能不能让我们找到答案吧!

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

从反射的代码看出,这个names有点东西啊

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

看来是通过类加载器来加载classpath下面的META-INF/spring.factories下面的文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
还记得那个猜测是否生效的注解嘛,其实它也是通过下面这些条件来判断是否生效而已。注解自动生效条件:

@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 })

总结:实际上自动配置是通过预先定义一个类,将所有的配置定义好。然后去读我们的yaml或yml或properties文件,如果有相关配置则预先定义的配置就自动生效了。其实也告诉了我们一个信息,我们有两种方式去覆盖springboot的配置,一种是同一路径下java类覆盖,一种是配置文件如yaml的方式来覆盖。不知道说明了没有呢…(#.#)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值