場景
代碼
@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