【问题标题】:Using Spring to inject different instances of a class based on instantiation hierarchy使用 Spring 注入基于实例化层次结构的类的不同实例
【发布时间】:2011-12-20 17:43:44
【问题描述】:

我的类结构是这样的:

public class Worker {
    private Parser parser;
    private Validator validator;
    private Feeder feeder;

    //...
}

ParserValidatorFeeder 都是具有不同实现类的接口。这些字段是在 Worker 实例化的上下文中实例化的,并且不会在 Worker 之间共享。

我想做的事情是为每个 Worker 拥有一个 org.slf4j.Logger 实例,然后解析器、验证器和馈送器将根据需要使用该实例。基本上,在实例化时,我们希望给 Worker 一个名称,然后让所有日志记录使用该名称,如下所示:

org.slf4j.LoggerFactory.getLogger(workerName)

理想情况下,我想要一个解决方案:

public class XmlParser implements Parser {
    @Autowired
    private Logger logger;

    //...
}

然后将 Spring Framework 的自动装配功能配置为在属于同一 Worker 的所有对象中使用相同的 Logger 实例。显然,不同的工人应该得到不同的 Logger 实例。强制所有三个接口ParserValidatorFeeder 指定setLogger()-type 方法至少可以说是不雅的。

如何使用一些聪明的依赖注入解决方案来完成这项任务?

【问题讨论】:

标签: java spring logging dependency-injection slf4j


【解决方案1】:

我认为在没有太多 Spring 魔法的情况下完成此任务的最简单方法是像往常一样在 worker 中创建记录器:

final static Logger logger = LoggerFactory.getLogger("workerName");

然后让您的工作人员在不同的组件中设置此记录器。如果您的组件是由 Spring 注入的,请让您的工作人员实现 InitializingBean 并在 afterPropertiesSet() 中设置记录器。

如果您真的想更动态地执行此操作,请查看this example,其中使用 BeanPostProcessor 和反射来注入正确的记录器。

【讨论】:

    【解决方案2】:

    尝试为您的工作人员设置一个MDC 值。如果您的目标是区分不同标记生成的日志,那么设置 MDC 可能就足够了。如果您希望不同工作人员生成的日志转到不同的文件,请使用 看看SiftingAppender 和 MDCBasedDiscriminator。

    【讨论】:

      猜你喜欢
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多