AOP Spring 方面方法未应用于目标对象

AOP Spring aspect method not applied on target object

有一个方面 class (@Aspect) 方面方法不是 运行。 这是因为目标对象 (org.services.myService) 不在组件扫描列表中。 servlet-context.xml:

<context:component-scan base-package="org.controllers" />
<aop:aspectj-autoproxy />

如果添加包 "org.services" 则切入点 @Pointcut("within(org.services.myService") 有效。

问题是无法更改 servlet 中的组件扫描-context.xml:

该项目有一个单独的 applicationContext.xml 来扫描服务文件夹,它有一个组件扫描。

Adding aspectj-autoproxy after each component-scan seems not to work as only finds beans(controllers) scanned in first component-scan

此外,如果我在同一个文件夹上进行两次组件扫描(JBoss:找到 2 个用于自动装配的 beans)以及项目结构的其他原因(混合XML 允许 运行 在 JBoss 和 Jetty 中。

如何在不更新 context:component-scan 的情况下使方面 class 可以使用 myService class?

使用 spring-aop 你只能将建议应用到 spring beans,所以如果你不使用 spring 注册你的 myService bean,建议将不适用。该建议将仅应用于您从 spring 上下文中获取的 bean 实例。

如果您无法更改组件扫描指令以包含该 bean 的包,您仍然可以在其中一个扫描包中添加配置 class 以实例化您的 myService 并注册它作为一个 spring bean。

package org.controllers;

@Configuration
public class MyServiceConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}

或将 xml 配置到您的 spring xml 配置之一:

<bean class="org.services.MyService" />

每个 XML 配置文件(应用程序上下文和 servlet 上下文)需要创建在其上创建方面的 bean,以及方面 class。 我在组件扫描中遗漏了最新的一个:

<context:component-scan base-package="org.services, org.aspects"/> 
<aop:aspectj-autoproxy />

每个处理方面 (aspectj-autoproxy) 的 XML 需要在同一范围内具有所有必需的 bean。 (在本例中,通过组件扫描创建)。