当前位置: 首页 > 知识库问答 >
问题:

动态创建对象的依赖关系注入的好处

翁俊良
2023-03-14

在像Spring这样的IoC容器的上下文中,我正在寻找一种方法将一些依赖项/属性注入到类的实例化中。并非对象的所有属性都可以使用依赖关系注入进行设置,并且对象是为响应应用程序事件而动态创建的。如果所有依赖项都可以通过容器注入,那么Spring管理的Bean将是理想的选择。

例如,下面定义的类必须注释为@Component(或更专业的注释),组件扫描和依赖关系注入才能正常工作。但它有几个属性(名称尝试),只能由应用程序代码而不是容器动态设置。但是,如果我必须使用终结点restTemplate(它们已由 IoC 容器管理),则通过构造函数或 setter 方法将它们提供给此对象并不方便。

public class SomeClass {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private String endpoint;

    private String name;
    private int attempts;

    public SomeClass(String name, int attempts) {

        this.name = name;
        this.attempts = attempts;
    }

    // public getter and setter methods
}

由于存在一些动态设置的属性,因此我无法使用 new 关键字来实例化该类,并且仍然能从 DI 和 IoC 中获益。或者我可以吗?

共有2个答案

包建义
2023-03-14

如果我没有误解你,你需要在构造函数中设置值。

您可以从上下文创建bean并设置值:

context.getBean("beanname", arg1, arg2……);

沈成天
2023-03-14

你可以使用工厂。如下所示:

public class SomeClass {

  private RestTemplate restTemplate;
  private String endpoint;
  private String name;
  private int attempts;

  public SomeClass(String name, int attempts, RestTemplate restTemplate,
      String endpoint) {
    this.name = name;
    this.attempts = attempts;
    this.restTemplate = restTemplate;
    this.endpoint = endpoint;
  }
}

@Component
public class SomeClassFactory {

  @Autowired
  private RestTemplate restTemplate;

  @Autowired
  private String endpoint;

  public SomeClass create(String name, int attempts) {
    return new SomeClass(name, attempts, restTemplate, endpoint);
  }
}

SomeClass instance = someClassFactory.create("beep", 0);
 类似资料:
  • 问题内容: 创建新对象和依赖项注入有什么区别?请详细说明。 问题答案: 好吧,创建一个新对象就可以做到的很明确-您可以创建所需类的新实例。 依赖注入是一种在需要时为您提供引用的机制。想象一下一个代表数据库连接池的类- 您通常只有一个该类的实例。现在,您需要将该引用分发给使用它的所有类。依赖注入在这里很方便- 通过使用像Spring这样的DI框架,您可以定义将一个池实例注入到需要它的类中。 您的问题

  • 谢谢你。 更新:我找到了另一个解决方案,并在另一个帖子中发布了答案:https://stackoverflow.com/a/52021965/2580829

  • 我来自Java背景,也是函数范式的新手,所以请原谅我,我身上有OOP的味道。 我有一个特征名称付款处理程序 和 直到这里一切都很好,但是当我想拥有多个基于付款方式的支付网关时,问题就来了。最初我写了一个像 PaymentHandlerFactory 这样的 然后使用这个PaymentHandlerFactory获取guice注入的PayPal对象。但不知怎的,我觉得这不是正确的方法,于是我找到了同

  • 我试图不去增加很复杂的结构代码,保持简洁可测试性的代码和好的实践,我想我应该用Kotlin从其它方面去简化代码。如果你想了解一些控制反转或者依赖注入的话题,你可以查看我关于Android中使用Dagger注入的一系列文章。第一篇文章有关于他们这个团队的简单描写。 一种简单的方式,如果我们想拥有一些独立于其他类的类,这样更容易测试,并编写代码,易于扩展和维护,这时我们需要使用依赖注入。我们不去在类内

  • 我正在尝试使用spring MVC将Rest api与memcached连接起来,以便在memcached上设置和获取我从api获得的数据。当前出现此错误: 严重:上下文初始化失败org . spring framework . beans . factory . unsatisfieddependencyexception:创建名为“consumerController”的bean时出错:通过字

  • 我似乎遇到了这个问题,当我使用注释为某些类配置依赖注入时,以及通过xml文件中的配置为其他类配置依赖注入时。 我有一个构造函数注入,我需要注入的对象到两个类的构造函数,他们得到不同的实例的,因为一个配置与注释和另一个在xml文件,所以是这样定义的: 已配置注释构造函数的类的构造函数: 和另一个类的构造函数: 它的配置在xml文件中: 所以我似乎注意到xml配置的类似乎有一个不同的实例,因为在通过x