【发布时间】:2018-07-01 22:17:50
【问题描述】:
我一直在寻找一种方法来创建可以“部分”自动装配的非单件 spring bean。
@Component
class Example {
private SpringBean1 bean1;
private SpringBean2 bean2;
private String dynamicDependancy;
@Autowired
public Example(SpringBean1 bean1, SpringBean2 bean2, String dynamicDepedency) {
this.bean1 = bean1;
this.bean2 = bean2;
this.dynamicDepedency = dynamicDepedency;
}
}
我想要这样的东西,因为有时依赖关系仅在运行时才知道。 我想到了一种方法是创建一种创建静态成员类的工厂,这样我就可以测试静态成员类:
@Component
class ExampleFactory {
private SpringBean1 bean1;
private SpringBean2 bean2;
@Autowired
public ExampleFactory(SpringBean1 bean1, SpringBean2 bean2) {
this.bean1 = bean1;
this.bean2 = bean2;
}
public Example from(String dynamicDependency) {
return new Example(bean1, bean2, dynamicDependency);
}
static class Example {
private SpringBean1 bean1;
private SpringBean2 bean2;
private String dynamicDependancy;
public Example(SpringBean1 bean1, SpringBean2 bean2, String
dynamicDependancy) {
this.bean1 = bean1;
this.bean2 = bean2;
this.dynamicDependancy = dynamicDependancy;
}
}
}
我正在寻找有关 Prototype 范围的信息,并且使用 getBean(java.lang.String, java.lang.Object) 使得使用依赖注入变得更加困难。 我想知道是否有任何“春天的方式”来做这些事情。
谢谢。
更新: 我找到了另一个解决方案并在另一个帖子中发布了答案: https://stackoverflow.com/a/52021965/2580829
【问题讨论】:
-
ExampleFactory 可以是 ApplicationContextAware,然后您可以从应用上下文中获取您的 bean,而不是将字符串传递给 Example ctor。
-
谢谢。在那些情况下,将这种依赖注入其他组件的正确方法是什么?单例呢(可能需要确定它的具体值)
-
我不确定这样的动态应用上下文是否有标准模式。如果您无法在初始化时解决它的依赖关系,那么将 Example 注入到单例中并没有真正的意义。我的猜测是“很多工厂”来隐藏/本地化动态初始化(工厂可以是单例)就可以了。如果可能,枚举示例的可能实例,将它们全部放在您的应用程序上下文中可能会更简单/更干净。
-
在我看来,通过创建注入对象的自动装配工厂来提出的建议基本上是正确的。您让 Spring 处理“连接时”依赖项,将它们隐藏在接口后面,并且只需要创建
Examples 的运行时代码来处理字符串参数。 -
您也可以使用
lookup-method/@Lookup让Spring 自动更改依赖类中的方法以调用该工厂。稍后我将对此进行讨论以使其成为一个完整的答案,自从我学习 Java 以来,这是一个热门的时刻。
标签: java spring dependency-injection autowired spring-framework-beans