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

时间:2017-12-15 17:16:25

标签: java spring spring-aop

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

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

如果添加包“org.services”,那么切入点 @Pointcut(“在(org.services.myService”)中就可以了。

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

项目有一个单独的applicationContext.xml来扫描services文件夹,并且它有一个组件扫描。

  

在每次组件扫描后添加aspectj-autoproxy似乎不起作用   因为只找到在第一个组件扫描中扫描的bean(控制器)

此外,如果我在同一个文件夹上执行两次组件扫描(JBoss:为自动装配找到2个bean),以及由于项目结构而导致的其他原因(XML的混合允许它在JBoss和Jetty)。

如何在不更新上下文的情况下使myService类可用于aspect类:component-scan?

2 个答案:

答案 0 :(得分:0)

使用spring-aop,你只能向spring bean申请建议,所以如果你没有用spring注册你的myService bean,那么这个建议将不适用。该建议仅适用于从spring上下文获取的bean实例。

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

package org.controllers;

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

或者将xml配置到你的一个spring xml配置中:

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

答案 1 :(得分:0)

每个XML配置文件(应用程序上下文和servlet上下文)都需要创建创建方面的bean以及Aspect类。 我错过了组件扫描中的最新版本:

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

处理方面的每个XML(aspectj-autoproxy)需要在同一范围内拥有所需的所有bean。 (在这种情况下,通过组件扫描创建)。