最近好多人问我说我的我的切入点没有错误啊,怎么不起作用?而且大部分情况都是写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事务处理时自我调用的解决方案及一些实现方式的风险
相关推荐
- 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法前后,会插入相应的通知代码,从而实现AOP功能。 - **CGLIB代理**: - 如果目标...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
- 当目标类实现了接口时,Spring AOP会选择使用JDK动态代理。它会生成一个实现了目标类所有接口的代理类,并在调用接口方法时插入通知代码。 **3. CGLIB代理** - 如果目标类没有实现接口,Spring AOP会使用CGLIB...
本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...
如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中动态生成类和对象。 在Spring AOP中,我们通常使用@Aspect注解...
这个"spring aop jar 包"包含了实现这一功能所需的类和接口,使得开发者能够轻松地实现面向切面的编程。 在Spring AOP中,主要涉及以下几个核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,比如日志记录...
JDK代理适用于那些实现了接口的类,而CGLIB代理则适用于没有实现接口的类。 引介(Introduction)是Spring AOP的一个特性,允许在通知对象中声明并实现它们原本未实现的额外接口。通过`@DeclareParents`注解可以...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
Spring框架提供了对AOP的强大支持,使得我们可以方便地实现日志记录、事务管理、性能监控等多种跨切面的关注点。 首先,让我们深入理解一下Spring AOP的核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,...
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 启用 AOP --> <aop:config> <aop:aspect id="loggingAspect" ref="loggingService"> <!-- 定义切入点 --> <aop:pointcut id=...
在SLT-Spring-AOP这个项目中,你可以找到具体的实现示例,包括如何定义切面、通知和切入点表达式,以及如何在业务代码中应用这些概念。通过对该项目的深入学习,你将能够更好地理解和掌握Spring AOP的实战应用。
在Spring AOP(面向切面编程)中,切入点表达式是定义通知(advice)执行时机的关键元素。本文将深入探讨9种不同的切入点表达式及其用法,通过实际的示例代码来帮助理解它们的工作原理。 1. **execute()**: `...
外部接口是指 Spring AOP 框架对外暴露的接口,内部实现是指 Spring AOP 框架的内部实现机制,组成部分是指 Spring AOP 框架的核心组件,执行过程是指 Spring AOP 框架的执行流程。在本文中,我们将从实现的角度来...
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 定义切面 --> <bean id="myAspect" class="com.example.aspect.MyAspect"/> <!-- 配置AOP --> <aop:config> <!-- 定义切入点表达式 --> ...
赠送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;...
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置其他业务bean --> <aop:config> <!-- 配置切面 --> </aop:config> </beans> ``` 2. **定义切面**:在`<aop:config>`标签内,我们...
总结,Spring AOP通过切面、切入点和通知等概念,提供了在不入侵原有代码的基础上,进行日志记录、事务管理、性能监控等多种跨切面操作的能力。在实际开发中,利用AOP可以有效地提高代码的复用性和模块化程度,降低...
例如,假设我们有一个`MessageSender`接口和一个`HttpMessageSender`实现,我们想在发送消息前记录日志,可以创建一个名为`LogBeforeAdvice`的类,实现`MethodBeforeAdvice`接口,并在`before()`方法中写入日志。...
当无法使用Java动态代理(例如,目标类没有实现接口时)时,CGLIB就会派上用场。CGLIB-nodep版本去除了对其他库的依赖,便于独立使用。 4. **aopalliance-1.0.jar**:AOP Alliance是一个包含AOP领域通用接口的库,...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点...