【问题标题】:Accessing "containing class" from DependencyDescriptor从 DependencyDescriptor 访问“包含类”
【发布时间】:2015-11-23 23:51:51
【问题描述】:

我正在开发一个支持上下文相关注入的实用程序,即注入的内容现在也取决于注入的位置。记录器注入是这种技术的常见应用。 到目前为止,我已经成功地为 HK2 和 Guice 实现了这个,并且对 Dagger 有一些限制。 为了在 Spring 中解决这个问题,我使用了一个注册 AutowireCandidateResolver 的 BeanFactoryPostProcessor。但是,要实现预期的语义,我需要知道实际目标对象的类型,这可能与声明注入点的类型不同。例如:

class BaseClass {
    @Inject Logger logger;
}

class SubClass extends BaseClass {
}

SubClass 的实例需要注入 SubClass 的记录器,而不是 BaseClass 的记录器。 DependencyDescriptor 在 containsClass 字段中包含此信息,但遗憾的是此信息未通过 API 公开。

问题 1:是否存在架构上的原因导致此信息未公开,或者是否可以为此向 DependencyDescriptor API 添加 getter?

问题 2:与此同时,解决此限制的最佳方法是什么?通过反射 API 访问内部字段是丑陋的并且违反了封装。另一种选择是先注入错误的(即 BaseClass 的 Logger)实例,然后使用 BeanPostProcessor 进行更正,但我将手动重做大量工作(即重新处理几乎整个注入处理)。

【问题讨论】:

标签: java spring dependency-injection


【解决方案1】:

现在很确定 DependencyDescriptor API 严格的原因是什么。但是你的出发点不应该是BeanFactoryPostProcessor,而是你应该看看BeanPostProcessor,尤其是AutowiredAnnotationBeanPostProcessor,它基于@Autowired@Value自动连接带注释的字段、setter方法和任意配置方法和@Inject 注释。据我了解,这是您想要做的。这个类负责创建DependencyDescriptor。 所以可能你需要做的是:

  1. 创建一个自定义DependencyDescriptor(只需将其扩展为对“包含类”的公共访问)
  2. 创建一个自定义 AutowiredAnnotationBeanPostProcessor,它的作用与 AutowiredAnnotationBeanPostProcessor 相同,但不是创建 DependencyDescriptor 的实例,而是从步骤 1 创建实例。
  3. 创建一个自定义 AutowireCandidateResolver,它只会将 DependencyDescriptor 转换为您创建的那个(因此可以公开访问“包含类”属性。)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多