Java 访问;“包含类”;从DependencyDescriptor
我正在开发一个支持上下文相关注入的实用程序,也就是说,注入的内容现在也可以取决于注入的位置。记录器注入是该技术的一种常见应用。 到目前为止,我已经成功地为HK2和Guice实现了这一点,并且对Dagger有一些限制。 为了解决Spring的这个问题,我使用了一个BeanFactoryPostProcessor来注册一个AutoWireSolver。然而,为了实现预期的语义,我需要知道实际目标对象的类型,这可能不同于声明注入点的类型。例如:Java 访问;“包含类”;从DependencyDescriptor,java,spring,dependency-injection,Java,Spring,Dependency Injection,我正在开发一个支持上下文相关注入的实用程序,也就是说,注入的内容现在也可以取决于注入的位置。记录器注入是该技术的一种常见应用。 到目前为止,我已经成功地为HK2和Guice实现了这一点,并且对Dagger有一些限制。 为了解决Spring的这个问题,我使用了一个BeanFactoryPostProcessor来注册一个AutoWireSolver。然而,为了实现预期的语义,我需要知道实际目标对象的类型,这可能不同于声明注入点的类型。例如: class BaseClass { @Injec
class BaseClass {
@Inject Logger logger;
}
class SubClass extends BaseClass {
}
子类的实例需要为子类注入记录器,而不是为基类注入记录器。
DependencyDescriptor在containingClass字段中包含此信息,但遗憾的是,此信息未通过API公开
问题1:是否有架构原因导致此信息未公开,或者是否可以将此信息的getter添加到DependencyDescriptor API中
问题2:同时,解决这一限制的最佳方式是什么?通过反射API访问内部字段很难看,违反了封装。另一种选择是先注入错误的实例(例如,基类的记录器),然后用BeanPostProcessor纠正它,但我将手动重做大量工作(即,重新处理几乎整个注入处理)。现在非常确定DependencyScriptor API严格的原因是什么。但您的起点不应该是
BeanFactoryPostProcessor
,而应该看看BeanPostProcessor
,尤其是AutowiredNotationBeanPostProcessor
,它基于@Autowired
自动连接注释字段、setter方法和任意配置方法,@Value
和@Inject
注释。据我所知,这是你想要做的。此类负责创建DependencyDescriptor
。
因此,您可能需要做的是:
依赖描述符
(只需通过对“包含类”的公共访问来扩展它)AutoWiredNotationBeanPostProcessor
,它将执行与AutoWiredNotationBeanPostProcessor
相同的操作,但不是创建DependencyDescriptor
的实例,而是从步骤1创建一个实例AutowireCandidateResolver
,它只会将DependencyDescriptor
强制转换为您创建的描述符(因此可以公开访问“包含类”属性)谢谢,宝贝。回答得好!我完全忘了检查StackOverflow是否有人回答了。我提出的解决方案与您描述的不同,但有些相似: