java - 如何使用 spring java 配置在单例 bean 中生成原型(prototype)对象

标签 java spring jakarta-ee spring-mvc

这是我现在拥有的,效果很好。它所做的只是一个市场类,它返回一个项目对象数组:

我有类(class)市场

class market {

    public ArrayList<Items> createItems(HashMap<String,String> map) {
        ArrayList<Items> array = new ArrayList<Items>();
        for (Map.Entry<String, String> m : map.entrySet()) {
            Item item = new Item();
            item.setName(m.key());
            item.setValue(m.value());
            array.add(item);
        }
        return array;
    }
}

类 Item 是一个简单的类,带有用于名称和值的 getter 和 setter

这是我的配置文件的样子:

@Configuration
public class MarketConfig {

    @Bean
    public Market market() {
        return new Market();
    }
}

我想如何更改我的代码:( 原因:我不想

Item item = new Item(); 

在 then 方法中。我想让 Spring 把它注入(inject) Market)

class market {

    public Item item;
    //getters and setters for item

    public ArrayList<Items> createItems(HashMap<String,String> map) {
        ArrayList<Items> array = new ArrayList<Items>();
        for (Map.Entry<String, String> m : map.entrySet()) {
             item.setName(m.key());
             item.setValue(m.value());
             array.add(item);
        }
        return array;
    }
}

@Configuration
public class MarketConfig {

    @Bean
    @Scope("prototype")
    public Item item() {
        return new Item();
    }

    @Bean
    public Market market() {
        Market bean = new Market();
        bean.setItem(item());
    }
}

我知道每次调用 item() 时原型(prototype)范围都会给我新的 bean; 现在我想在 createItems 方法的 for 循环中为每次迭代创建新的 bean。我如何告诉 Spring 给我。

我知道的一种方法是做

applicationContext context = new AnnotationConfigApplicationContext();
context.getBean(Item.class);

但是还有其他方法可以完成我的工作吗? 谢谢

最佳答案

是的,您可以使用查找方法按需创建原型(prototype)方法

public abstract class ItemFactory {

    public abstract Item createItem();

}

现在在 applicationContext.xml 中放入以下内容:

<bean id="item" class="x.y.z.Item" scope="prototype" lazy-init="true"/>

并配置工厂:

<bean id="itemFactory" class="x.y.z.ItemFactory">
<lookup-method name="createItem" bean="item"/>
</bean>

现在,为了使用它,您需要做的就是在任何 bean 中 Autowiring 它:

并调用你的查找方法:

@Service 
public class MyService{

   @Autowired
   ItemFactory itemFactory;

   public someMethod(){
      Item item = itemFactrory.createItem();
   } 

}

每次调用 createItem() 时,您都会收到对新创建的 Item 类实例的引用。

P.S: 我看到您使用的是 @Configuration 而不是 xml,您需要检查是否可以在配置 bean 中配置查找方法。

希望对您有所帮助。

更新:诀窍很简单:

@Configuration
public class BeanConfig {

    @Bean
    @Scope(value="prototype")
    public Item item(){
        return new Item();
    }


    @Bean
    public ItemManager itemManager(){
        return new ItemManager() {

            @Override
            public Item createItem() {
                return item();
            }
        };
    }
}

关于java - 如何使用 spring java 配置在单例 bean 中生成原型(prototype)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14880847/

相关文章:

java - "HasInputDevices"位于 "/org/openqa/selenium/interactions"但它仍在寻找 "/org/openqa/selenium/"

java - Spring FactoryBean 和作用域协同工作

java - 从 service-mix 文件轮询器迁移到 apache Camel 文件轮询器

java - 在 servlet 中以编程方式调用过滤器(使用 jetty/spark 创建)?

java - 在 Java GUI 中延迟操作的任何方法

java - 在 for 循环中表示整个数组的正确方法是什么?

java - Spring MVC + JQuery + Ajax 问题

java - Spring MVC - 在任何人进入网页之前做某事

java - JPA/Hibernate 嵌入式 ID

java - DTO应该使用继承还是组合