在创建对象后注入属性

时间:2014-11-13 19:33:04

标签: java spring

我有一个类,它有一些我在构造函数上收到的动态属性。 春天可以注入同一类别的其他属性。

我想知道这是否可行以及如何配置我的应用程序。我使用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注入。

有可能吗?

3 个答案:

答案 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代理行为。在这里要非常小心,你可以让自己陷入一个难以追踪的兔子洞。