Spring 中的完整 AspectJ 支持
Full AspectJ support in Spring
我想对不属于 Spring bean 的方法提出建议(Spring Boot 1.4.4.RELEASE):
@Component
@Aspect
...
@Around("execution(public * com.netflix.appinfo.InstanceInfo.getId())")
我添加了 aspectjrt 和 spring-instrument (??) 依赖项
我添加了@EnableAspectJAutoProxy 和@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED) 注释
我添加了 VM 参数:
-javaagent:d:\.m2\repository\org\springframework\spring-instrument.3.6.RELEASE\spring-instrument-4.3.6.RELEASE.jar
-javaagent:d:\.m2\repository\org\aspectj\aspectjweaver.8.9\aspectjweaver-1.8.9.jar
bean 已处理(构造后日志)但未拦截执行。
有没有人知道我可能会错过的事情?提前致谢
尝试像这样使用 @Pointcut
注释:
@Pointcut("execution(public * com.netflix.appinfo.InstanceInfo.getId())")
public void pointcut() {}
@Around("pointcut()")
public Object whatever(ProceedingJoinPoint joinPoint) throws {...}
好的,对于那些感兴趣的人来说,这是一个技巧,单例模式正在处理 LTW 和 Spring 对单例的访问,因此它可以在被编织后注入 Spring 依赖项LTW:
@Configuration
@Aspect
public class MyAspect {
@Value("${mycompany.property}")
private String myKey;
@Around("execution(public * com.mycompany.NotASpringean.getProperty())")
public String weave(ProceedingJoinPoint jp) throws Throwable {
String value = (String) jp.proceed();
// transform the value thx to injected myKey value
return value;
}
@Bean("post-construct-aspect")
public MyAspect init() {
return MyAspect.aspectOf(); // get existing instance via factory method
}
private static MyAspect instance = new MyAspect();
/** Singleton pattern used by LTW then Spring */
public static MyAspect aspectOf() {
return instance;
}
}
我想对不属于 Spring bean 的方法提出建议(Spring Boot 1.4.4.RELEASE):
@Component
@Aspect
...
@Around("execution(public * com.netflix.appinfo.InstanceInfo.getId())")
我添加了 aspectjrt 和 spring-instrument (??) 依赖项
我添加了@EnableAspectJAutoProxy 和@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED) 注释
我添加了 VM 参数:
-javaagent:d:\.m2\repository\org\springframework\spring-instrument.3.6.RELEASE\spring-instrument-4.3.6.RELEASE.jar
-javaagent:d:\.m2\repository\org\aspectj\aspectjweaver.8.9\aspectjweaver-1.8.9.jar
bean 已处理(构造后日志)但未拦截执行。 有没有人知道我可能会错过的事情?提前致谢
尝试像这样使用 @Pointcut
注释:
@Pointcut("execution(public * com.netflix.appinfo.InstanceInfo.getId())")
public void pointcut() {}
@Around("pointcut()")
public Object whatever(ProceedingJoinPoint joinPoint) throws {...}
好的,对于那些感兴趣的人来说,这是一个技巧,单例模式正在处理 LTW 和 Spring 对单例的访问,因此它可以在被编织后注入 Spring 依赖项LTW:
@Configuration
@Aspect
public class MyAspect {
@Value("${mycompany.property}")
private String myKey;
@Around("execution(public * com.mycompany.NotASpringean.getProperty())")
public String weave(ProceedingJoinPoint jp) throws Throwable {
String value = (String) jp.proceed();
// transform the value thx to injected myKey value
return value;
}
@Bean("post-construct-aspect")
public MyAspect init() {
return MyAspect.aspectOf(); // get existing instance via factory method
}
private static MyAspect instance = new MyAspect();
/** Singleton pattern used by LTW then Spring */
public static MyAspect aspectOf() {
return instance;
}
}