场景
代码
@RestController
public class TestJob {@Autowiredprivate XxService xxService;@XxlJob("testCGLIB")private void doTest(){System.out.println("方法调用");System.out.println("成员变量注入:"+(xxService!=null));this.doInnerTest();System.out.println("doInnerTest执行后成员变量注入:"+(xxService!=null));}public void doInnerTest(){System.out.println("内部private方法调用");System.out.println("内部private方法成员变量注入:"+(xxService!=null));System.out.println("内部private方法调用结束");}
}
除此之外,我对@XxlJob使用了AOP增强
执行结果
问题
众所周知,AOP无法代理方法为private的类,但是这里我只对private方法进行了增强,如果两者都是源对象调用的,那么应该都为true或都为false,如果都是代理对象调用的,为何会出现这种结果
原因
SpringCGLIB实际上是生成增强后的子类,但是成员变量等都为空,然后在源对象上调用增强后子类的方法。因为CGLIB不能增强private方法,因此通过反射调用原方法访问的是CGLIB生成的子对象的成员变量,结果为false。然后调用了CGLIB生成的子对象的public方法,该方法通过反射在源对象执行,访问的是源对象的成员变量,结果为true