最近好多人问我说我的我的切入点没有错误啊,怎么不起作用?而且大部分情况都是写AOP切入点时带有类继承或接口实现时出现的问题。在此总结一下,方便后人查阅。而且建议使用如IntelliJ IDEA、STS或者Eclipse装AspectJ插件自动显示切入点是否匹配目标对象/目标方法。
1、相关类
1.1、抽象基类
我们在写一些项目时,都会抽象一些基类,比如DAO、Service等。
//基础接口 package com.sishuok.common; public interface BaseService { public void save(); } //基础实现 package com.sishuok.common; public abstract class BaseServiceImpl implements BaseService { @Override public void save() { } }
1.2、实现类
//业务接口 package com.sishuok.user; import com.sishuok.common.BaseService; public interface UserService extends BaseService { public void saveUser();//额外添加的接口 } //业务实现 package com.sishuok.user; import com.sishuok.common.BaseService; import com.sishuok.common.BaseServiceImpl; import org.springframework.stereotype.Service; @Service public class UserServiceImpl extends BaseServiceImpl implements UserService { @Override public void saveUser() {//此处只实现了业务接口,没有覆盖基础实现 } }
2、错误的切入点
2.1、"execution(* com.sishuok.user.UserService.*())" 如果这样写切入点,只能匹配到UserService实现类中的直接实现的方法。即只能匹配saveUser方法,而无法匹配save方法。当然你可以在UserServiceImpl中再覆盖下save方法也可以,但是这样基类就没有意义了。
2.2、”execution(* com.sishuok.user.UserServiceImpl.*())“ 如果想只对UserServiceImpl中的方法进行匹配,这样写也是和上边有一样的问题。
3、正确的切入点
3.1、"execution(* com.sishuok.common.BaseService+.*())" 或者"within(com.sishuok.common.BaseService+)" 或者"this/target(com.sishuok.common.BaseService)" 有朋友会想到,既然这样,反正是对BaseService的所有子类进行匹配,那么就可以按照上边的写法,即匹配BaseService的所有实现类。这样也是可以的。
3.2、"target(com.sishuok.user.UserServiceImpl) && execution(* *())" 这样即可匹配save和saveUser两个方法。
从以上可以总结出:要从基类开始匹配,或者使用target直接匹配具体类。
对于没有接口的,直接类继承实现的,可以参考https://github.com/zhangkaitao/es/tree/master/web/src/main/java/com/sishuok/es/extra/aop。
相关Spring AOP问题:
- »Spring 之AOP AspectJ切入点语法详解
- 请不要再使用低级别的AOP API
- 注入FactoryBean失败分析+解决方案
- spring的二次代理原因及如何排查
- struts2+spring集成bug——使用AOP时可能遇到的问题分析
- 关于spring的aop拦截的问题 protected方法代理问题
- Spring事务不起作用 问题汇总
- Shiro+Struts2+Spring3 加上@RequiresPermissions 后@Autowired失效
- 如何为spring代理类设置属性值
- 在spring中获取代理对象代理的目标对象工具类
- Spring事务处理时自我调用的解决方案及一些实现方式的风险
相关推荐
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
赠送jar包:spring-aop-5.2.0.RELEASE.jar; 赠送原API文档:spring-aop-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.2.0.RELEASE.pom;...
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
详细介绍spring aop中9种切入点表达式的写法execute、within、this、target、args、@target、@within、@annotation、@args
NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介(Introduction)是什么? 连接...
Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器
spring aop jar 包
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
顾名思义,Before Advice会在目标对象的方法执行之前被调用,您可以通过实现org.springframework.aop.MethodBeforeAdvice接口来实现Before Advice的逻辑,接口定义如下: java 代码 1. package org.springframework....
一个基于配置文件的Spring AOP的实现。实现了前置通知,后置通知,以及拦截器的功能,配置中有详细的注释。
压缩包中函数Spring AOP开发时使用注解和xml文件配置demo
http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="userService" class="cn.sxt.service.impl.UserServiceImpl"></bean> <bean id="log" class="cn.sxt.log.Log"/> <aop:aspectj-...
使用mindmaster打开
2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用
使用Spring的注解方式实现AOP的细节
使用Spring的AOP技术,实现日志记录功能。记录如下信息: 在哪个时间访问了哪个方法,方法传入了哪些参数
学习Spring开发的AOP面向切面编程时所需要的jar包,包括com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar