我有一个类,它有一些我在构造函数上收到的动态属性。 春天可以注入同一类别的其他属性。
我想知道这是否可行以及如何配置我的应用程序。我使用spring 3和xml配置。
以下是一个例子:
class MyClass {
private MyClass2 obj2; // should be injected by spring
private Long myId;
public MyClass(Long dynamicId) {
myId = dynamicId;
}
public void doSomehting() {
obj2.doOtherStuff(this);
}
}
所以,我想要的,因为我必须动态地创建MyClass,在我调用新的MyClass(1234)之后,obj2被Spring注入。
有可能吗?
答案 0 :(得分:1)
我很确定这是不可能的。看起来你想要一个(可怕的音乐)工厂。
class MyClassFactory {
private final MyClass2 object;
public(MyClass2 object) {
this.object = object;
}
public createMyClass(Lond id) {
return new MyClass(id, object);
}
}
答案 1 :(得分:1)
使用ObjectFactory从di-container中检索bean。如果将此工厂包装在您自己的工厂对象中,则可以设置任何属性,并且仍然具有由Spring管理的bean。由于您希望bean具有一些动态设置属性,因此需要考虑是否需要单例范围的bean(默认)或原型bean。
如果您打算从xml配置执行此操作,则需要使用objectfactorycreatingfactorybean。 Spring文档很棒,只需按照示例进行操作。
如果您执行基于注释的配置,则只需要自动装配ObjectFactory。请注意,还必须将YourClass声明为bean!
答案 2 :(得分:0)
如果使用new运算符动态创建MyClass实例,那么该实例不在Spring的bean工厂中,因此Spring无法注入任何东西。从我所看到的,你真的有两种选择。 1)使MyClass成为原型bean,因此Spring每次需要时都会为您提供一个新实例。然后,您需要将obj2定义为要设置的属性(或自动装配)。 2)通过Spring将obj2注入到创建MyClass实例的类中,并使obj2成为构造函数参数,这样你就必须注入它。
我从你的问题中读到的0.02。需要注意的是,在Java中创建新实例时,它始终位于bean工厂之外,并且在bean工厂外执行的所有工作都会丢失Spring代理行为。在这里要非常小心,你可以让自己陷入一个难以追踪的兔子洞。