原文见:
http://www.yulei.name/?p=445这里提出了一个很诡异的问题:
Spring使用实现aop日志,如果强制指定Spring3使用cglib的方式实现aop(<aop:aspectj-autoproxy proxy-target- class="true"/>  ),也就是在运行时,生成子类代替父类,那么继承自ActionSupport的类的@Autowired成员变量可以被注入。如果不强制使用cglib,对于实现了类的ActionSupport的子类,Spring使用jdk动态代理的方式实现aop,这时候@Autowired成员变量不会被注入。是不是struts2在后面搞了什么飞机?

解决方案 »

  1.   

    Spring的aop默认是jdk动态代理来实现的
    必须面向接口编程
    很可能你的aop代理类 没实现接口
      

  2.   

    Spring如果发现有个类没有实现任何接口,会继续使用cglib来伪造一个当前类(伪造的手段是生成当前类的子类)。没有面向接口是没有问题的。启动和请求的整个过程没有异常。我把log4j开到DEBUG级别,看到Spring和struts2的启动过程,正如猜测的那样,系统使用了jdk动态代理的方式处理action类,但是根据日志的自动装配的情况来看,应该是代理的类(或者接口)出现了问题,它没有包含原来那个类的成员变量。我猜测这个action被代理了2次,第一次是struts的代理机制代理了这个action,然后我的日志aop又代理了struts的代理类,在某次过程中,把成员变量给代理丢了。