weixin_42502508 2012-12-12 00:16
浏览 619
已采纳

通过spring aop代理的方法和final方法获取的不是同一个类变量

目标类的set方法是final的,get方法不是。aop代理之后set的值在get为空。求解这是为什么???前提是final的是客户的框架,我动不了。有什么解决方法吗??
目标方法
[code="java"]package demo.aop;
import org.springframework.stereotype.Component;
@Component("test")
public class TestService {
String data;
public String getData() {
return data;
}
public final void setData(String data) {
this.data = data;
}
}[/code]Mian[code="java"]package demo.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("demo/aop/applicationContext.xml");
TestService service=(TestService) context.getBean("test");
// service.test();
service.setData("AAA");
String sss=service.getData();
System.out.println(sss);
// service.out();

    System.out.println("end");

// service=new TestService();
// service.setData("BBB");
// service.setData0("AAA");
// service.out();
}
}[/code]Aop[code="java"]package demo.aop;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {
@Pointcut("execution(* demo.aop.*.*test(..))")
public void testPointCut() {
}

@Around("testPointCut()")
public Object doAround(ProceedingJoinPoint point) throws Throwable {
    Object object = point.proceed();
    return object;
}

}[/code]

  • 写回答

1条回答 默认 最新

  • jinnianshilongnian 2012-12-12 07:29
    关注

    切入点写错了
    "execution(* demo.aop.*.*test(..))"

    应该是如
    "execution(* demo.aop.*.*(..))"

    不是这的问题

    如图
    [img]http://my.iteye.com/admin/picture/121419[/img]

    使用cglib会生成目标对象的子类,然后调用set时会直接设置代理对象的data,所以造成了target的data没有设置。 当你调用get方法时因为是final 所以没有被代理 直接调用的是目标对象的,所以是null。
    1、解决办法,可以参考之前类似的问题,通过aop解决
    [url]http://jinnianshilongnian.iteye.com/blog/1678800[/url]

    2、如果改不了目标,可以考虑适配器设计模式

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?