有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring动态原型bean

我想动态创建Spring原型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);
    }
}   

共 (2) 个答案

  1. # 1 楼答案

    也许@Configurable注释就是您想要的:documentation

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

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

  2. # 2 楼答案

    我将使用“工厂”来创建MyObject的实例

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

    然后,我将把这个工厂@Inject放入我的Foo对象中。在那里,每当我需要一个,我都可以要求一个新的例子

    如果希望通过Spring中的Bean配置新实例,可能需要将它们注入工厂,并在返回之前设置对象。比如:

    @Named
    public class MyObjectFactory {
        @Inject
        private MyOtherObject otherObject;
    
        public MyObject newInstance() {
            return new MyObject(otherObject);
        }
    }