Spring AOP无法在Spring SOAP Web服务上运行

7uzetpgm  于 2023-03-16  发布在  Spring
关注(0)|答案(1)|浏览(118)

我有一个spring soap web服务,我想使用自定义日志记录方面来测量它的性能。该方面对于普通的spring bean工作正常,但是对于Endpoint-invokeInternal方法没有被调用。spring中对于相同的受保护方法是否有任何限制...?感谢任何帮助来让它工作?
代码示例:

@Component
@Aspect
public class AspectLogging {

    @Around(value = "execution(* *(..)) && @annotation(logTime)", argNames = "logTime")
    public Object logAround(ProceedingJoinPoint joinPoint, LogTime logTime) throws Throwable {
            // Time logging goes here...
    }
}

Spring上下文:

<aop:aspectj-autoproxy proxy-target-class="true"/> 
<!-- Aspect -->
<bean id="aspectLog" class="com.x.y.AspectLogging" />

Spring WS端点:

public class MyEndPoint extends AbstractJDomPayloadEndpoint {
    @LogTime
    protected Element invokeInternal(Element request) throws Exception {
        // Service call goes here...
    }
}

更新:在将访问修饰符改为public之后,它工作了,这是否意味着Spring允许AOP只适用于公共方法?

vc9ivgsu

vc9ivgsu1#

更新:在将访问修饰符改为public之后,它工作了,这是否意味着Spring允许AOP只适用于公共方法?
SpringAOP知道两种创建动态代理的方法:

  • JDK动态代理:这是默认设置,但只适用于接口(或实现它们的Spring组件类),并且只代理那些接口中定义的公共方法。
  • CGLIB代理:这必须通过<aop:aspectj-autoproxy proxy-target-class="true"/>激活(或者一个等价的配置注解),你已经做了,并且对接口和类都有效。所以如果你有一个类实现一个接口,你可以期望只有在那个接口中定义的公共方法是代理,就像JDK代理一样。我想这取决于你如何定义你的Springbean的类型。确保真正示例化类类型,而不是接口类型。那么受保护的或包作用域的方法也应该由CGLIB代理(只是不是私有方法)。所以如果做得正确,这应该可以工作。

我不是在这里谈论您使用一个过时的基类和同样过时的方法,只是回答您的问题...

相关问题