Java 春季aop:can';找不到引用的切入点批注
我试图监视某些方法的运行。我在运行程序时遇到了这个错误Java 春季aop:can';找不到引用的切入点批注,java,spring,spring-aop,Java,Spring,Spring Aop,我试图监视某些方法的运行。我在运行程序时遇到了这个错误 Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'arithmeticCalculator' defined in URL [jar:file:/home/android/java/spring-5-recipes-master/spring-recipes-UP
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'arithmeticCalculator' defined in URL [jar:file:/home/android/java/spring-5-recipes-master/spring-recipes-UPDATED-master/ch02/recipe_2_17_i/build/libs/recipe_2_17_i-4.0.0-SNAPSHOT.jar!/com/apress/springrecipes/calculator/ArithmeticCalculatorImpl.class]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut annotation
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:591)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
at org.springframework.context.support.GenericXmlApplicationContext.<init>(GenericXmlApplicationContext.java:71)
at com.apress.springrecipes.calculator.Main.main(Main.java:11)
Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut annotation
at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:319)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:226)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.obtainPointcutExpression(AspectJExpressionPointcut.java:197)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:176)
at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:224)
at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:283)
at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:315)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:124)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:93)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:74)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:352)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:304)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:438)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1714)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583)
... 10 more
然后我将切入点定义为
@Aspect
public class CalculatorPointcuts {
@Pointcut("annotation(com.apress.springrecipes.calculator.LoggingRequired)")
public void loggingOperation() {}
}
然后我将切入点应用到一个方面。这方面是记录方法的运行状态
@Aspect
@Component
public class CalculatorLoggingAspect {
private Log log = LogFactory.getLog(this.getClass());
@Before("CalculatorPointcuts.loggingOperation()")
public void logBefore(JoinPoint joinPoint) {
log.info("The method " + joinPoint.getSignature().getName()
+ "() begins with " + Arrays.toString(joinPoint.getArgs()));
}
@After("CalculatorPointcuts.loggingOperation()")
public void logAfter(JoinPoint joinPoint) {
log.info("The method " + joinPoint.getSignature().getName()
+ "() ends");
}
}
介绍了算术计算器接口及其实现
public interface ArithmeticCalculator {
public double add(double a, double b);
public double sub(double a, double b);
}
@Component("arithmeticCalculator")
@LoggingRequired
public class ArithmeticCalculatorImpl implements ArithmeticCalculator {
public double add(double a, double b) {
return a + b;
}
public double sub(double a, double b) {
return a - b;
}
}
有人知道问题出在哪里吗
谢谢我注意到两件事
1) @annotation
在方法级别工作,而不是在类级别。在
@Pointcut("@within(com.apress.springrecipes.calculator.LoggingRequired)")
public void loggingOperation() {}
2) 在另一个类引用中定义切入点将是另一个问题。而是在同一个类中定义它
@Aspect
@Component
public class CalculatorLoggingAspect {
private Log log = LogFactory.getLog(this.getClass());
@Pointcut("@within(com.apress.springrecipes.calculator.LoggingRequired)")
public void loggingOperation() {}
@Before("loggingOperation()")
public void logBefore(JoinPoint joinPoint) {
log.info("The method " + joinPoint.getSignature().getName()
+ "() begins with " + Arrays.toString(joinPoint.getArgs()));
}
@After("loggingOperation()")
public void logAfter(JoinPoint joinPoint) {
log.info("The method " + joinPoint.getSignature().getName()
+ "() ends");
}
}
issue-57720747-aspect-logging-annotation它应该是
@annotation
不是吗?它在添加@
@Aspect
@Component
public class CalculatorLoggingAspect {
private Log log = LogFactory.getLog(this.getClass());
@Pointcut("@within(com.apress.springrecipes.calculator.LoggingRequired)")
public void loggingOperation() {}
@Before("loggingOperation()")
public void logBefore(JoinPoint joinPoint) {
log.info("The method " + joinPoint.getSignature().getName()
+ "() begins with " + Arrays.toString(joinPoint.getArgs()));
}
@After("loggingOperation()")
public void logAfter(JoinPoint joinPoint) {
log.info("The method " + joinPoint.getSignature().getName()
+ "() ends");
}
}