use*_*890 7 java spring dependency-injection
我正在研究一种用于支持依赖于上下文的注入的实用程序,即注入的内容现在还取决于注入的位置.记录器注入是该技术的常见应用.到目前为止,我已经成功地为HK2和Guice实现了这个,并且对Dagger有一些限制.为了解决这个问题,我正在使用一个注册AutowireCandidateResolver的BeanFactoryPostProcessor.但是,为了实现预期的语义,我需要知道实际目标对象的类型,这可能与声明注入点的类型不同.例如:
class BaseClass {
@Inject Logger logger;
}
class SubClass extends BaseClass {
}
Run Code Online (Sandbox Code Playgroud)
SubClass的实例需要使用SubClass的记录器注入,而不是使用BaseClass的记录器.DependencyDescriptor在containsClass字段中包含此信息,但遗憾的是,此信息不会通过API公开.
问题1:是否存在未公开此信息的架构原因,或者是否可以将此获取器添加到DependencyDescriptor API中?
问题2:与此同时,解决此限制的最佳方法是什么?通过Reflection API访问内部字段很难看并且违反了封装.另一种方法是首先注入错误的(即Logger for BaseClass)实例,然后用BeanPostProcessor进行更正,但我会手动重做很多工作(即重新处理几乎整个注入处理).
现在很确定 DependencyDescriptor API 的严格性的原因是什么。但您的起点不应该是 ,BeanFactoryPostProcessor而是您应该看看BeanPostProcessor,特别是AutowiredAnnotationBeanPostProcessor哪些自动装配注释字段、setter 方法和基于@Autowired、@Value和@Inject注释的任意配置方法。据我了解,这就是您想要做的。这个类负责创建DependencyDescriptor. 所以你需要做的可能是:
DependencyDescriptor(只需通过对“包含类”的公共访问来扩展它)AutowiredAnnotationBeanPostProcessor,它将执行与步骤 1 中的AutowiredAnnotationBeanPostProcessor实例相同的操作,但DependencyDescriptor不会创建 的实例。AutowireCandidateResolver,它将仅将 强制转换DependencyDescriptor为您创建的(因此可以公开访问“包含类”属性。)| 归档时间: |
|
| 查看次数: |
238 次 |
| 最近记录: |