我试图使用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));
}
}
我倾注了在线教程,没有运气。谁能指出我做错了什么?
杰森
答案 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(..))")