iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解Spring的autowire-candidate设计
  • 206
分享到

详解Spring的autowire-candidate设计

2024-04-02 19:04:59 206人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录Xml配置文件中的default-autowire-candidates属性匹配逻辑算法PatternMatchUtils.simpleMatch总结Xml配置文件中的defau

Xml配置文件中的default-autowire-candidates属性

有的同学对这个配置可能不熟悉或者说都不知道这个配置的存在,那首先我们看下default-autowire-candidates这个配置是放在何处的:


<beans xmlns="Http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
         default-autowire-candidates="service*">

    <bean id="serviceA" class="org.wonder.frame.xmlConfig.SetterBean$ServiceA" autowire-candidate="false"/>
    <bean id="serviceB" class="org.wonder.frame.xmlConfig.SetterBean$ServiceB"  />
    <bean id="setterBean" class="org.wonder.frame.xmlConfig.SetterBean" autowire="byType" />
</beans>

idea中我们可以点开 default-autowire-candidates这个属性所在的spring-beans.xsd就能看到官方对这个属性的注释:

A default bean name pattern for identifying autowire candidates: e.g. "Service", "data", "Service", "dataService". Also accepts a comma-separated list of patterns: e.g. "Service,*Dao". See the documentation for the 'autowire-candidate' attribute of the 'bean' element for the semantic details of autowire candidate beans.

简单翻译下也就是说这个属性可以标示配置文件中的所有Bean默认能否成为自动注入候选者的名称匹配模式,比如 "Service", "data", "Service", "dataService".也支持以逗号分隔的字符串模式列表:"Service,Dao". 比如上面配置文件中配置的service\就匹配了serviceA,serviceB两个Bean.但是Spring的设计规定serviceA自身配置的autowire-candidate为false会覆盖default-autowire-candidates配置,所以serviceA是不会成为自动注入的候选者。

匹配逻辑算法

我们深入到源码中看下Spring是如何根据这个匹配模式来与自身bean名称来匹配的


String autowireCandidate = ele.getAttribute(AUTOWIRE_CANDIDATE_ATTRIBUTE);
if ("".equals(autowireCandidate) || DEFAULT_VALUE.equals(autowireCandidate)) {
   String candidatePattern = this.defaults.getAutowireCandidates();
   if (candidatePattern != null) {
      String[] patterns = StringUtils.commaDelimitedListToStringArray(candidatePattern);
      bd.setAutowireCandidate(PatternMatchUtils.simpleMatch(patterns, beanName));
   }
}
else {
   bd.setAutowireCandidate(TRUE_VALUE.equals(autowireCandidate));
}

很清楚,在bean本身配置autowire-candidate为空或者默认的情况下,Spring会把default-autowire-candidates字符串转换成数组,然后依赖PatternMatchUtils类的simpleMatch方法来验证当前bean的名称是否匹配,成功与否都会赋值给当前bean的autowireCandidate属性。其实最主要的还是PatternMatchUtils.simpleMatch方法

PatternMatchUtils.simpleMatch


