`

springframework【9】

阅读更多

AOP之Pointcut、Advisor

 

 上篇的所定义的Advice都是直接织入至代理接口执行前后的,或者在执行方法过程中出现异常的时候织入。事实上还有更加细致的织入时机。Pointcut定义了感兴趣的Jointpoint(Advice的应用时机)。在spring中,使用PointcutAdvisor提供的Pointcut实例,具体结合Advice,Spring内建的Pointcut都有对应的PointcutAdvisor。


官方文档解释:在Spring里,一个advisor是一个仅仅包含一个通知对象和与之关联的切入点表达式的切面。


除了引入这种特殊形式,任何advisor都可以和任何通知一起工作。 org.springframework.aop.support.DefaultPointcutAdvisor是最常用的advisor类。

例如,它可以和: MethodInterceptor,BeforeAdvice 或者 ThrowsAdvice一起使用。


在Spring里有可能在同一个AOP代理里模糊advisor和通知类型。

例如,你可以在一个代理配置里使用一个interception环绕通知,一个异常通知和一个前置通知:Spring将负责自动创建所需的拦截器链。


我的通俗解释:就是将一个advice和对应不同的规则进行匹配,就是将advice给包装升级了,使用的时候和advice一样使用


 1、NameMatchMethodPointcoutAdvisor(这里是一个织入时机的更加细致的处理,通过名字来对应,这样很明显的一个好处就是,我可以针对要代理类中的部分方法进行织入,而不是每个方法都进行织入)

<bean id="beforeAdvice" class="com.itcast.advice.LogBeforeAdvice"></bean>
<bean id="afterAdvice" class="com.itcast.advice.LogAfterAdvice"></bean>
<bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="helloSpeaker"></property>
<property name="interceptorNames">
 <list>
 <value>helloAdvise</value>
 </list>
</property>
</bean>
<!--helloAdvise的名字匹配的方式来匹配要进行advice处理的方法-->
<bean id="helloAdvise" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="mappedName" value="hello*"></property>
<property name="advice" ref="beforeAdvice"></property>
</bean>

 或者还可以定义成如下方式:

<!--helloAdvise直接指定要引入的advice方法的那些类文件中的具体方法列表-->
<bean id="helloAdvise" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
 <property name="mappedNames" >
 <list>
 <value>helloAaa</value>
 <value>helloBbb</value>
 </list>
 </property>
 <property name="advice" ref="beforeAdvice"></property>
</bean>

 2、RegExpMethodPointcutAdvisor(这里是通过正则表达式来编写Pointcut的表示式)
  定义的时候可以使用的符号:
   . 符合任何单一字符
   + 符合前一个字符一次或者多次
   * 符合前一个字符零次或者多次
   \  Escape任何Regular expression使用到的符号
写法例如:

<bean id="beforeAdvice" class="com.itcast.advice.LogBeforeAdvice"></bean>
<bean id="afterAdvice" class="com.itcast.advice.LogAfterAdvice"></bean>
<bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="helloSpeaker"></property>
<property name="interceptorNames">
 <list>
 <value>regAdvise</value>
 </list>
</property>
</bean>
<bean id="regAdvise" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
   <property name="advice" ref="afterAdvice"></property>
   <property name="pattern" value=".*Bbb"></property>
</bean>

  

这里是根据正则表达式来完成对于相关要进行advisor的方法。

总结一下:上边的几种方式的目的都是一样的就是为了给我们定义的代理类更加方便增加advice方法。手段无外乎就似乎用正则表达式、名字匹配的方法。总之就是灵活的配置,最后选择哪种,看你的具体需求。

 上边涉及的核心类文件不再重复贴出,只贴出调用验证的类:(这里只是需要获取helloProxy这个代理bean,调用他的方法看效果就ok了)

package com.itcast.aop.xml;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.itcast.proxy.IHello;

public class SpringAopMain {

	public static void main(String[] args) {

		ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-config.xml");


		/**测试advise的使用*/
		IHello hello =(IHello)ctx.getBean("helloProxy");
		hello.hiAAA("测试aaa");
   }
}

 

有兴趣的可以根据上边的配置文件完成不同种类的声明方式进行组合测试。

本篇的核心点就是配置文件上的声明,配置文件上的各种声明方式,帮我们给被代理的bean赋予了不同的advice、advisor。

 

 

分享到:
评论

相关推荐

    Spring Framework API(Spring Framework 开发文档).CHM

    Spring Framework。 官网 Spring Framework API。 Spring Framework 开发文档。

    maven仓库中org下的springframework

    标题中的“maven仓库中org下的springframework”指的是在Maven的本地或远程仓库中,位于`org`组织下的`springframework`项目。Spring Framework是Java开发中的一个核心框架,由Pivotal Software公司维护,它为构建...

    Spring Framework 4 参考文档中文版.docx

    "Spring Framework 4 参考文档中文版" 以下是 Spring Framework 4 参考文档中文版的知识点总结: 一、Spring Framework 概览 * Spring Framework 是一个轻量级的解决方案,是一站式构建企业级应用的一种选择。 * ...

    org.springframework.core.jar

    《Spring框架核心模块——org.springframework.core.jar深度解析》 在Java世界中,Spring框架以其卓越的灵活性、可扩展性和模块化设计,成为了企业级应用开发的首选。其中,`org.springframework.core.jar`是Spring...

    spring framework 中文参考手册

    spring framework 中文参考手册

    Spring Framework v6.1.4.zip

    Spring Framework 是一个广泛使用的开源Java应用框架,特别适用于企业级应用程序开发。它的最新版本v6.1.4为我们带来了许多新特性和改进,使得开发者能够更高效、更灵活地构建可维护的、高性能的应用程序。这个...

    org.springframework.flex-1.0.3.RELEASE.jar.zip

    org.springframework.flex-1.0.3.RELEASE.jar.zip用于JAR包,org.springframework.flex-1.0.3.RELEASE.jar.zip用于JAR包org.springframework.flex-1.0.3.RELEASE.jar.zip用于JAR包org.springframework.flex-1.0.3....

    Spring Framework API文档

    Spring Framework API文档。Spring是什么呢?首先它是一个开源的项目,而且非常活跃;它是一个基于IOC和AOP的构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据...

    org.spring-framework-3.0.4. 所有jar

    org.springframework.aop-3.0.4.RELEASE.jar org.springframework.asm-3.0.4.RELEASE.jar org.springframework.aspects-3.0.4.RELEASE.jar org.springframework.beans-3.0.4.RELEASE.jar org.springframework....

    spring framework 简介

    ### Spring Framework 简介 #### 一、Spring Framework 的独特之处 在众多J2EE框架中,Spring Framework 自2003年发布以来一直备受瞩目。与其他框架相比,Spring Framework 的独特之处在于: 1. **专注于管理业务...

    Spring Framework v5.3.32.zip

    9. **反应式编程**:Spring 5引入了对Reactive Streams的支持,通过Project Reactor提供响应式编程能力,适应高并发和非阻塞IO场景。 10. **安全模块**:Spring Security是Spring生态中的安全框架,提供认证、授权...

    Getting started with Spring Framework: covers Spring 5(epub)

    The examples (consisting of 88 sample projects) that accompany this book are based on Spring 5.0.1 and Java 9. You can download the examples described in this book from the following GitHub project:...

    Spring Framework 6 中文文档

    Spring Framework 是Java开发中的核心框架,它以其强大的功能和易用性成为了许多开发者首选的工具。Spring Framework 6.0.8-SNAPSHOT 的中文文档是针对这一最新版本的详尽指南,旨在解决中文互联网上关于Spring框架...

    spring-framework-2.0.2

    org\springframework\aop org\springframework\beans org\springframework\cache org\springframework\context org\springframework\core org\springframework\dao org\springframework\ejb org\spring...

    Spring Framework 5.1.0源码

    Spring Framework 5.1.0源码 The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform. A key ...

    org.springframework.core_3.1.1.RELEASE.jar

    《Spring核心模块详解:org.springframework.core_3.1.1.RELEASE.jar》 在Java开发领域,Spring框架无疑是最重要的框架之一,它以其强大的依赖注入、面向切面编程以及丰富的功能扩展,深受开发者喜爱。其中,`org....

    SpringFramework_v5.0.7.zip

    Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本。 该框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-...

    spring3.0.5 所有jar文件

    org.springframework.aop-3.0.5.RELEASE.jar org.springframework.asm-3.0.5.RELEASE.jar org.springframework.aspects-3.0.5.RELEASE.jar org.springframework.beans-3.0.5.RELEASE.jar org.springframework....

    Spring Framework v5.0.11

    Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本。 该框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-...

    org.springframework.web.jar

    9. **Integration with other Spring Modules**:`org.springframework.web.jar`与Spring框架的其他模块紧密集成,如Spring Core、Spring Beans、Spring AOP等,共同构建出一个完整的应用框架。 总的来说,`org....

Global site tag (gtag.js) - Google Analytics