我需要实现内部类的拦截器,外部类由Spring托管
@Component
@Scope("prototype")
public class Outer {
protected class Inner {
protected void methodToIntercept() {
}
}
}Outer.Inner.class可能有childs (也可能是匿名的)。重写的methodToIntercept()也应该被截获
文档非常简单:https://docs.spring.io/spring/docs/3.2.0.RELEASE/spring-framework-reference/htmlsingle/#aop-aj-ltw
根据文档,我按照以下方式配置了所有内容:
项目结构
-src
--main
---java
----temp
-----Config.java
-----MyAspect.java
-----Outer.java
-----SpringBean.java
--test
---resources
----META-INF
-----aop.xmlaop.xml
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver>
<include within="temp.*"/>
</weaver>
<aspects>
<aspect name="temp.MyAspect"/>
</aspects>
</aspectj>Config.java
@Configuration
@EnableLoadTimeWeaving
@ComponentScan("temp")
@Lazy
public class Config {
}Outer.java
@Component
@Scope("prototype")
public class Outer {
@Component
public static class Inner {
public void methodToIntercept() {
}
}
}MyAspect.java
@Aspect
@Component
public class MyAspect {
@Autowired
private SpringBean springBean;
@Around("execution(* temp.Outer.Inner.methodToIntercept())")
public Object interceptor(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("success");
return joinPoint.proceed();
}
}依赖关系
<dependencies>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/aspectj/aspectjweaver -->
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-instrument -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
</dependencies>不幸的是,它并没有像我预期的那样工作
它应该与这样的配置一起工作吗?我错过了什么?
谢谢
发布于 2017-12-23 04:59:43
尝试创建自定义注释并对方法进行注释。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ServiceLoggable {
}您的周围的@将如下所示
@Around("execution(* *(..)) && @annotation(com.company.core.log.ServiceLoggable)")
public Object logServiceMethods(ProceedingJoinPoint jp) throws Throwable {
...
}https://stackoverflow.com/questions/46989570
复制相似问题