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

通过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、如果改不了目标,可以考虑适配器设计模式

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

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题