2016-11-04 56 views
0

我试图在没有运气的情况下使用Spring/AspectJ集成。春天的版本是3.2.17(是的,有点旧,我知道)。Spring AspectJ集成不起作用

这里是我的相关配置:

的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)); 

    } 
} 

我倒了o nline教程,没有运气。任何人都可以指出我做错了什么?

杰森

+0

由于Spring-AOP的限制,当我试图讨论与AspectJ的Spring集成时,由于主持人确信自己我想使用Spring-AOP,因此将其关闭。 谢谢你没有人。 – Jason

回答

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)

+0

什么都没有。我是否必须启用编译时编织或使用aspectj maven插件? 我的问题是,我有一个要求记录ALL方法调用的条目和结果,而不管访问说明符如何。所以,Spring AOP不会工作,因为它是基于代理的,只能执行公共方法。 – Jason

+1

@Jason他们你必须去纯粹的方面j。正如你所说春天只能拦截公共方法 检查http://stackoverflow.com/q/23327336/410677 – kuhajeyan

+1

这就是为什么我说AspectJ而不是Spring AOP。 – Jason

0

更改e上的表达,以
@Before("execution(public * your.package.YourClass.yourMethod(..))")

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配置中列出它。 Aspects是在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(); 
    } 
} 

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

+0

谢谢。看起来Spring/AspectJ的大部分教程都遗漏了这一点。 Spring AOP不能满足我的需求,因为我需要记录所有方法的输入和输出,而不仅仅是公共的。 – Jason