public static boolean simpleMatch(@Nullable String pattern, @Nullable String str) {
   //pattern 匹配模式为空 或者待匹配字符串为空就返回false
   if (pattern == null || str == null) {
      return false;
   }
   //找到第一个* 在匹配模式字符串中的的索引
   int firstIndex = pattern.indexOf('*');
   if (firstIndex == -1) {
      //索引为空的情况下就代表 模式字符串要和待匹配字符串相等。
      return pattern.equals(str);
   }
   //*在第一位
   if (firstIndex == 0) {
      //*在第一位 且匹配模式字符串长度为1 那就直接返回true ,比如 *
      if (pattern.length() == 1) {
         return true;
      }
      //找到下一个*的起始位置
      int nextIndex = pattern.indexOf('*', firstIndex + 1);
      if (nextIndex == -1) {
         //如果没有*了,就判断 待匹配的字符串是否是以pattern结尾的。
         //比如*service   Aservice就满足这种情况
         return str.endsWith(pattern.substring(1));
      }
      //截取第一个* 和之后一个* 之间的字符串
      String part = pattern.substring(1, nextIndex);
      if (part.isEmpty()) {
         return simpleMatch(pattern.substring(nextIndex), str);
      }
      //str 是指待匹配的字符
      int partIndex = str.indexOf(part);
      while (partIndex != -1) {
         if (simpleMatch(pattern.substring(nextIndex), str.substring(partIndex + part.length()))) {
            return true;
         }
         //从partIndex+1 开始计算part的索引
         partIndex = str.indexOf(part, partIndex + 1);
      }
      return false;
   }
   //待匹配字符串的长度比 第一个*的索引 大或者相等的情况下
   //截取模式字符串 0 到 第一个*号之间的字符串 ,截取 待匹配字符串 0 到 第一个*号之间的字符串 对比
   //如果相等 ,再截取 模式字符串  第一个*号之后的字符串 和 待匹配 字符串  第一个*号之后的字符串 去做匹配
   return (str.length() >= firstIndex &&
         pattern.substring(0, firstIndex).equals(str.substring(0, firstIndex)) &&
         simpleMatch(pattern.substring(firstIndex), str.substring(firstIndex)));
}

这个Utils类的工具函数实现的字符串模糊匹配算法在我们日常开发中对字符串的操作方面也会有或多或少的帮助。

总结

Spring中的很多设计细节总是给我们很多惊喜,从中我们也可以很多小技巧,给我们日常开发会带来不少启发。

以上就是详解Spring的autowire-candidate设计的详细内容,更多关于Spring的autowire-candidate设计的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解Spring的autowire-candidate设计

