Spring AspectJ集成不起作用

时间:2016-11-04 11:12:18

标签: java spring spring-aop

我试图使用Spring / AspectJ集成而没有运气。 Spring版本是3.2.17(是的,有点旧,我知道)。

以下是我的相关配置:

的pom.xml:

    <!-- Spring dependencies, including spring-aspects -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.7.4</version>
    </dependency>

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.7.4</version>
    </dependency>

的applicationContext.xml:

<context:annotation-config/>
<aop:aspectj-autoproxy />
<bean id="loggingAspect" class="com.jason.app.web.util.logging.LoggingAspect" />    

LoggingAspect.java(相关类):

@Aspect
public class LoggingAspect {

    private Logger log = LoggerFactory.getLogger(LoggingAspect.class);


    /**
     * Advice for before logging
     * @param joinPoint
     */
    @Before("execution(* com.jason.app.web.process..*(..))")
    private void beforeAdvice(JoinPoint joinPoint) {

        final String outputFormat = "intercept: executing method %s(%s)";
        final String method =joinPoint.getSignature().getName();

        List<?> argumentList = Collections.unmodifiableList(Arrays.asList(joinPoint.getArgs()));
        final String formattedArguments = argumentList.stream().map(s -> s.toString()).collect(Collectors.joining(", "));

        log.debug(String.format(outputFormat, method, formattedArguments));

    }
}

我倾注了在线教程,没有运气。谁能指出我做错了什么?

杰森

3 个答案:

答案 0 :(得分:2)

Spring配置标记<aop:aspectj-autoproxy />将启用Spring的基于代理的AOP基础结构,该基础结构仅适用于Spring bean,并且它使用具有此解决方案的所有限制的代理,而不是纯粹的AspectJ。

现在,如果您想使用AspectJ而不是Spring AOP,则需要在编译时编织或加载时编织之间进行选择。如果您使用编译时编织,则需要将aspectj-maven-plugin添加到构建中。如果选择加载时编织,则需要使用-javaagent:path/to/aspectjweaver.jar vm参数运行JVM,如AspectJ Documentation中所述。

如果您需要通过Spring(自动装配等)对您的方面进行后期处理,则需要在Spring配置中列出它。方面是在Spring之外创建的单例实例,因此您需要指定静态工厂方法aspectOf()来访问由AspectJ运行时创建的aspectj的单个实例。

<bean id="loggingAspect" 
    class="com.jason.app.web.util.logging.LoggingAspect" 
    factory-method="aspectOf"
/>

或带注释的方式:

@Configuration
public class AspectConfig {
    @Bean
    public LoggingAspect loggingAspect() {
        return LoggingAspect.aspectOf();
    }
}

如果除了AspectJ之外你不打算使用Spring AOP,请不要忘记删除<aop:aspectj-autoproxy />。当AspectJ如此强大时,你为什么选择这样做呢?

答案 1 :(得分:1)

你可以再增加一个依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
</dependency>

尝试,将你的切点改为

@Before("execution(* com.jason.app.web.process..*.*(..))")

(表示建议将应用于服务包或子包中定义的所有公共方法:com.jason.app.web.process)

答案 2 :(得分:0)

将表达式更改为
@Before("execution(public * your.package.YourClass.yourMethod(..))")