首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >添加Spring AOP后@Autowired return null

添加Spring AOP后@Autowired return null
EN

Stack Overflow用户
提问于 2018-05-11 20:46:12
回答 5查看 875关注 0票数 0

我有一个spring boot项目,它运行得非常好。但是,当我添加spring AOP时,它会在我使用@Autowired变量时导致空指针。

以下是我的AOP代码。

代码语言:javascript
运行
复制
    @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;
    }

EN

回答 5

Stack Overflow用户

发布于 2018-05-11 21:29:32

您建议您的所有方法:@Around("execution(* com.kpi.ninja..*.*(..))")

所以我猜Spring AOP排除了你的MyAspect类以避免无限递归。

首先,尝试将@Around切入点缩小到单个方法,看看它是否有效。

之后,使用Point cut注解将您的logTimeMethod排除在建议之外。

票数 1
EN

Stack Overflow用户

发布于 2018-05-11 21:34:18

请确保您正在使用@Autowired的类使用@Component/@Service/@ that进行了注释。您发布的代码既不包含初始类定义,也不包含spring XML,因此我不确定您是否在其中添加了注释。

代码语言:javascript
运行
复制
@Component or @Controller or @Bean or @Service/@Repository 
Class ACB{

@Autowired
private Service service;

.....

}

自动装配通过将一个bean的实例放入另一个bean的实例中的所需字段中来实现。这两个类都应该是bean,即它们应该被定义为存在于应用程序上下文中。

票数 1
EN

Stack Overflow用户

发布于 2020-07-12 00:12:04

当你@Autowired一个私有变量时,就会发生这种情况。由于AOP不能委托私有变量,因此该变量在AOP委托类中变为null。为了避免这种情况,您可以为类中的私有自动连接变量创建并使用getter,而不是直接使用私有变量。

请参阅此示例:

代码语言:javascript
运行
复制
@Autowired
private SomeClass someClass;

您应该创建一个getter并使用getSomeClass().doSomething(),而不是使用someClass.doSomething()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50292685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档