`
wangyun
  • 浏览: 120518 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring 自定义切入点

阅读更多

      Spring Aop 强大之处你可以自己定义切入点并且对切入点进行合并使其成为新的切入点。这给我们很大的自由空间,任我们在其中翱翔。。。闲话少说。这里我就简单的介绍下如何自定义切入点。

      Spring 自定义切入点只需要继承Pointcut 接口。它提供了两个方法:ClassFilter getClassFilter()和MethodMatcher getMethodMatcher()方法。通过方法我们可以很容易的看出第一个方法是对类进行判别是否需要织入通知,而第二个方法是对方法进行判别是否需要织入通知。当然它不仅仅只有如此而已,这我会在下面提及到。

      首先说的是ClassFilter 接口,虽然它非常的简单,并且实用性并不是非常的高(原因在于你在实现Spring Aop 时总是要定义目标对象的,那么如果该对象不实现进行Aop 你不进行定义便可。它的作用很可能是在对切入点进行合并时用到),但不管怎么说了解总是没有错的。ClassFilter 接口只提供了一个方法:boolean matcher(Class cls)。可以看出该类是通过类名来判断是否对该类进行织入通知的。由于这并不是常被用到的一个方法。Spring 提供了一个实现类表明任何类都可以织入通知,ClassFilter.TRUE。

      接着就是重头戏MethodMatcher 接口。它提供了3个方法,我们一个一个来说。

      首先是matches(Method,Class),看到这个方式当时我突然想到Class参数传过来的是什么呢,它是我们在Spring 的配置文件中设置的Aop 的目标对象。也就是说这个方法完全可以去替代ClassFilter 接口的matcher 方法,经过测试我发现这的确可以做到,Method参数是这个方法就是判别是否对该方法进行通知所需要的判别参数,相信Spring的 NameMatchMethodPointcut 和RegexpMethodPointcut 静态切入点都是通过它来实现的。这里我想强调一点某些Spring 书中说道matches(Method,Class)和isRunntime 方法只被调用一次,这显然是错误的。他们调用的次数是于Spring ProxyFactoryBean 类的proxyInterfaces 设置的接口有关。也就是说如果设置的接口定义方法超过一个,那么这两个方法必将会运行两次。书中所说的一次是说:对方法进行判别是否需要织入通知只进行一次操作。

      接着isRunntime 方法。它是设置切入点是否是动态切入点。需要指出的是如果matches(Method,Class)返回为fasle 的话,则该方法不会再被调用。

      最后就是matches(Method,Class,Object[])方法,该方法只有当前面的两个方法都返回true时才运行并且只有该方法返回true,通知才会织入其中。并且这个方法每次方法调用时都会被调用。因此效率很低只有在不得不用得时候才会用到该方法。

分享到:
评论

相关推荐

    SpringBoot下的SpringAOP-day04-源代码

    2.3.5 切入点表达式 2.3.6 定义切面类 2.3.7 让AOP生效 2.3.8 编辑测试类 2.4 AOP形象化的比喻 2.5 关于切入点表达式解析 2.5.1 bean标签写法 2.5.2 within表达式 2.5.3 execution表达式 2.6 按照自定义注解进行拦截...

    spring.net中文手册在线版

    12.2.4.自定义切入点 12.3.Spring.NET的通知类型 12.3.1.通知的生命周期 12.3.2.通知类型 12.3.2.1.拦截环绕通知 12.3.2.2.前置通知 12.3.2.3.异常通知 12.3.2.4.后置通知 12.3.2.5.引入通知 12.4.Spring.NET中的...

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.2.6. 自定义切入点 7.3. Spring的通知API 7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.3.2.1. 拦截around通知 7.3.2.2. 前置通知 7.3.2.3. 异常通知 7.3.2.4. 后置通知 7.3.2.5. 引入通知 7.4. Spring里的...

    Spring 2.0 开发参考手册

    7.2.6. 自定义切入点 7.3. Spring的通知API 7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.4. Spring里的advisor(Advisor) API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean...

    Aspect自定义springboot的使用.docx

    切面(Aspect):是指横切多个对象的关注点的一个模块化,事务管理就是J2EE应用中横切关注点的很好示例。在Spring AOP中,切面通过常规类(基本模式方法)或者通过使用了注解@...Spring默认使用AspectJ切入点表达式语

    Spring高级之注解驱动开发视频教程

    n 技术详解-切入点表达式详解 l Spring JDBC n 基础应用-JdbcTemplate的使用 n 源码分析-自定义JdbcTemplate n 设计模式-RowMapper的策略模式 n 高级应用-NamedParameterJdbcTemplate的使用 n 源码分析-...

    Spring中文帮助文档

    7.2.6. 自定义切入点 7.3. Spring的通知API 7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.4. Spring里的Advisor API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. ...

    spring chm文档

    7.2.6. 自定义切入点 7.3. Spring的通知API 7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.4. Spring里的advisor(Advisor) API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean...

    前置后置环绕异常通知

    spring框架的aop前置、后置、环绕、异常通知以及自定义切入点实例

    Spring API

    7.2.6. 自定义切入点 7.3. Spring的通知API 7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.4. Spring里的Advisor API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. ...

    SpringBoot中的AOP+自定义注解(源代码)

    1.2 `@Pointcut` 创建切入点 1.3 通知 1.4 Spring AOP 和 AspectJ AOP 有什么区别? 2. 在 SpringBoot 中使用 Aop 功能 2.0 创建一个SpringBoot项目 2.1 引入 POM 依赖 2.1.1 引入springboot aop依赖 2.1.2 引入...

    Spring Web Flow

    如果某个应用的业务逻辑代码既不适合放在transition 中由客户端来触发,也不适合放在 Spring Web Flow 自定义的切入点,那么就可以考虑添加<action-state> 元素专用于该业务逻辑的执行。更倾向于触发某个事件来执行...

    Spring攻略(第二版 中文高清版).part1

    3.6 编写AspectJ切入点表达式 127 3.6.1 问题 127 3.6.2 解决方案 127 3.6.3 工作原理 128 3.7 在你的Bean中引入行为 132 3.7.1 问题 132 3.7.2 解决方案 132 3.7.3 工作原理 132 3.8 为你的Bean...

    Spring攻略(第二版 中文高清版).part2

    3.6 编写AspectJ切入点表达式 127 3.6.1 问题 127 3.6.2 解决方案 127 3.6.3 工作原理 128 3.7 在你的Bean中引入行为 132 3.7.1 问题 132 3.7.2 解决方案 132 3.7.3 工作原理 132 3.8 为你的Bean...

    spring security 参考手册中文版

    使用protect-pointcut添加安全性切入点 66 6.5默认AccessDecisionManager 67 6.5.1自定义AccessDecisionManager 67 6.6验证管理器和命名空间 67 7.示例应用程序 69 7.1教程示例 69 7.2联系人 69 7.3 LDAP样本 71 7.4...

    Java Web程序设计教程

    12.3使用spring的切入点 251 12.3.1静态切入点 251 12.3.2动态切入点 253 12.4springaop的代理工厂 253 12.4.1选择合适的代理 253 12.4.2proxyfactory 254 12.4.3proxyfactorybean 254 12.5项目实战——输出...

Global site tag (gtag.js) - Google Analytics