4

我想即时创建 Spring Prototype bean(其中包含 @Injects),但没有看到如何执行此操作。一个简单的例子:

@Named
public class Foo{
    public void someMethod(){
        for(int x=0; x < 10; x++){
            MyObject obj = new MyObject(); // How would this work with Prototype
            obj.setSomeField("Hello");
        }
    }
}

@Named
@Scope("prototype")
public class MyObject{
  @Inject
  SomeDependency blah;

  public void setSomeField(String word){}
}

如果我将类 Foo 修改为如下所示,我将无法保证获得一个新实例:

@Named
public class Foo{
    @Inject MyObject obj;

    public void someMethod(){
        for(int x=0; x < 10; x++){
            obj.setSomeField("Hello");
        }
    }
}

如果我创建一个配置类,它似乎也保持为单例

public class Configuration {

    @Bean
    public MyObject getMyObject(){
        return new MyObject();
    }
}

@Named
public class Foo{
    @Inject Configuration config;

    public void someMethod(){
        for(int x=0; x < 10; x++){
            MyObject obj = config.getMyObject();
            obj.setSomeField("Hello");
        }
    }
}

我在这里错过了什么吗?

更新

我最终混合了所有提到的东西。

我用@Named 和@Scope("prototype") 标记了非单例,并使用通用方法调用它们:

@Named
public MyFileFactory implements ApplicationContextAware{
    private ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext ac) throws BeansException {
        context = ac;
    }

    public <T> T getNewInstance(final Class<T> type) {
       return context.getBean(type);
    }
}

前任:

@Named
public class SomeClass{
    @Inject
    private MyFileFactory myFileFactory;

    public void foo(){
        final MyObject myObject = myFileFactory.getNewInstance(MyObject.class);
    }
}   
4

2 回答 2

2

我会使用“工厂”来创建MyObject.

@Named
public class MyObjectFactory {
    public MyObject newInstance() {
        return new MyObject();
    }
}

然后,我会将这个工厂@Inject'ed 到我的Foo对象中。在那里,只要我需要一个,我就可以要求一个新的实例。

如果您希望通过 Spring 中的 bean 配置新实例,则可能必须将它们注入工厂,并在返回之前在对象上设置。像这样的东西:

@Named
public class MyObjectFactory {
    @Inject
    private MyOtherObject otherObject;

    public MyObject newInstance() {
        return new MyObject(otherObject);
    }
}
于 2013-03-15T19:22:14.513 回答
0

也许@Configurable注释是您正在寻找的:文档

@Configurable
public class MyObject {
   // ...
}

如果您使用@Configurable注释实例化对象,spring 将对这些对象执行依赖注入。

于 2013-03-15T19:15:22.903 回答