我可以自动连接命名记录器吗?

Koj*_*tak 5 java logging spring autowired

我正在使用根据类名称命名的非静态记录器:

protected Logger logger = LoggerFactory.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)

我是否可以通过某种方式配置spring,该方式将使用@Autowired设置正确的记录器?

@Autowired
protected Logger logger;
Run Code Online (Sandbox Code Playgroud)

我可以使用工厂方法进行记录器初始化,但是我不知道如何将类名作为参数传递。对于基于setter的依赖项注入,spring必须知道类名,因为它保留了对bean的引用。我可以以某种方式访问​​它吗?还有另一种方法吗?

Jav*_*i M 6

为了使Logger可注入@Autowired,必须具有一个配置类,在该配置类中已配置了要使用的所有Bean @Autowired。该班级将以标记@Configuration。在那里,您必须@Bean在配置中放入以下内容:

@Configuration
public class WebConfiguration {

    @Bean
    @Scope("prototype")
    public Logger produceLogger(InjectionPoint injectionPoint) {
        Class<?> classOnWired = injectionPoint.getMember().getDeclaringClass();
        return LoggerFactory.getLogger(classOnWired);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。好好问一下……当 java 示例包含列出的所有重要导入语句(不带“*”)时,弄清楚这些就容易多了。 (3认同)
  • 对于未来的读者:导入 org.springframework.beans.factory.InjectionPoint; 导入 org.springframework.context.annotation.Bean; 导入 org.springframework.context.annotation.ComponentScan; 导入 org.springframework.context.annotation.Configuration; 导入 org.springframework.context.annotation.Scope; 导入 org.slf4j.Logger 导入 o​​rg.slf4j.LoggerFactory; (3认同)

koz*_*a13 1

您可以使用 @Inject 和 BeanFactoryPostProcessor 注入它

@Inject
Logger logger;
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到更多详细信息:使用java注释注入记录器依赖项