繁体   English   中英

对于LoggerContext,@ Aspect中的@Autowired依赖项注入为null

[英]@Autowired dependency injection in @Aspect is null for LoggerContext

我的简单应用程序在添加LoggingAspectConfiguration类之前运行良好。 源代码如下:(删除了导入语句)

这是一流的

package com.rsa.tools.springmvc.configuration;

public class ApplicationInitialization extends AbstractAnnotationConfigDispatcherServletInitializer {
  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class[] { ApplicationRootClassConfiguration.class };
  }

  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class[] { ApplicationWebConfiguration.class };
  }

  @Override
  protected String[] getServletMappings() {
    return new String[] { "/" };
  }
}

这是组件可能存在的应用程序根类

package com.rsa.tools.springmvc.configuration.backend;

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages={"com.rsa.tools.springmvc.configuration.general", "com.rsa.tools.springmvc.configuration.backend", "com.rsa.tools.springmvc.dao", "com.rsa.tools.springmvc.service"})
public class ApplicationRootClassConfiguration {
}

登录配置

package com.rsa.tools.springmvc.configuration.general;

@Configuration
public class ApplicationLogbackConfiguration {
   @Bean
   public LoggerContext getLoggerContext() { ... }
}

到这里为止一切正常。

在添加以下类之后:

package com.rsa.tools.springmvc.configuration.general;

@Aspect
@Component
public class LoggingAspectConfiguration {
  @Autowired
  LoggerContext loggerCtx;

  @Pointcut("execution(* *.*(..))")
  protected void loggingOperation() {}

  @Before("loggingOperation()")
  @Order(1)
  public void logJoinPoint(JoinPoint joinPoint) {
    Logger logger = loggerCtx.getLogger(this.getClass());
    logger.trace("Join point kind : " + joinPoint.getKind());
    logger.info("Signature declaring type : "+ joinPoint.getSignature().getDeclaringTypeName());
    logger.info("Signature name : " + joinPoint.getSignature().getName());
    logger.info("Arguments : " + Arrays.toString(joinPoint.getArgs()));
    logger.info("Target class : "+ joinPoint.getTarget().getClass().getName());
    logger.info("This class : " + joinPoint.getThis().getClass().getName());
  }
  ...
}

我开始看到Null指针异常,因为对于loggerCtx依赖项注入无效。 如何解决这个问题?

方面是在弹簧容器外部创建的。

与其创建LoggingAspectConfiguration作为组件,不如尝试在ApplicationLogbackConfiguration(它是配置类)中作为Bean创建。

在LoggingAspectConfiguration内为LoggerContext创建一个setter方法

@Bean
public LoggingAspectConfiguration getLoggerContext(LoggerContext  context) 
{
LoggingAspectConfiguration aspect = new LoggingAspectConfiguration();
aspect.setLoggerContext (context)
return aspect;  
}

春季容器autowiresLoggerContext按类型(或者您可以在该方法参数中使用@Autowired批注。)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM