`
jinnianshilongnian
  • 浏览: 21499358 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2417769
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3008062
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5638956
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259806
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597037
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250107
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5858146
Group-logo
跟我学Nginx+Lua开...
浏览量:701782
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:784897
社区版块
存档分类
最新评论

类继承/接口实现时Spring AOP切入点注意事项

阅读更多

最近好多人问我说我的我的切入点没有错误啊,怎么不起作用?而且大部分情况都是写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问题:

 

5
0
分享到:
评论
4 楼 lanhuai 2013-12-20  
jinnianshilongnian 写道
lanhuai 写道
Spring研究的很深入了,加油

嘿嘿,你回天津了?


是呢,回来很久了
3 楼 jinnianshilongnian 2013-11-28  
lanhuai 写道
Spring研究的很深入了,加油

嘿嘿,你回天津了?
2 楼 lanhuai 2013-11-28  
Spring研究的很深入了,加油
1 楼 jinnianshilongnian 2013-11-24  
有任何相关问题 可以留言探讨

相关推荐

    Spring AOP实现机制

    - 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法前后,会插入相应的通知代码,从而实现AOP功能。 - **CGLIB代理**: - 如果目标...

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    springAop的配置实现

    - 当目标类实现了接口时,Spring AOP会选择使用JDK动态代理。它会生成一个实现了目标类所有接口的代理类,并在调用接口方法时插入通知代码。 **3. CGLIB代理** - 如果目标类没有实现接口,Spring AOP会使用CGLIB...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中动态生成类和对象。 在Spring AOP中,我们通常使用@Aspect注解...

    spring aop jar 包

    这个"spring aop jar 包"包含了实现这一功能所需的类和接口,使得开发者能够轻松地实现面向切面的编程。 在Spring AOP中,主要涉及以下几个核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,比如日志记录...

    Spring AOP 16道面试题及答案.docx

    JDK代理适用于那些实现了接口的类,而CGLIB代理则适用于没有实现接口的类。 引介(Introduction)是Spring AOP的一个特性,允许在通知对象中声明并实现它们原本未实现的额外接口。通过`@DeclareParents`注解可以...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    JavaEE Spring AOP使用

    Spring框架提供了对AOP的强大支持,使得我们可以方便地实现日志记录、事务管理、性能监控等多种跨切面的关注点。 首先,让我们深入理解一下Spring AOP的核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,...

    Spring AOP依赖jar包

    http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 启用 AOP --> <aop:config> <aop:aspect id="loggingAspect" ref="loggingService"> <!-- 定义切入点 --> <aop:pointcut id=...

    Spring Aop的简单实现

    在SLT-Spring-AOP这个项目中,你可以找到具体的实现示例,包括如何定义切面、通知和切入点表达式,以及如何在业务代码中应用这些概念。通过对该项目的深入学习,你将能够更好地理解和掌握Spring AOP的实战应用。

    springaop中切入点表达式完整示例代码

    在Spring AOP(面向切面编程)中,切入点表达式是定义通知(advice)执行时机的关键元素。本文将深入探讨9种不同的切入点表达式及其用法,通过实际的示例代码来帮助理解它们的工作原理。 1. **execute()**: `...

    Spring AOP框架实现的结构分析

    外部接口是指 Spring AOP 框架对外暴露的接口,内部实现是指 Spring AOP 框架的内部实现机制,组成部分是指 Spring AOP 框架的核心组件,执行过程是指 Spring AOP 框架的执行流程。在本文中,我们将从实现的角度来...

    SpringAop xml方式配置通知

    http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 定义切面 --> <bean id="myAspect" class="com.example.aspect.MyAspect"/> <!-- 配置AOP --> <aop:config> <!-- 定义切入点表达式 --> ...

    spring-aop-5.2.0.RELEASE-API文档-中文版.zip

    赠送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;...

    javaXML方式实现SpringAop编程(源码+jar包)

    http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置其他业务bean --> <aop:config> <!-- 配置切面 --> </aop:config> </beans> ``` 2. **定义切面**:在`<aop:config>`标签内,我们...

    Spring AOP的简单实现

    总结,Spring AOP通过切面、切入点和通知等概念,提供了在不入侵原有代码的基础上,进行日志记录、事务管理、性能监控等多种跨切面操作的能力。在实际开发中,利用AOP可以有效地提高代码的复用性和模块化程度,降低...

    Spring  AOP实现方法大全

    例如,假设我们有一个`MessageSender`接口和一个`HttpMessageSender`实现,我们想在发送消息前记录日志,可以创建一个名为`LogBeforeAdvice`的类,实现`MethodBeforeAdvice`接口,并在`before()`方法中写入日志。...

    Spring Aop四个依赖的Jar包

    当无法使用Java动态代理(例如,目标类没有实现接口时)时,CGLIB就会派上用场。CGLIB-nodep版本去除了对其他库的依赖,便于独立使用。 4. **aopalliance-1.0.jar**:AOP Alliance是一个包含AOP领域通用接口的库,...

    Spring AOP的底层实现技术

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点...

Global site tag (gtag.js) - Google Analytics