spring 之AOP 和继承方法

1.spring AOP 会忽略切面类从父类继承的方法,除非在切面类,也就是子类中对父类方法覆盖@Override. 

package com.skyline.dao;@Repositorypublic class A{
  public void a(){    //implements....  }    public void aa(){
   //implements...
  }
  

}
package com.skyline.service;@Servicepublic class B implements A{
   @Autowired  private A a;
    public void b(){
    //重复调用a.a()
    }

}    
<aop:pointcut expression="execution(* com.skyline.service.*.*(..))"  id="log_service"/>
<aop:before pointcut-ref="log_service" method="doBefore"/>

如上述的例子中,用service 层的类继承dao层的类就是为了不用在service 层再次写调用dao层方法,避免代码重复.

这样带来的问题之一就是AOP 只对service层自己定义的方法进行切入.如b().

如果改下切面如下:

 <aop:pointcut expression="execution(* com.skyline.dao.*+.*(..))"     id="log_service"/>
<aop:before pointcut-ref="log_service" method="doBefore"/>

匹配表达式改为匹配dao 层,而+是表示"以及子类",上述expression 的意思就是匹配 dao层的所有类以及子类的所有方法.

现在是所有方法都会被切入,例如在调用 new B().aa() 这个方法,只会切入service 层,没有切入dao层了.

但是问题是例如 B class 中的b() 方法,会重复调用父类 a(),这个a 也会不停的被切入.

我希望的是,只有在service 层调用时才会被切入,而希望service 方法内的父级方法不被切入的,只切入service 层就好.

再改成如下:

 <aop:pointcut expression="execution(* com.skyline.dao.*+.*(..)) and  !execution(* com.skyline.dao.*.*(..))"      id="log_service"/>
<aop:before pointcut-ref="log_service" method="doBefore"/>

想要排除dao层的方法,只切入子类方法就好.但是实际是父类dao层的类方法没有被切入,继承的子类的方法也没有切入,和最开始只切service 层的效果是一样了.

就是说不切入父类,就不能切入子类......

最后......泪奔....还是没有找到满意的方法...

时间: 2024-11-08 00:47:54

spring 之AOP 和继承方法的相关文章

Spring AOP根据JdbcTemplate方法名动态设置数据源

说明:现在的场景是,采用数据库(Mysql)复制(binlog)的方式在两台不同服务器部署并配置主从(Master-Slave)关系: 并需要程序上的数据操作方法来访问不同的数据库,比如,update方法访问主数据库服务器,query方法访问从数据库服务器. 即把"增删改"和"查"分开访问两台服务器,当然两台服务器的数据库同步事先已经配置好. 然而程序是早已完成的使用Spring JdbcTemplate的架构,如何在不修改任何源代码的情况下达到<本文标题&g

Spring AOP获取拦截方法的参数名称跟参数值

Spring AOP获取拦截方法的参数名称跟参数值 注意:这种方式需要JDK1.8版本支持 开始: 1.aop配置: <aop:aspectj-autoproxy expose-proxy="true" /> 注意该配置需要配置在spring mvc的配置文件中,因为需要拦截controller层方法 或者在必须要配置在spring配置文件中的情况下,同时需要拦截controller层的方法,可以在spring配置文件中加入controller层的包扫描 2.具体代码: i

Spring 之 AOP

面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化.AOP 的核心构造是方面, 它将那些影响多个类的行为封装到可重用的模块中. 通常情况下,对于AOP,我们有两种方式来实现. 使用DynamicProxy实现AOP 下面是一个简单的示例,首先定义业务对象: 1 public interface UserDao { 2 3 void save(); 4 } 5 6 public class UserDaoImpl imp

spring的AOP

最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spring的AOP还比较陌生,事后通过网上学习对其有了较好的了解. AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象

Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)

参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/ 1.首先,spring的AOP作用范围很广,可以使用Aspectj的execution表达式自定以切面的位置. 比如下面的配置service方法执行日志: 1 <!-- 系统日志 --> 2 <bean id="logUtils" class="com.tabchanj.crm.utils.SystemLogUtils&q

Spring的AOP AspectJ切入点语法详解(转)

一.Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示符如下: execution:用于匹配方法执行的连接点: within:用于匹配指定类型内的方法执行: this:用于匹配当前AOP代理对象类型的执行方法:注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配: target:用于匹配当前目标对象类型的执行方法:注意是目标对象的类型匹配,

跟着刚哥学习Spring框架--AOP(五)

AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合.不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能.日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性.异常处理和透明的持续性也都是如此,这种散布在各

spring(4)面向切面的Spring(AOP)

[0]README 1)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review  "spring(4)面向切面的Spring(AOP)" 的相关知识: 2)在软件开发中,散布于应用中多处的功能被称为横切关注点.通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑中).把这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的问题:(干货--引入横切关注点及其所要解决的问题) 3)

Spring(五)AOP简述

一.AOP简述 AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心, AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型 AOP技术弥补了面向对象编程思想的不足,spring aop是实现aop的一种技术,srping aop是spring框架中某个子框架或者子功能所依赖的核心. SPring的容器并不依赖于AOP 这意味着程序员可以自己选择是否使用aop技术,aop提供强大的中间件解决方案,这使用spring ioc容器更