【问题标题】:Spring AOP not working on Spring SOAP Web ServiceSpring AOP 不适用于 Spring SOAP Web 服务
【发布时间】:2019-05-02 12:39:08
【问题描述】:

我有一个 spring soap web 服务,我想使用自定义日志记录方面来衡量它的性能。该方面对于普通的 spring bean 工作正常,但没有被 Endpoint-invokeInternal 方法调用。对于类似受保护的方法,春天是否有任何限制......?感谢任何帮助以使其正常工作?

代码示例:

@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...
    }
}

弹簧上下文:

<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 仅适用于 public 方法?

【问题讨论】:

    标签: spring-aop spring-ws


    【解决方案1】:

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

    Spring AOP 知道创建动态代理的两种方式:

    • JDK 动态代理:这是默认设置,但仅适用于接口(或实现它们的 Spring 组件类),并且仅代理这些接口中定义的公共方法。
    • CGLIB 代理:这必须通过&lt;aop:aspectj-autoproxy proxy-target-class="true"/&gt;(或等效的配置注释)激活,您已经这样做了,并且适用于接口和类。因此,如果您有一个实现接口的类,您可以期望只有在该接口中定义的公共方法才能成为代理,就像 JDK 代理一样。我猜这取决于您如何定义 Spring bean 的类型。确保真正实例化类类型,而不是接口类型。然后受保护或包范围的方法也应该由 CGLIB 代理(而不是私有方法)。因此,如果操作正确,这应该可以工作。

    我不是在说你在这里使用一个不推荐使用的基类和同样不推荐使用的方法,只是回答你的问题......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2019-02-25
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多