我正在使用AspectJ,并且尝试在@Component注释上进行切入点。
@Pointcut("@annotation(org.springframework.stereotype.Component)")
public void bean() {
}
@Before("bean()")
public void beforeBeanCreation(JoinPoint jp) {
System.out.println("Works!");
}
我的配置如下:
@Configuration
@ComponentScan({"com.app.pl"})
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class AppConfiguration{
}
当我想在具有ElementType.METHOD的批注或具有特定名称的bean上切入点时,一切都可以使用。但是,使用ElementType.TYPE进行注释的Pointcut无法正常工作。我推测这是与批注相关的问题,它们是在AspectJ代理站起来之前先阅读的。
有什么办法解决这个问题吗?
答案 0 :(得分:0)
可能您不是在使用AspectJ,而是在使用Spring AOP。因此,需要考虑以下几点:
@Component
上工作,而不是在非Spring上工作。为此,您确实需要AspectJ。因此,无论如何,您的Spring AOP方面还是会寻找该注释。@Component
,但会自动从方面编织中排除。在AspectJ中,您需要采取特殊的预防措施,以排除编织与普通应用程序代码具有相同注释的另一个方面。在将Spring AOP与完整的AspectJ结合使用的情况下,您需要考虑这一点。关于您的AOP问题,您已经注意到,您无法通过@annotation()
切入点截取带注释的类中的连接点。您需要改用@within()
,例如:
@within(org.springframework.stereotype.Component)
请注意,这将拦截带注释的类中的所有联接点,即在Spring AOP的情况下,将执行所有方法。如果您的日志消息表明这是您的目标,它将不会拦截Bean的创建。