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

问题描述 投票:1回答:2

有一个Aspect类(@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来扫描services文件夹,并且它有一个组件扫描。

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

此外,如果我在同一个文件夹上执行两次组件扫描(JBoss:发现用于自动装配的2个bean),以及项目结构导致的其他原因(XML的混合允许它在JBoss和Jetty中运行),项目将抛出错误)。

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

java spring spring-aop
2个回答
0
投票

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

如果您无法更改组件扫描指令以包含该bean的包,您仍然可以在其中一个扫描包中添加配置类以实例化您的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" />

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.