SpringBoot-自动配置原理,顺带复习下元注解

9 篇文章 0 订阅
6 篇文章 0 订阅

简单阐述springboot-自动配置的原理

  • springboot中有一个spring-boot-autoconfigure-2.0.7.RELEASE.jar的包
  • 在这里插入图片描述
  • 可以看到这里有很多场景的配置

比如配置了starter-web ;首先看到主程序下图:

  • 在这里插入图片描述
  • 可以看到传进去了主程序的类,根据反射机制,框架是可以获取到这个类上标记的注解;主程序标注了 @SpringBootApplication注解相当于标注了@EnableAutoConfiguration
  • 而==@EnableAutoConfiguration==开启了springboot的自动配置功能
现在我们进入@SpringBootApplication注解:
  • 在这里插入图片描述

  • 可以看到上面的元注解:第一个@Target注解可以设置这个注解能加到那个地方;让我们进入看看就知道了

  • 在这里插入图片描述

  • 第二个 @Retention(RetentionPolicy.RUNTIME) 标示的是什么时候起作用 同样也进入 RetentionPolicy看看还有啥时期起作用,所以因为这个注解是运行时起作用,所以利用反射机制可以读取到这个注解;

  • 在这里插入图片描述

  • 第三个元注解 @Documented 的注释,他的作用是我的这个注释在生成api文档的时候要生成一篇文档里

  • 第四个元注解 @Inherited的注释,作用是这个注释可以通过继承到子类,b继承a,b也有这个注释;

  • 第五个:@SpringBootConfiguration 进入可以看到:里面有==@Configuration==注解,可以知道@SpringBootConfiguration=@Configuration,作用一摸一样

  • 在这里插入图片描述

  • 最重要的是==@EnableAutoConfiguration==注解;如下图:

  • 在这里插入图片描述

在==@EnableAutoConfiguration注解 可以看到里面有一个@Import(AutoConfigurationImportSelector.class)== 注解,把一个类给引入进来,然后虚拟机就去加载这个类;自动配置选择性导入类,现在进入这个类:
  • 在这里插入图片描述
然后在进入这个方法中看具体实现:
  • 在这里插入图片描述
  • 可以看到我选中的代码行获取了一堆配置,下面就是对这些配置进行的一些操作,进入这个getCandidateConfigurations方法,看一下如何拿到这些配置
  • 在这里插入图片描述
  • 可以看到这个方法是进行一个load操作才拿到这些配置参数,穿进去的是getSpringFactoriesLoaderFactoryClass() ,现在进入这个方法就可以知道这个工厂到底是什么,如下图:
  • 在这里插入图片描述
  • 返回的是EnableAutoConfiguration.class,所以说就是根据这个类去加载了我们的一些配置;现在我们的思路就清晰了,先把这个类的全限定类名拿到 org.springframework.boot.autoconfigure.EnableAutoConfiguration ,那么通过这个类名我们就要去找他加载的配置
  • 核心的地方 在我们的项目中的jar包,也就是本文的第一张图片,这里面有一个spring.factories文件,这个是属性文件,通过查找,可以找到以这个键值对;值是在 “=“ 的后面,”/“ 是换行的意思,这个值很长,而且是通过==“,”==来分隔;可以看到有很多类,我一个屏幕都没选不完,这里面的每一个类都是配置类(都是以Configuration结尾),大概有118个配置类 springboot配置这么多配置类,只要我们把starter的模块一引入,这118个配置类中就会有相关的配置会起作用
  • 在这里插入图片描述
  • 比如starter-web中会有org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration 这个配置类,现在我们进入这个配置累:
  • 在这里插入图片描述
  • 看到这个org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration类的注解
  • 第一个是@COnfiguration 代表这个是一个配置类
  • 接下来三个注解是以==@Conditional==开头的条件注解,只有满足条件,我们这个配置类才会被加载被起作用,第一个条件注解是确定是不是一个web应用项目,类型为servlet;接下来的两个也如同字面意思一样
  • @AutoConfigureOrder 排序
  • @AutoConfigureAfter在这个配置类什么之后起作用,
且可以看到org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration类总的方法返回的对象也是我们所属性的
  • 在这里插入图片描述
  • 比如生成HiddenHttpMethodFilter.class然后返回,且方法上有==@bean== 生成一个bean对象,好比在xml中的 ,id就是方法名;xml生成bean对象是通过反射,注解@bean可以直接new出对象,面向对象编程;生成的速度对比反射<直接new<克隆;
接下来可以在这找到我们使用过的jsp视图解析器
  • 在这里插入图片描述
  • 还可以可以看到这一个属性类mvcProperties,所以每一个Configuration的配置累会对应一个properties的属性类,这个属性类就是用来加载我们的配置的;他就是用来修改我们boot框架的出厂设置,比如这个类如果你不设置前后缀,他会有默认的前后缀;
  • 进入这个属性类:
  • 在这里插入图片描述
  • 可以看到这个注解==@ConfigurationProperties(prefix = “spring.mvc”)== 只要你配置spring.mvc.开头的属性就可以神效,比如在application.properties中配置:spring.mvc.view.prefix=/templates/;spring.mvc.view.suffiix=/.jsp;配置生效;

其他的配置类查看的方法和上面一样,

最后总结:

  • 简单过一遍自动配置原理
    –1、主程序类标注了@SpringBootApplication注解相当于标注了@EnableAutoConfiguration

– 2、@EnableAutoConfiguration 开启SpringBoot的自动配置功能

  • 就会自动的将所有的自动配置类导进来
    如:HttpEncodingAutoConfiguration(http编码的自动配置)
    – 1、@ConditionalOnXX根据当前系统环境判断我这个类的所有配置是否需要生效
    – 2、会发现这些配置类中使用@Bean给容器中放了好多组件,这些组件就生效;
    – 3、这些组件会从一个类中(配置文件属性值的封装类)获取到它应该使用的值是什么。比如HttpEncodingProperties获取charset
    – 4、这写配置文件值的封装类都是和配置文件一一绑定
    @ConfigurationProperties(prefix = “spring.http.encoding”)
    HttpEncodingProperties

使用心得

  • 1)、SpringBoot帮我们配好了所有的场景
  • 2)、SpringBoot中会有很多的 xxxxAutoConfigurarion(帮我们给容器中自动配好组件)
  • 3)、xxxxAutoConfigurarion给容器中配组件的时候,组件默认的属性一般都是从 xxxProperties中获取这些属性的值
  • 4)、xxxProperties 是和配置文件绑定的(属性一一对应)
  • 5)、通过application.properties文件;我们可以改掉这些默认配置即可;
  • 6)、如果默认的组件我们不用可以不引入;@Bean
    @ConditionalOnMissingBean:容器中没这个组件
    public InternalResourceViewResolver defaultViewResolver()
    SpringBoot的一个最大策略:自定义组件用自己的,否则,使用默认的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值