7

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

protected Logger logger = LoggerFactory.getLogger(getClass());

我可以以某种方式配置弹簧,以使用@Autowired 设置正确的记录器吗?

@Autowired
protected Logger logger;

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

4

4 回答 4

12

为了使 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);
    }
}
于 2018-02-20T12:10:26.537 回答
0

你可以用@Qualifier注释来做到这一点。当然,这意味着您已经将Logger对象添加到应用程序上下文中。

将此配置导入您的应用程序上下文将允许您这样做:

@Configuration
public class LoggerConfig {
    @Bean
    public Logger myClassLogger() {
        return LoggerFactory.getLogger(MyClass.class);
    }

    @Bean
    public Logger myOtherClassLogger() {
        return LoggerFactory.getLogger(MyOtherClass.class);
    }
}

然后在你的类中使用Logger

@Component
public class MyClass {
    @Autowired
    @Qualifier("myClassLogger")
    private Logger logger;

    //...
}

@Component
public class MyOtherClass {
    @Autowired
    @Qualifier("myOtherClassLogger")
    private Logger logger;

    //...
}
于 2013-05-09T14:48:54.997 回答
0

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

@Inject
Logger logger;

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

于 2014-06-25T22:14:58.233 回答
0

使用自动连线记录器,如下所述:

package de.senatov.wflow.config;

import org.slf4j.Logger;

@Configuration
public class WebFlowConfig extends AbstractFacesFlowConfiguration {


    @Autowired
    private Logger log;



    @Bean
    public FlowDefinitionRegistry flowRegistry() {

        log.debug("flowRegistry()");
        return getFlowDefinitionRegistryBuilder(flowBuilderServices()).addFlowLocation("/WEB-INF/flows/booking/booking-flow.xml", "booking")
                                                                      .addFlowLocation("/WEB-INF/flows/main/main-flow.xml", "main").build();
    }
.....
.... 

1)插入小班:

package de.senatov.wflow.loggable;


import org.slf4j.Logger;
import org.springframework.beans.factory.InjectionPoint;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import static java.util.Optional.of;
import static org.slf4j.LoggerFactory.getLogger;

@Configuration
public class LoggingConfiguration {
    @Bean
    @Scope("prototype")
    public Logger logger(InjectionPoint ip) {

        try {
            return getLogger(of(ip.getMember())
                                     .map(o -> o.getDeclaringClass())
                                     .orElseThrow(IllegalArgumentException::new));
        }
        catch (Exception e) {
            System.err.printf("slf4j autowired Exception occured : %s%n", e.getMessage());
            throw e;
        }
    }
}
于 2019-02-24T22:13:16.243 回答