本文链接: https://www.lsjlt.com/news/128827.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Spring的autowire-candidate设计
    目录Xml配置文件中的default-autowire-candidates属性匹配逻辑算法PatternMatchUtils.simpleMatch总结Xml配置文件中的defau...
    99+
    2024-04-02
  • Spring设计模式中代理模式详细讲解
    目录一、场景模拟二、提出问题三、代理模式1.静态代理2.动态代理一、场景模拟 ①声明接口 声明计算器接口Calculator,包含加减乘除的抽象方法 public interface...
    99+
    2023-01-03
    Spring代理模式 Spring设计模式
  • Spring计时器stopwatch使用详解
     StopWatch是位于org.springframework.util包下的一个工具类,通过它可方便的对程序部分代码进行计时(ms级别),适用于同步单线程代码块。 正...
    99+
    2024-04-02
  • MVC+DAO设计模式下的设计流程详解
    DAO设计 :     DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模...
    99+
    2023-05-30
    mvc dao设计模式 下的
  • SQLServer数据库的设计详解
    一、数据库设计的必要性 在实际的软件项目中,如果系统中需要存储的数据量比较大,需要设计的表比较多,表与表之间的关系比较复杂,那我们就需要进行规范的数据库设置。如果不经过数据库的设计,...
    99+
    2024-04-02
  • 详解Django的MVT设计模式
    目录经典的MVC设计模式及其优点Django是如何遵循MVC设计模式的?示例新建app并注册创建模型(M)编写视图并配置路由URL(V)编辑模板(T)小结经典的MVC设计模式...
    99+
    2024-04-02
  • MongoDB 模式设计详解
    目录注意事项限制条件访问模式关系类型范式化和反范式化基本概念范式化选择模型设计小技巧指导原则删除旧数据一致性管理模式迁移模式管理编写代码来处理数据完整性问题注意事项 模式设计,即在文档中表示数据的方式,对于数据表示来说时...
    99+
    2022-12-26
    mongodb模式设计 mongodb应用设计模式 MongoDB数据模型的设计模式
  • MongoDB模式设计详解
    目录注意事项限制条件访问模式关系类型范式化和反范式化基本概念范式化选择模型设计小技巧指导原则删除旧数据一致性管理模式迁移模式管理编写代码来处理数据完整性问题注意事项 模式设计,即在文...
    99+
    2022-12-26
    mongodb模式设计 mongodb应用设计模式 MongoDB数据模型的设计模式
  • ImageCombiner设计源码详解
    前言 在前面的博客中介绍了一款Java的海报生成器ImageCombiner,原文地址: 拿来就用的Java海报生成器ImageCombiner(一),在博文中简单介绍了一下代码以及一个真实的生成案例。但是对源码的介绍不多,本文...
    99+
    2023-09-04
    java 自定义海报 Powered by 金山文档
  • Java设计模式——工厂设计模式详解
    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。工厂模式的形态工厂模式主要用一下几种形态:简单工厂(Simple Factory)。2:工厂方法(Factory Method)。3:抽象工厂(Abstract...
    99+
    2023-05-30
    java 设计模式 ava
  • 解读Spring框架中常用的设计模式
    目录一、浅谈控制反转(IOC)与依赖注入(DI)二、Spring框架中的设计模式1)工厂设计模式(简单工厂和工厂方法)2)单例设计模式3)代理设计模式4)模板方法设计模式5)观察者设...
    99+
    2022-12-23
    Spring框架 Spring设计模式 Spring常用设计模式
  • Java设计模式之原型设计示例详解
    目录简单说一下(定义)稍微夸一下(优缺点)顺便提一下(适用场景)着重讲一下(深、浅克隆)多多用一下(结构、代码实现)简单说一下(定义) 什么是原型模式:原型模式是用于创建重复的对象,...
    99+
    2024-04-02
  • spring的设计模式有哪些
    这篇文章主要讲解了“spring的设计模式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring的设计模式有哪些”吧!1. 简单工厂又叫做静态工厂方法(StaticFactory ...
    99+
    2023-06-03
  • java 中设计模式(装饰设计模式)的实例详解
    java 中设计模式(装饰设计模式)的实例详解应用场景:在不对原有对象类进行修改的基础上,给一个或多个已有的类对象提供增强额外的功能. 我觉得可以从字面理解,装饰,装饰房子。房子可以看成原有的类。等于你把一个已经建好的房子按照自己的想法再装...
    99+
    2023-05-31
    java 装饰模式 ava
  • Spring boot跨域设置实例详解
    定义:跨域是指从一个域名的网页去请求另一个域名的资源1.原由公司内部有多个不同的子域,比如一个是location.company.com ,而应用是放在app.company.com , 这时想从 app.company.com去访问 lo...
    99+
    2023-05-30
    springboot 跨域设置 spring boo
  • PHP 设计模式实战详解
    设计模式为软件设计提供经过验证的解决方案,解决常见编程问题。本文深入探讨 php 中的常用设计模式,并通过实战案例进行阐述,涵盖单例模式、工厂方法模式和观察者模式。 PHP 设计模式实...
    99+
    2024-05-07
    php 设计模式 mysql
  • MySQL架构设计思想详解
    目录前言1. MySQL整体架构2. 连接器3. 查询缓存4. 分析器5. 优化器6. 执行器7. 总结前言 很多开发同学对SQL优化如数家珍,却对MySQL架构一知半解。岂不是只见...
    99+
    2022-11-13
    MySQL架构设计 架构设计
  • JavaScript框架设计模式详解
    目录mvcmvpmvvmvue的来源spa mpacreateElementclass总结mvc Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可...
    99+
    2024-04-02
  • MySQL通透详解架构设计
    系统只要能从数据库连接池获取到一个数据库连接,就能执行CRUD。可通过数据库连接将待执行SQL发给MySQL。 大部分 crud boy只知道: 执行insert语句后,在...
    99+
    2024-04-02
  • Dubbo架构整体设计详解
    目录一、Dubbo调用关系说明1.1 组成部分1.2 启动和执行流程说明二、整体调用链路三、Dubbo整体设计一、Dubbo调用关系说明 1.1 组成部分 在这里主要由四部分组成:...
    99+
    2023-05-15
    Java Dubbo架构整体设计 Dubbo架构整体设计 Java Dubbo
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作