我有一个spring boot项目,它运行得非常好。但是,当我添加spring AOP时,它会在我使用@Autowired变量时导致空指针。
以下是我的AOP代码。
@Autowired
private Service service;
private final org.apache.commons.logging.Log log = LogFactory.getLog(this.getClass());
@Around("execution(* com.kpi.ninja..*.*(..))")
public Object logTimeMethod(ProceedingJoinPoint joinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
System.out.println("Entering in Method : " + joinPoint.getSignature().getName());
System.out.println("Class Name : " + joinPoint.getSignature().getDeclaringTypeName());
System.out.println("Target class : " + joinPoint.getTarget().getClass().getName());
Object retVal = joinPoint.proceed();
stopWatch.stop();
StringBuffer logMessage = new StringBuffer();
logMessage.append(joinPoint.getTarget().getClass().getName());
logMessage.append(".");
logMessage.append(joinPoint.getSignature().getName());
logMessage.append("(");
// append args
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
logMessage.append(args[i]).append(",");
}
if (args.length > 0) {
logMessage.deleteCharAt(logMessage.length() - 1);
}
logMessage.append(")");
logMessage.append(" execution time: ");
logMessage.append(stopWatch.getTotalTimeMillis());
logMessage.append(" ms");
log.info(logMessage.toString());
return retVal;
}

发布于 2018-05-11 21:29:32
您建议您的所有方法:@Around("execution(* com.kpi.ninja..*.*(..))")
所以我猜Spring AOP排除了你的MyAspect类以避免无限递归。
首先,尝试将@Around切入点缩小到单个方法,看看它是否有效。
之后,使用Point cut注解将您的logTimeMethod排除在建议之外。
发布于 2018-05-11 21:34:18
请确保您正在使用@Autowired的类使用@Component/@Service/@ that进行了注释。您发布的代码既不包含初始类定义,也不包含spring XML,因此我不确定您是否在其中添加了注释。
@Component or @Controller or @Bean or @Service/@Repository
Class ACB{
@Autowired
private Service service;
.....
}自动装配通过将一个bean的实例放入另一个bean的实例中的所需字段中来实现。这两个类都应该是bean,即它们应该被定义为存在于应用程序上下文中。
发布于 2020-07-12 00:12:04
当你@Autowired一个私有变量时,就会发生这种情况。由于AOP不能委托私有变量,因此该变量在AOP委托类中变为null。为了避免这种情况,您可以为类中的私有自动连接变量创建并使用getter,而不是直接使用私有变量。
请参阅此示例:
@Autowired
private SomeClass someClass;您应该创建一个getter并使用getSomeClass().doSomething(),而不是使用someClass.doSomething()。
https://stackoverflow.com/questions/50292685
复制相似问题