3
回答
Spring aop拦截问题
终于搞明白,存储TCO原来是这样算的>>>   
我现在有一个A类并且在该类里面有一个方法say(),然后现在有一个B类继承了A但是我没有重写A类中的方法 现在我在测试类里面通过B类实例调用A类的say方法 没有拦截?请问这个问题如何解决  因为项目中有很多这样类似的调用
举报
MLGKO
发帖于2年前 3回/201阅
共有3个答案 最后回答: 2年前
额,看看你们项目里是用什么方式切面吧,是cglib还是aspectj,cglib是基于接口的,你继承可定会报错,应该使用aspect,这种基于继承的
--- 共有 2 条评论 ---
尚浩宇回复 @MLGKO : 好吧,记错了 2年前 回复
MLGKOjdk是基于接口吧,cglib是基于继承吧 2年前 回复

简单的说,使用cglib,在spring的形式可能是以下这样的,就是在xml里配置,如

  1. <bean id="userManager" class="com.bjsxt.spring.UserManagerImpl"/>  
  2.        
  3.     <bean id="mySecurityManager" class="com.bjsxt.spring.MySecurityManagerImpl"/>  
  4.        
  5.     <aop:config>  
  6.         <aop:pointcut id="allAddMethod" expression="execution(* add*(..))"/>  
  7.         <aop:aspect id="securityAspect" ref="mySecurityManager">  
  8.             <aop:before pointcut-ref="allAddMethod" method="checkSecurity"/>  
  9.         </aop:aspect>        
  10.     </aop:config>  
而aspectj则是在代码里的,如@Aspect
@Component
public class BoyLog {
/**
* <p>Description: </p>
* @author scc
* @since 创建时间:2015年11月2日 下午5:08:18
********************************** 
*/
@Pointcut("execution(* *.say(..))")
public void say() {
// TODO Auto-generated constructor stub
}
@Before("say()")
public void before(){
System.out.println("BoyLog.before()");
}
@After("say()")
public void after(){
System.out.println("BoyLog.after()");
}
@AfterReturning("say()")
public void afterreturn(){
System.out.println("BoyLog.afterreturn()");
}
@Around("say()")
public void around(ProceedingJoinPoint joinPoint){
System.out.println("BoyLog.around()");
try {
joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("BoyLog.around()");
}
}



--- 共有 1 条评论 ---
MLGKO我是基于注解的 2年前 回复

引用来自“尚浩宇”的评论

简单的说,使用cglib,在spring的形式可能是以下这样的,就是在xml里配置,如

  1. <bean id="userManager" class="com.bjsxt.spring.UserManagerImpl"/>  
  2.        
  3.     <bean id="mySecurityManager" class="com.bjsxt.spring.MySecurityManagerImpl"/>  
  4.        
  5.     <aop:config>  
  6.         <aop:pointcut id="allAddMethod" expression="execution(* add*(..))"/>  
  7.         <aop:aspect id="securityAspect" ref="mySecurityManager">  
  8.             <aop:before pointcut-ref="allAddMethod" method="checkSecurity"/>  
  9.         </aop:aspect>        
  10.     </aop:config>  
而aspectj则是在代码里的,如@Aspect
@Component
public class BoyLog {
/**
* <p>Description: </p>
* @author scc
* @since 创建时间:2015年11月2日 下午5:08:18
********************************** 
*/
@Pointcut("execution(* *.say(..))")
public void say() {
// TODO Auto-generated constructor stub
}
@Before("say()")
public void before(){
System.out.println("BoyLog.before()");
}
@After("say()")
public void after(){
System.out.println("BoyLog.after()");
}
@AfterReturning("say()")
public void afterreturn(){
System.out.println("BoyLog.afterreturn()");
}
@Around("say()")
public void around(ProceedingJoinPoint joinPoint){
System.out.println("BoyLog.around()");
try {
joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("BoyLog.around()");
}
}



@Aspect

@Component

public class DataSourceAspect implements Ordered {

@Pointcut("execution(* com.mfe.service.*.*(..))")

public void switchDataSource(){

}

@Before ("switchDataSource()")

    public void before(JoinPoint jp){

try {

System.out.println("当前类:"+jp.getTarget().getClass().toString());

System.out.println("当前调用方法:"+jp.getSignature().getName());

Transactional transactional=((MethodSignature)jp.getSignature()).getMethod().getAnnotation(Transactional.class);

if(transactional!=null&&!transactional.readOnly()){//写

DynamicDataSourceContextHolder.setDataSource("dataSourceW");

}else{//读

DynamicDataSourceContextHolder.setDataSource("dataSourceR");

}

}catch (SecurityException e) {

e.printStackTrace();

}

    }

    @After ("switchDataSource()")

    public void after(){

    DynamicDataSourceContextHolder.clearDataSource();

    }

    public int getOrder() {

        return 10;

    }

}

--- 共有 3 条评论 ---
尚浩宇回复 @MLGKO : 一般我遇到这种不可能的事,都是去检查配置,是不是粗心哪里弄错了 2年前 回复
MLGKO@尚浩宇 我在我这测试也是没问题的。。但是在我这个项目里面使用就是不行。其他方法都拦截。就是有个方法不拦截 2年前 回复
尚浩宇我在我本地试了一下,没问题的,可以使用 2年前 回复
顶部