黄晓童SPRING学习笔记:对AOP的深入探究

Spring的定义
对DI的初步理解
对AOP的初步理解
对DI的深入探究
对AOP的深入探究
Spring的事务管理
Spring MVC

 下面我将论述一下Spring的AOP。首先,介绍一下AOP的作用:把交叉事务(散布在程序中多个地点的函数)和业务逻辑代码分离开,同时,有些事情也是要被动执行的,比如经典的登录,当用户没有登录的时候,系统会提示登录,而不是在展示页面的时候程序主动的去判断用户有没有登录。这也正是Spring的好处之一。像登录这种代码在系统中是会被用到多次的,代码重用的主要面向对象技术就是委托和继承。而反复继承同一个基类可能会形成很脆弱的对象关系。切面正是这样的一种取代二者的方式。
 接下来我介绍几个AOP的术语,这些术语很重要。
通知:通知定义了切面要完成的工作、以及何时执行这个工作。
连接点:连接点是在程序的执行过程中能够插入切面的一个点,比如方法被调用时、异常抛出时等等。
切入点:一个切面不是要通知程序里所有的连接点的。切入点缩小了切面通知连接点的范围。
切面:通知和切入点的结合。
目标:就是被通知的对象。

 接下来我来创建一个典型的spring切面。因此,首先引入一个场景:观众观看演奏者表演。所以,先定义一个观众类:

public class Audience 
{
  //观众观看表演之前就座
  public void takeSeats()
 {}
  
 //观看表演之前关闭手机
  public void turnOffCellPhones() 
 {}
  
 //表演之后,如果表演成功就鼓掌
  public void applaud() 
 {}
  
 //观看之后,如果表演不好就要求退票
  public void demandRefund() 
 {}
}

 

接下来在xml文件中加入如下定义:

<bean  id="audience"  class="com.springinaction.springidol.Audience"  />

 
 这样,场景就描述完了。当表演者表演的时候,可以先调用观众就座和关闭手机的方法,然后演奏者执行表演方法,如果中途发生异常,就执行观众退票,如果成功就鼓掌。
 当然这是可行的,但是仔细一想会发现多少有点别扭。这不仅将观众类耦合到表演者类里面,而且表演者在表演的过程中,还要举着牌子,负责提示观众关手机,或者鼓掌。因此,这种设计明显是不合理的。
 下面我们就用AOP来改造这个场景,让它变得合理。首先,介绍一下spring的aop中的5种通知类型:执行前通知、返回后通知、抛出后通知、周围通知、引入通知。在这个场景里,会用到前三个通知。就座和关闭手机应该是执行前通知,鼓掌应该是返回后通知,退票应该是抛出后通知。这段通知的代码如下(该通知依赖于观众类):

public class AudienceAdvice implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice
{
  //执行前通知
  public void before(Method method, Object[] args, Object target) throws Throwable
  {
    audience.takeSeats();     //就座
    audience.turnOffCellPhones();     //关闭手机
  }
  
  //返回后通知
  public void afterReturning(Object rtn, Method method, Object[] args, Object target)  
 {
    audience.applaud();    //鼓掌
  }
  
 //抛出后通知
  public void afterThrowing(Throwable throwable) 
  {
    audience.demandRefund();    //退票
  }

  //观众类
  private Audience audience; 
  public void setAudience(Audience audience)
  {
    this.audience = audience;
  }
}

 
 上面类中的每一个方法都是实现三个通知接口之后要求实现的方法。这没什么好说的。只是大家注意一下方法的参数即可。

下面我们以周围通知的方式来实现一下这个场景:

public class AudienceAroundAdvice implements MethodInterceptor
{
  public Object invoke(MethodInvocation invocation) throws Throwable
  {

    try {
      audience.takeSeats();  //就座
      audience.turnOffCellPhones();  //关闭手机
      Object returnValue = invocation.proceed(); //调用目标方法    
      audience.applaud();  //鼓掌    
      return returnValue;
    } 
    catch (PerformanceException  throwable) {
      audience.demandRefund();  //退票
      throw throwable;
    }
  }
  
