Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问;“包含类”;从DependencyDescriptor_Java_Spring_Dependency Injection - Fatal编程技术网

Java 访问;“包含类”;从DependencyDescriptor

Java 访问;“包含类”;从DependencyDescriptor,java,spring,dependency-injection,Java,Spring,Dependency Injection,我正在开发一个支持上下文相关注入的实用程序,也就是说,注入的内容现在也可以取决于注入的位置。记录器注入是该技术的一种常见应用。 到目前为止,我已经成功地为HK2和Guice实现了这一点,并且对Dagger有一些限制。 为了解决Spring的这个问题,我使用了一个BeanFactoryPostProcessor来注册一个AutoWireSolver。然而,为了实现预期的语义,我需要知道实际目标对象的类型,这可能不同于声明注入点的类型。例如: class BaseClass { @Injec

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

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是否有人回答了。我提出的解决方案与您描述的不同,但有些相似: