SpringBoot内置http编码功能为例分析自动配置过程
AutoConfiguration事件注册在完成了以上步骤的过滤、筛选之后 , 我们最终获得了要进行自动配置的类的集合 , 在将该集合返回之前 , 在 AutoConfigurationlmportSelector 类中完 成的最后一步操作就是相关事件的封装和广播 , 相关代码如下 。
private void fireAutoConfigurationImportEvents(List configurations, Set exclusions) {List listeners = getAutoConfigurat ionImportL isteners();if (!listeners. isEmpty()) {AutoConfigurationImportEvent event = new AutoConfigurationImportEvent(this,onfigurations, exclusions);for (AutoConfigurationImportListener listener : listeners) {invokeAwareMethods (listener);listener . onAutoConf igurationImportEvent(event);}}protected List getAutoConfigurat ionImportLis-teners() {return SpringFactoriesLoader . loadFactories (AutoConf igurationImportL istener.class ,this . beanClassLoader);}
以上代码首先通过 SpringFactoriesLoader 类提供的 loadFactories 方法将 spring.factories中配置的接口 AutoConfigurationlmportListener 的实现类加载出来 。 然后 , 将筛选出的自动配置类集合和被排除的自动配置类集合封装成 AutoConfigurationImportEvent 事件对象 , 并传入该事件对象通过监听器提供的 onAutoConfigurationlmportEvent 方法 , 最后进行事件广播 。 关于事件及事件监听相关的内容不在此过多展开 。
spring.factories 中自动配置监听器相关配置代码如下 。
org. springframework . boot . autoconfigure . AutoConfigurat ionImportL istener=org .springframework . boot . autoconfigure . condition . ConditionEvaluat ionReportAutoConfigurationImportListener
@Conditional 条件注解前 面 我 们 完 成 了 自 动 配 置 类 的 读 取 和 筛 选,在 这 个 过 程 中 已经涉及了像@Conditional-OnClass 这 样 的 条 件 注 解。打 开 每 一 个 自 动 配 置 类,我 们 都 会 看 到@Conditional 或其衍生的条件注解 。 下面就先认识一 下 @Conditional 注解 。
认识条件注解
@Conditional 注解是由 Spring 4.0 版本弓|入的新特性 , 可根据是否满足指定的条件来决定是否进行 Bean 的实例化及装配 , 比如 , 设定当类路径下包含某个 jar 包的时候才会对注解的类进行实例化操作 。 总之 , 就是根据一-些特定条件来控制 Bean 实例化的行为 , @Conditional 注解代码如下 。
@Target({ElementType. TYPE, ElementType .METHOD})@Retent ion(RetentionPolicy . RUNTIME)@Documentedpublic @interface Conditional {Class extends Condition>[ ] value();}
@Conditional 注解唯一的元素 属性是接口 Condition 的数组 , 只有在数组中指定的所有Condition 的 matches 方法都返回 true 的情况下 , 被注解的类才会被加载 。 我们前面讲到的OnClassCondition 类就是 Condition 的子类之一 , 相关代码如下 。
@FunctionalInterfacepublic interface Condition {//决定条件是否匹配boolean matches (ConditionContext context, AnnotatedTypeMetadata metadata);}
matches 方法的第一个参数为 ConditionContext, 可通过该接口提供的方法来获得 Spring应用的上下文信息 , ConditionContext 接口定义如下 。
public interface ConditionContext {//返 BeanDefinitionRegistry 注册表 , 可以检 查 Bean 的定义BeanDefinitionRegistry getRegistry();//返回 ConfigurableL is tableBeanFactory, 可以检查 Bean 是否已经存在 ,进-步检查Bean属性@NullableConfigurableL istableBeanFactory getBeanFactory();//返回 Environment,可以获得 当前应用环境变量 , 检测当前环境变量是否存在Environment getEnvironment();//返 ResourceLoader,用于读取或检查所加载的资源ResourceLoader getResourceLoader();//返回 ClassLoader,用于检查类是否存在@NullableClassLoader getClassLoader();}
推荐阅读
- 外接内置一样快!希捷Xbox Series X存储扩展卡评测
- 传三星Z Fold3将内置S Pen内外屏尺寸变小但幅度不大
- 内置动画私教课程,约一只护腕重量,华为WATCH FIT全新发布
- 喜马拉雅推出 AI 真无线耳机 内置听书功能
- 三星Galaxy A52 4G规格出现在Geekbench上 内置骁龙720G
- 仅重75克 OneUP更新内置舵管工具
- SpringBoot常用注解
- 一文教你如何搭建http游戏服务器
- 阿里爆款SpringBoot项目实战PDF+源码+视频分享
- 华科隆20W快充充电器拆解,竟然内置这套超级硅方案,用料真猛