  //观众类
  private Audience audience;
  public void setAudience(Audience audience) {
    this.audience = audience;
  }
}

 

 周围通知的一个最大的优势就是能够在一个方法中定义前通知和后通知,而且还很简洁。现在我们已经了解了好几种创建通知的方法了,但是还没有提到如何创建切点,没有切点,也就没有切面了。下面我们就来说说切点,spring提供了多种类型的切点。两种最常用的就是正则表达式切点和AspectJ表达式切点。首先来看正则表达式切点。
 还记得前面提到的表演者的类吗?每个表演者都实现了一个perform方法。现在我们要做的就是,在每个表演者表演的时候(执行perform方法时),插入上述定义的观众的行为。

切点的定义如下:该正则表达式匹配所有类中含有名为“perform”的方法。

<bean id="audiencePointcut" 
     class="org.springframework.aop.support.JdkRegexpMethodPointcut">
    <property name="pattern"  value=".*perform" />
</bean>

 

然后,我们需要把上述切点与通知相关联,定义如下bean:

<bean id="audienceAdvisor"
      class="org.springframework.aop.support.DefaultPointcutAdvisor">
    <property name="advice" ref="audienceAdvice" />
    <property name="pointcut" ref="audiencePointcut" />
</bean>

 

 这样,一个完整的切面就这样被定义了。但是在spring中,切面是以代理的方式实现的。无论使用哪种方式定义切点,都是需要代理bean的。这些东西我们下面再说,现在,先介绍一下如何定义AspectJ切点:

<bean id="audienceAdvisor"
      class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
    <property name="advice" ref="audienceAdvice" />
    <property name="expression" value="execution(* *.perform(..))" />
</bean>

 

execution(* *.perform(..)):
execution:执行方法时;
第一个星号:任何返回类型;
第二个星号:任意类;
perform :代表perform方法;
(..) :任意参数设置。

 现在,我们就来说一些有关代理目标bean的东西。现在,我们来为一个名为Duke的诗人表演者定义一个代理bean:

原Duke  bean的定义:

<bean id="dukeTarget" 
      class="com.springinaction.springidol.PoeticJuggler"  autowire="constructor">
    <constructor-arg  ref="sonnet29" />
</bean>

Duke  bean的代理的定义:

<bean id="duke"  class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref=" dukeTarget " />
 <property name="interceptorNames"  value=" audienceAdvisor " />
 <property name="proxyInterfaces"  value ="com.alibaba.performer" />
</bean>

 

interceptorNames属性指明哪个通知者要应用于被代理的bean。
proxyInterfaces属性指明代理应该实现哪个接口。
 上述的两个属性其实都是String的数组。在该例中,spring会将单个值转换成数组的。如果有多个值可以这样做:

<property name="interceptorNames" >
 <list>
 <value> audienceAdvisor</value>
 </list>
</property>

 

 当然,如果现在又有一个叫steve的人来表演萨克斯的话,我们就会发现,上述代码还要重写一遍,而其中只有target属性不同。这样,我们就需要抽象ProxyFactoryBean:

<bean id="audienceProxyBase"
      class="org.springframework.aop.framework.ProxyFactoryBean"  abstract=”true”>
    <property name="proxyInterfaces"  value="com.alibaba.Performer" />
    <property name="interceptorNames" value="audienceAdvisor" />
</bean>

<bean id="duck"  parent=" audienceProxyBase ">
    <property name="target"  ref="duckTarget" />
</bean>

 

 这样,我们就介绍完了spring最经典的基于代理方式实现的aop。下面我们来看一下@AspectJ注解驱动的切面。我们仍以那个观众观看表演的情景来做例子。

@Aspect         //该类已经不是一个传统的POJO了,而是一个切面
public class Audience 
{
  @Pointcut("execution(* *.performance(..))")     //定义一个切面
  public void performance(){}

  @Before("performance()")          //前通知
  public void takeSeats() {
    System.out.println("The audience is taking their seats.");
  }
  
  @Before("performance()")
  public void turnOffCellPhones() {
    System.out.println("The audience is turning off their cellphones");
  }
  
