当前位置: 首页 > news >正文

做网站的实践报告微网站模板制作教程

做网站的实践报告,微网站模板制作教程,高新营销型网站建设公司,宝塔为wordpress安装redis走近 AutoConfigurationImportFilter 引言往期内容主要内容1. match 方法2. ClassNameFilter 枚举类3. filter 方法 总结 引言 前两篇博文笔者带大家从源码深入了解了 Spring Boot 的自动装配流程#xff0c;其中自动配置过滤的实现由于篇幅限制#xff0c;还未深入分析。 … 走近 AutoConfigurationImportFilter 引言往期内容主要内容1. match 方法2. ClassNameFilter 枚举类3. filter 方法 总结 引言 前两篇博文笔者带大家从源码深入了解了 Spring Boot 的自动装配流程其中自动配置过滤的实现由于篇幅限制还未深入分析。 那么从本篇开始Huazie 就带大家走近 AutoConfigurationImportFilter一起从源码解析 FilteringSpringBootCondition、OnBeanCondition、OnClassCondition、OnWebApplicationCondition 的实现。 往期内容 在开始本篇的内容介绍之前我们先来看看往期的系列文章【有需要的朋友欢迎关注系列专栏】 Spring Boot 源码学习 Spring Boot 项目介绍 Spring Boot 核心运行原理介绍 【Spring Boot 源码学习】EnableAutoConfiguration 注解 【Spring Boot 源码学习】SpringBootApplication 注解 【Spring Boot 源码学习】走近 AutoConfigurationImportSelector 【Spring Boot 源码学习】自动装配流程源码解析上 【Spring Boot 源码学习】自动装配流程源码解析下 主要内容 在开始本篇内容之前我们再次来回顾一下上篇博文介绍的 AutoConfigurationImportFilter 的源码和相关的类图 FunctionalInterface public interface AutoConfigurationImportFilter {// 自动配置组件的过滤匹配boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata); }通过上面的关联类图我们可以看到 AutoConfigurationImportFilter 接口实际上是由抽象类 FilteringSpringBootCondition 来实现的另外翻看它的源码该抽象类还定义了一个抽象方法 getOutcomes 然后 OnBeanCondition、OnClassCondition、OnWebApplicationCondition 继承该抽象类实现 getOutcomes 方法完成实际的过滤匹配操作。 本篇我们就从源码入手重点介绍 FilteringSpringBootCondition 1. match 方法 上一篇博文我们已经从 FilteringSpringBootCondition 的部分源码进行了分析它的 match 方法主要是调用 getOutcomes 方法并将其返回的结果转换成布尔数组。而这个 getOutcomes 方法是过滤匹配的核心功能由抽象类 FilteringSpringBootCondition 的子类来实现它。 这里再简单回顾一下 match 方法的处理逻辑 Override public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {ConditionEvaluationReport report ConditionEvaluationReport.find(this.beanFactory);// 调用 由子类实现的 getOutcomes 方法完成实际的过滤匹配操作ConditionOutcome[] outcomes getOutcomes(autoConfigurationClasses, autoConfigurationMetadata);boolean[] match new boolean[outcomes.length];// 将 getOutcomes 方法返回结果转换成布尔数组for (int i 0; i outcomes.length; i) {match[i] (outcomes[i] null || outcomes[i].isMatch());if (!match[i] outcomes[i] ! null) {logOutcome(autoConfigurationClasses[i], outcomes[i]);if (report ! null) {report.recordConditionEvaluation(autoConfigurationClasses[i], this, outcomes[i]);}}}return match; }上述代码中我们可以看到将 getOutcomes 方法返回结果转换成布尔数组的循环逻辑中有一段代码如下 match[i] (outcomes[i] null || outcomes[i].isMatch());这里是将返回结果转换成布尔值分别是 如果匹配结果为 null 认为符合匹配要求 设置 match[i] true如果匹配结果不为 null并且 匹配对象的 isMatch true也认为符合匹配要求 设置 match[i] true 这个时候我们就能理解 上篇博文讲到的 不符合过滤匹配要求则清空当前的自动配置组件 的逻辑 当然 FilteringSpringBootCondition 内还有其他的内容这些内容在它的子类中也将使用到我们先提前了解下以便后续能更好地理解子类的功能实现。 2. ClassNameFilter 枚举类 首先查看 ClassNameFilter 枚举类的源码【Spring Boot 2.7.9】 protected enum ClassNameFilter {PRESENT {Overridepublic boolean matches(String className, ClassLoader classLoader) {return isPresent(className, classLoader);}},MISSING {Overridepublic boolean matches(String className, ClassLoader classLoader) {return !isPresent(className, classLoader);}};abstract boolean matches(String className, ClassLoader classLoader);// ....}ClassNameFilter 枚举类包含两个枚举常量分别是 PRESENT 和 MISSING这两个枚举常量都实现了 ClassNameFilter 枚举类定义的 matches 的抽象方法其中 PRESENT 中的 matches 返回 isPresent(className, classLoader);MISSING 中的 matches 返回 !isPresent(className, classLoader); 我们继续看 isPresent 方法分析一下它的功能 static boolean isPresent(String className, ClassLoader classLoader) {if (classLoader null) {classLoader ClassUtils.getDefaultClassLoader();}try {resolve(className, classLoader);return true;}catch (Throwable ex) {return false;} }protected static Class? resolve(String className, ClassLoader classLoader) throws ClassNotFoundException {if (classLoader ! null) {return Class.forName(className, false, classLoader);}return Class.forName(className); }上述 isPresent 方法的逻辑其实也并不复杂就是通过类加载器去加载指定的类【即 className 字符串对应的类】 如果指定的类加载成功则直接返回 true如果指定的类加载失败则要抛出异常捕获异常后返回 false。 那显然 ClassNameFilter.PRESENT.matches(className, classLoader) 用于校验指定的类是否加载成功 如果指定的类加载成功则返回 true如果指定的类加载失败则返回 false。 而 ClassNameFilter.MISSING.matches(className, classLoader) 用于校验指定的类是否加载失败 如果指定的类加载失败则返回 true如果指定的类加载成功则返回 false。 3. filter 方法 继续翻看 FilteringSpringBootCondition 源码还有一个 filter 方法需要重点介绍下 protected final ListString filter(CollectionString classNames, ClassNameFilter classNameFilter, ClassLoader classLoader) {if (CollectionUtils.isEmpty(classNames)) {return Collections.emptyList();}ListString matches new ArrayList(classNames.size());for (String candidate : classNames) {if (classNameFilter.matches(candidate, classLoader)) {matches.add(candidate);-}}return matches; }结合上面的 ClassNameFilter 枚举类我们可以很容易理解上面的代码逻辑。 如果 classNameFilter 是 ClassNameFilter.PRESENT则 filter 方法获取指定的类集合中加载成功的类集合【即匹配成功的类集合】如果 classNameFilter 是 ClassNameFilter.MISSING则 filter 方法获取指定的类集合中加载失败的类集合【即匹配失败的类集合】。 总结 本篇 Huazie 带大家介绍了自动配置过滤匹配的核心父类 FilteringSpringBootCondition这对于笔者后续博文详解它的三个子类【OnBeanCondition、OnClassCondition、OnWebApplicationCondition】非常重要敬请期待。
http://www.hkea.cn/news/14549362/

