当前位置:  开发笔记 > 编程语言 > 正文

Spring AOP CGLIB代理的字段为空

如何解决《SpringAOPCGLIB代理的字段为空》经验,为你挑选了1个好方法。

这是潜在的意外行为的组合.首先,Spring使用CGLIB为AOP代理您的bean.CGLIB代理是类的动态子类型的实例,它将所有方法调用委托给类的实际实例.但是,即使代理是子类型,其字段也不会被初始化(即,TargetClass不会调用您的超级构造函数).可以在这里找到更长的解释.

另外,你的方法

public final libvlc_media_list_t mediaListInstance() {
    return mediaListInstance; // <- proxy object return null, if use aop
}

要么

public final String test() {
    System.out.println("TargetClass.test();");
    return returnValue;
}

是的final.因此CGLIB不能覆盖它们以委托给实例.这将在Spring日志中暗示.例如,你会看到

22:35:31.773 [main] INFO  o.s.aop.framework.CglibAopProxy - Unable to proxy method [public final java.lang.String com.example.root.TargetClass.test()] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.

将上述所有内容放在一起,您将获得一个代理实例,其中字段位于null代理实例的方法所在的代理实例.所以你的代码实际上会调用

public final String test() {
    System.out.println("TargetClass.test();");
    return returnValue;
}

对于该returnValue字段的实例null.


如果可以,请更改方法,删除final修改器.如果你不能,你将不得不重新考虑你的设计.



1> Sotirios Del..:

这是潜在的意外行为的组合.首先,Spring使用CGLIB为AOP代理您的bean.CGLIB代理是类的动态子类型的实例,它将所有方法调用委托给类的实际实例.但是,即使代理是子类型,其字段也不会被初始化(即,TargetClass不会调用您的超级构造函数).可以在这里找到更长的解释.

另外,你的方法

public final libvlc_media_list_t mediaListInstance() {
    return mediaListInstance; // <- proxy object return null, if use aop
}

要么

public final String test() {
    System.out.println("TargetClass.test();");
    return returnValue;
}

是的final.因此CGLIB不能覆盖它们以委托给实例.这将在Spring日志中暗示.例如,你会看到

22:35:31.773 [main] INFO  o.s.aop.framework.CglibAopProxy - Unable to proxy method [public final java.lang.String com.example.root.TargetClass.test()] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.

将上述所有内容放在一起,您将获得一个代理实例,其中字段位于null代理实例的方法所在的代理实例.所以你的代码实际上会调用

public final String test() {
    System.out.println("TargetClass.test();");
    return returnValue;
}

对于该returnValue字段的实例null.


如果可以,请更改方法,删除final修改器.如果你不能,你将不得不重新考虑你的设计.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有