  @AfterReturn("performance()")          //返回后通知
  public void applaud() {
    System.out.println("CLAP CLAP CLAP CLAP CLAP");
  }
  
  @AfterThrowing("performance()")        //抛出后通知
  public void demandRefund() {
    System.out.println("Boo! We want our money back!");
  }
}

 
 当然,不要忘了在xml配置文件里加上<aop:aspectj-autoproxy/>,这个标识是告诉spring去扫描被@Aspect标记的切面了。周围通知的写法也很类似,@Around("performance()")即可。上面的代码没什么好说的,读起来很简单,就像读报纸一样,这里就不废话了。下面说说另一种切面:纯粹的POJO切面。这种切面更加直观,他可以将任何一个java类变成一个切面。就拿我们最初的那个观众类举例,他就是一个很普普通通的类。但是通过如下的xml配置之后,这个观众类就是一个切面了,但是原来的java类没有任何代码上的改变。

<bean  id="audience"  class="com.springinaction.springidol.Audience" />

<aop:config>
 <aop:aspect ref="audience">
 <aop:pointcut  id="performance"  expression="execution(* *.perform(..))" />
 
 <aop:before  method="takeSeats"  pointcut-ref="performance" />
       <aop:before  method="turnOffCellPhones"  pointcut-ref="performance" />
        <aop:after-returning  method="applaud"  pointcut-ref="performance" />
 <aop:after-throwing  method="demandRefund"  pointcut-ref="performance" />
 </aop:aspect>
</aop:config>

 

TC8测试TCP-UNACCEPTABLE-04/006 立即下载

相关推荐

PSIM-串联谐振半桥LLC开关电源+PFM变频闭环控制【仿真+计算书+参考文献】

内容概要:本文档系统性地整合了电力电子与控制系统仿真领域的丰富资源,聚焦于基于PSIM和Simulink平台的串联谐振半桥LLC开关电源建模与仿真,深入探讨PFM变频闭环控制策略的设计与实现。内容涵盖LLC谐振变换器的工作原理、关键参数设计、开环与闭环仿真模型构建、软开关技术(ZVS/ZCS)、恒压恒流双竞争控制机制以及调频控制等核心技术,配套提供完整的仿真文件、计算书和参考文献,有助于深入理解高频开关电源系统的动态响应特性与稳定性分析方法。此外,文档还汇集了大量拓展性仿真资源,涉及双向DC-DC变换器、PWM整流器、PFC电路、储能系统、微电网优化、DAB变换器、并网逆变器等多个方向,构成一套完整的科研与工程实践参考资料体系。; 适合人群:适用于电力电子、电气工程及其自动化等相关专业的高校本科生、研究生,以及从事开关电源设计、新能源系统开发、电力变换器研发等工作的工程技术人员。; 使用场景及目标:①深入学习LLC谐振变换器的拓扑结构与闭环控制原理;②掌握PSIM/Simulink在电力电子系统中的高精度建模与仿真技能;③为科研项目、学位论文或产品开发提供可复用的技术方案与代码基础;④深化对PFM控制、软启动过程、ZVS/ZCS实现机制及系统稳定性的理解; 阅读建议:建议结合文档中提供的仿真模型与计算书进行同步操作,优先剖析主电路拓扑与控制逻辑架构,再逐步开展参数调节与仿真验证实验,同时可参考所列相关资源拓展技术视野,提升综合设计能力。

25-Spring源码解析之AOP(4)——创建AOP代理(1)