相关文章:

  • 如题,HTML如何将两张图片_一张放在网站顶部做背景,另一张放在尾部做背景?网站建设的费用结构包括
  • 网站怎么做移动的窗口wordpress自定义附近上传路径
  • 外贸 网站推广宁波做网站seo的
  • 做衣服上哪些网站网站后台怎么添加代码
  • 做章的网站网站上的高清动态图怎么做的
  • 网上商城建站服务商猪八戒包装设计
  • 手机网站智能管理系统马尔康网站建设
  • 又拍网站怎么做的郑州网站托管助企
  • 河南做网站公司网页编辑软件免费版
  • 成都网站关键词推广wordpress后台生成密码不管用
  • 网站建设 荆州微信公众号制作模板免费
  • 网站建设调查表淮南服装网站建设地址
  • 各家建站平台做图片能去哪些网站吗
  • wordpress建站 客户端网站制作超链接怎么做
  • 源代码开发网站wordpress网页宽度
  • seo01网站在网站写小说怎么做封面
  • 英文集团网站设计建设qq注册账号免费申请
  • 求个网站这么难吗2021年可以做书的网站
  • 有云服务器怎么做网站专门做美食的网站6
  • 免费网站制作作业营销手机网站版面
  • 无锡网站设计企业做网站公司怎么做
  • 襄阳网站排名优化wordpress自定义类型模板
  • 网站备案好麻烦浙江网站建设哪里有
  • 扶贫网站建设中国建设银行校园招聘网站
  • 合理的网站结构西宁站 网站
  • 专业的营销型网站建设公司广州设计公司前十名
  • 佛山网站排名优化济南网络安全公司
  • 做矢量图的网站有啥创意可以做商务网站的
  • 无锡建设局网站对网站建设功能的情况说明
  • 作网站流程域名系统