gpt4 book ai didi

java - 如何自动创建和注入(inject)缺失依赖项的代理?

转载 作者:搜寻专家 更新时间:2023-11-01 03:30:25 24 4
gpt4 key购买 nike

给定以下类:

package com.acme;

public class Foo {
private Bar bar;
public void setBar(Bar newBar) {
this.bar = newBar;
}
}

@AcmeService
public interface Bar {}

和一个 Spring 配置文件:

<beans>
<bean id="foo" class="com.acme.Foo">
<property name="bar" ref="bar" />
</bean>
</beans>

当Spring的配置阶段运行时,是否可以进行如下操作?

  1. 捕获缺失的依赖异常(或检测到将会有异常)
  2. 发现 bean“foo”缺少的依赖项“bar”是 com.acme.Bar 类型
  3. 请注意 Bar 是一个@AcmeService,所以我们要处理它。否则,错误可以被认为是致命的
  4. 生成 com.acme.Bar 类型的代理
  5. 将 Bar 代理注入(inject) Foo,确保可以使用 Spring AOP 通知 Bar 上的方法调用,就像我在 Spring 配置文件中显式创建 Bar 代理并将代理注入(inject) Foo bean 一样。

我最初被 BeanPostProcessorBeanFactoryPostProcessor 所吸引作为实现它的方法,尽管在阅读文档我没有看到一个明显的方法来精确地做我想做的事。

如果您想知道,底层用例是我想要:

  • 用生成@AcmeService bean 接口(interface)代理的单个上下文文件,用我的服务层 bean 定义替换所有 Spring 上下文文件。
  • 建议对这些代理的调用改为在服务层 bean 代理的接口(interface)模拟上调用。 (更重要的是,模拟是由远程系统在运行时定义的,并上传到这个应用程序以进行集成测试。对于我的常规单元测试,我会根据需要简单地创建和注入(inject)模拟来做更明智的事情)。<

除了整个“动态生成代理”位之外,我已经完成了所有这些工作。目前我在我的上下文文件中定义了我的服务接口(interface)的空实现,以便它们可以被注入(inject)和建议 - 但我宁愿没有生成和 checkin 那么多空接口(interface)类。最后,我假设我需要生成这些代理,因为我不知道如何建议对空依赖项的尝试调用。

最佳答案

好的,这里有很多事情要谈。

首先,我认为您无法完全按照您的要求进行操作。特别是,如果你有 <property name="bar" ref="bar"/> bar 没有 bean 定义,bean 初始化将失败,我认为您无法轻易拦截。当然,您可以编写自己的 BeanFactory 的子类。本身,但这不是一件可以掉以轻心的事情。

最接近您要求的现有机制是 Autowiring 。看看AutowiredAnnotationBeanPostProcessor .您可以将其用作编写自己的指南 BeanPostProcessor它会查看容器实例化的每个 bean,查找属于 @AcmeService 类型的属性。注解。当它找到一个时,它可以为该类型生成一个代理并将其注入(inject)。

这将我们带到了代理生成本身。寻找的地方是ProxyFactory .这允许您在运行时生成实现任何接口(interface)或扩展任何类的对象,同时附加顾问/拦截器。这些拦截器可以完成所有工作 - 如果您不想,代理不必在其“背后”有任何东西。

使用这种方法,您将不需要“悬挂”<property name="bar" ref="bar"/>配置中的条目 - Foo 中存在该属性足以触发该过程。

关于java - 如何自动创建和注入(inject)缺失依赖项的代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1567005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com