Spring版本:<version>5.2.1.RELEASE</version> 上一篇:24-Spring源码解析之AOP(3)——解析@Aspect获取增强器 上一篇我们讲完了解析@Aspect注解并获取增强器的时机和如何获取增强器。在获取增强器后,就是开始对创建的Bean进行分析看其是否需要创建对应的AOP代理。 那么本篇文章就开始讲解切面类(LogAspect...

想当厨子的程序媛 1099

Windows开发工具环境管理:Git、Node.js、Python多版本与PATH冲突排查 - 配套实验资源

本资源是《Windows开发工具环境管理:Git、Node.js、Python多版本与PATH冲突排查》的配套实验工具,适用于 Windows PowerShell 5.1 和 PowerShell 7,帮助开发者排查 Git、Node.js、Python、Codex 等工具的多版本共存、PATH 配置异常及命令优先级冲突问题。 **资源包含两个 PowerShell 脚本:** 1. **Get-ToolchainInventory.ps1**:只读环境诊断工具,可列出开发工具的命令候选路径,检查 PATH 目录、重复条目及无效路径。不执行开发工具,也不修改系统配置。 2. **Invoke-PathPrecedenceLab.ps1**:PATH 优先级演示工具,在系统临时目录中生成测试命令,通过临时调整当前进程的 PATH,直观展示 Windows 命令查找与优先级规则。实验结束后自动恢复 PATH 并清理自身创建的临时文件。 **资源特点:** - 兼容 Windows PowerShell 5.1 和 PowerShell 7。 - 支持开发工具路径盘点与 PATH 冲突分析。 - 提供可重复的命令优先级实验。 - 不修改注册表、系统级或用户级环境变量。 - 不卸载软件、不安装依赖、不执行包管理器。 - 适合 Windows 开发环境排查、PowerShell 学习与技术教学。 **使用说明:** 下载后建议先审查脚本,再按照配套文章中的 PowerShell 命令运行。脚本已完成静态检查与打包,尚未经过 Windows 实机执行验证。 **安全提示:** 诊断结果可能包含个人或组织目录信息,公开分享前请脱敏。若受到 PowerShell 执行策略限制,应采用符合环境安全要求的授权方式运行,不建议全局关闭安全限制。

Spring AOP 配置文件的简单理解

Spring AOP的切面配置内容如上: 1、理解pointcut,即是切入点,也就是切面的切入点,红色的是正常业务程序,黄色的也就是切面,那么在哪里切入?也就是说在哪个目标类的目标方法中切入?这就是切入点pointcut2、定义了pointcut之后,就要定义切面,所谓的切面也就是黄色的部分,也就说用哪个类去切入,具体一点,就是用哪个类的哪个方法却做这样的切入动作,或者叫织入动作,所以这里

科良_szu的专栏 398

从零到一:龙芯杯参赛全攻略(含北理工学长经验PDF、B站培训视频与开源代码合集)

本文详细介绍了龙芯杯全国大学生计算机系统能力大赛的参赛全攻略,包括资源整合、技能树构建、团队协作和避坑指南。提供北理工学长经验PDF、B站培训视频与开源代码合集,帮助参赛者从零基础到站上领奖台。重点解析如何高效获取优质资源、避开新手常见陷阱及构建可落地的学习路径,助力普通学生系统学习CPU设计。

weixin_26802933的博客 538

工业自动化中气动夹爪选型、调试与维护全流程实战解析

在工业自动化领域,气动执行元件是实现精准抓取与搬运的基础。其工作原理是通过压缩空气驱动气缸,转化为直线或旋转运动,从而控制夹爪的开合。这类技术因其结构简单、响应快速、成本低廉及维护方便,在自动化产线中具有极高的技术价值,是实现高效、可靠物料搬运的核心单元。其典型应用场景涵盖电子装配、汽车制造、食品包装等行业的上下料、分拣与定位工序。本文以工业自动化中常见的二指平行气动夹爪(常被工程师代号化为“Gripper-A”)为例,深入剖析其从硬件选型、气动系统集成到程序逻辑联锁的完整工程实践。内容聚焦于夹持力计算中惯

weixin_42629671的博客 365

结构型-适配器

使用不完全匹配的功能(目的是合并)。 案例 AOP 黄色是适配器,把橙色装入紫色,变成蓝色的子类,供绿色使用。 就完成了橙色到蓝色的适配。 绿色调用蓝色的时候,实际上调用的紫色中的橙色。 黄色代码: class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable { @Override public boolean supportsAdvice(Advice advice) { return (advice inst

姜希成的博客 224

基因树构建全流程:从OrthoFinder到iTOL的保姆级教程(附兰科植物案例)

本文提供了一份从OrthoFinder到iTOL的基因树构建全流程保姆级教程。详细解析了利用OrthoFinder构建物种树、IQ-TREE构建无根基因树、Notung进行树调和生根,以及最终在iTOL中实现专业可视化的每一步操作与实战经验,并以兰科植物NB-ARC基因家族为例进行演示,帮助研究者系统掌握基因树分析方法。

tequila的博客 519

黄晓童SPRING学习笔记:对AOP的初步理解

Spring的定义对DI的初步理解对AOP的初步理解对DI的深入探究对AOP的深入探究Spring的事务管理Spring MVC 接下来阐述一下我对AOP的理解,还是回到之前那个骑士和寻找圣杯的场景来。现在场景稍有改变,在骑士寻找圣杯的时候,要有一个诗人陪伴他,以朗诵诗歌的形式为他歌功颂德。按照以往的方式,最容易想到的一个方法就是:定义一个诗人的类,里面包含唱歌的方法,然后在骑士类里面有一个...

冯立彬的博客 237

Robot Framework 7.0 报告解析

本文深入解析 Robot Framework 7.0 新增的 JSON 报告功能,手把手教你如何从 output.xml 转换为结构清晰的 output.json,并通过 Python 脚本提取关键测试指标。文章附完整示例、命令、解析脚本,支持导出为 CSV 和 Markdown,方便接入可视化看板、群通知和 CI 流程。适用于测试自动化、质量平台建设和回归趋势分析场景。

点点寒彬的博客 264

【Burp入门第三十三篇】BurpSuite+Proxifier安装配置,实现微信小程序抓包

本文介绍Burp+Proxifier安装配置,实现微信小程序抓包

等风来 5873

黄晓童SPRING学习笔记:Spring的定义

Spring的定义对DI的初步理解对AOP的初步理解对DI的深入探究对AOP的深入探究Spring的事务管理Spring MVC   spring是一个“轻量级的DI和AOP容器框架”。解释一下这个定义: 轻量级:JAR包和Spring的处理开销都很小; 依赖注入:对象是被动接收依赖类而不是自己主动去找; 面向切面:将业务逻辑从应用服务 (如日志和事务) 中分离出来,实现内聚开发...

冯立彬的博客 218

小米汽车车载多摄像头视频链路深度解析 | MAX96792/MAX96724/MAX96781 实战分享

通过合理的输入输出规划 + 虚拟通道管理 + 加串行策略,可以在成本和性能之间取得最佳平衡,这就是多摄像头系统设计的核心精髓。

weixin_43199439的博客 1546

黄晓童SPRING学习笔记:对DI的深入探究

Spring的定义对DI的初步理解对AOP的初步理解对DI的深入探究对AOP的深入探究Spring的事务管理Spring MVC  spring的特性之一是DI,而DI的关键在于bean的装配,即创建系统各组件之间的协作关系。而组件是存活在spring容器中的,容器是spring的核心,spring提供多种容器的实现。第一种是bean工厂,即BeanFactory接口;第二种是Applicati...

冯立彬的博客 235

华为OD机考真题 新系统 - 数列求值(Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【数列求值】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【数列求值】多语言题解。

qq_45776114的博客 661

DMA engine initialization failed rk3568的原因及解决方案

刚开始调试 switch 芯片的时候由于rgmii 时钟是output , rk3568的 GMAC 需要 switch 芯片提供 125M的时钟,如果没有这个时钟就会初始化失败,进入文件系统后 ethx 不会出现(当然,如果屏蔽掉这里ethx 会出现,但是引发更多的问题,笔者在这块耍小聪明,导致耗费了近一个月时间,把网络这块整个查了一遍 -----)dma 软复位是在进入文件系统后,网络系统启动的时候,我想如果在这个之前只要提供合适的时钟那么就是可以的,那么------以上是官方的文档说明。

Nyiragongo的博客 4572

黄晓童SPRING学习笔记:Spring的事务管理

Spring的定义对DI的初步理解对AOP的初步理解对DI的深入探究对AOP的深入探究Spring的事务管理Spring MVC 首先来说一些概念性的东西,就是事务的的ACID属性:原子性:事务中的操作要么都发生要么都不发生;一致性:事物一旦结束了,数据不应当被破坏;隔离性:一个用户的操作不能和其他用户的操作相混淆;持久性:一旦事务完成,应当被持久化。  spring是不直接管理事务的,而是交...

冯立彬的博客 259

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

黄晓童的Spring 学习笔记,加了比喻及示例,非常好,分享给大家

因为内容较多,不方便放在一篇文章里面,特分成多篇进行放置,请进入以下分类类页进行查看: Spring的定义对DI的初步理解对AOP的初步理解对DI的深入探究对AOP的深入探究Spring的事务管理Spring MVC...

冯立彬的博客 185

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

黄晓童SPRING学习笔记:Spring MVC

Spring的定义对DI的初步理解对AOP的初步理解对DI的深入探究对AOP的深入探究Spring的事务管理Spring MVC  先来谈谈一个web请求在Spring MVC中的流程。首先,第一个停留点是Spring的DispatcherServlet,它的工作就是查找每一个处理器(HandlerMapping)得到应该把该请求分发给哪一个控制器(controller);然后,它将会把请求分派...

冯立彬的博客 252

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

黄晓童SPRING学习笔记:对DI的初步理解

Spring的定义对DI的初步理解对AOP的初步理解对DI的深入探究对AOP的深入探究Spring的事务管理Spring MVC         首先,我们来看这样一个场景:有一个骑士,他要去完成寻找圣杯的任务。情景很简单,我们以往的做法是这样的:声明一个骑士类,再声明一个寻找圣杯的任务类,骑士类是依赖于任务类的,代码如下: Public class XunZhaoShengBeiRenW...

冯立彬的博客 192

正则表达式

在学习正则表达式的时候有没有这样的困惑,这么多符号这么记呀?某符号代表啥?某符号代表啥?某符号代表啥?某符号代表啥?某符号代表啥?

qq_44776900的博客 155

Notepad++ 正则表达式完全手册:文本处理的终极武器(2026实战版)

正则表达式是文本处理的"黑魔法",但语法复杂、难以上手。本文基于 Notepad++ 正则引擎,从基础语法到高级实战,覆盖数据清洗、日志分析、代码批量修改等高频场景,提供即拿即用的正则模板。零基础也能跟着练,学完立刻提升10倍文本处理效率。

Frag0ut的博客 374

正则表达式学习

给你一份实战向的正则入门,看完能读能写。

weixin_39766667的博客 133

Day30 · 正则表达式

正则表达式是匹配字符串规则的强大工具,通过 re 模块实现。掌握元字符、字符类、分组与量词,可高效完成邮箱、手机号等格式校验与提取。熟练使用 match、search、findall 等接口,结合编译优化性能,提升文本处理效率。

小嘉丶学长的博客 335

正则表达式学习笔记 02:基础语法

正则表达式是描述字符匹配规则的迷你语言,由普通字符和元字符组成。普通字符直接匹配自身,而元字符如.、*、+、^、$等具有特殊含义,用于控制匹配模式。常见功能包括任意字符匹配、字符类、预定义类(如\d)、量词、位置锚点、分组与捕获、环视断言及反向引用。需注意,若要匹配元字符本身,必须使用转义符\。例如,\.可匹配字面点号。

菜鸟的专栏 171

VSCode 正则表达式实战

掌握这个模式后,很多批量改名、日志清洗、代码重构都可以用正则快速完成。开启后,VSCode 才会把查找框里的内容当作正则表达式处理。如果直接替换,很容易把前面的编号也一起改掉。,就是查找框中第一个括号捕获的内容。正则表达式实战:只替换后半部分,前面保持原样。打开替换面板,然后点击搜索框右侧的。如果你不关心数字范围,只想匹配。,不会限制在 1 到 12。把前面整体捕获成第 1 组。开启正则表达式模式。匹配需要被替换的后半部分。后面跟一个数字,再跟。如果希望更严谨,只匹配。

踏上青云路的博客 153
上一篇: 黄晓童SPRING学习笔记:对DI的深入探究
下一篇: 黄晓童SPRING学习笔记:Spring的事务管理
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值