当前位置: 首页 > 知识库问答 >
问题:

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

谷梁波
2023-03-14

这是我现在能做的很好的东西。它所做的只是一个market类,该类返回一个items对象数组:

我有班级市场

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 是简单类,具有名称和值的获取器和设置器

以下是我的配置文件的外观:

@Configuration
public class MarketConfig {

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

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

Item item = new Item(); 

在then方法中。我希望Spring将其注入市场)

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()都会给我新的bean;现在我想要createItems方法的for循环中的每次迭代都有新的bean。我怎么能告诉Spring给我。

我知道的一种方法是做

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

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

共有2个答案

金飞
2023-03-14

如果您使用的是Java 8,这可以简化

@Configuration
public class Config {

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

  @Bean
  public Supplier<Item> itemSupplier() {
      return this::item;
  }
}

之后,您可以在您的Market类中使用该供应商来创建原型项目beans。

@Component
public class Market {

  private final Supplier<Item> itemSupplier;

  @Autowired
  public Market(Supplier<Item> itemSupplier) {
      this.itemSupplier = itemSupplier;
  }

  private Item createItem() {
      return itemSupplier.get();
  }

}

非常简单,不需要额外的工厂bean或接口。

衡玄裳
2023-03-14

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

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中自动安装它:

并调用yout查找方法:

@Service 
public class MyService{

   @Autowired
   ItemFactory itemFactory;

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

}

每次调用< code>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();
            }
        };
    }
}
 类似资料:
  • 问题内容: 这是我现在可以正常使用的东西。它所做的只是一个市场类,该市场类返回一系列项目对象: 我有上课市场 class Item是简单的类,具有用于名称和值的getter和setter 这是我的配置文件的外观: 我想如何更改代码:(原因:我不想 然后的方法。我希望Spring将其注入市场) 我知道每次我调用item()时,原型作用域都会给我新的bean。现在,我想为createItems方法的f

  • Spring具有bean类型/作用域,如 -singleton bean(每个应用程序上下文只有一个bean), -prototype bean(每个请求一个新bean) 现在,如果在单例bean中有对原型bean的引用,是否有办法在对单例bean的每个请求中获得一个新的原型bean(在单例bean中)。< br >如果是,配置会是什么样的?

  • 我有一个用于原型bean的FactoryBean,如下所示: 我希望在控制器中自动连接它,并且每当我尝试访问属性时(通过,从获得一个新的原型实例: 但是,这从来不会调用getObject()。如果我注入ApplicationContext一个直接访问bean,它就会工作,提供一个全新的属性bean: 如何直接使用@autowired注入来实现?

  • 我刚接触Spring,正在尝试理解“将一个原型bean注入一个单例bean”的概念。根据我在singleton中的理解,每个Spring IoC容器只有一个实例,不管您检索它多少次。,因为仍未实例化。我开发了以下示例,其中在单个bean中给出了原型bean的参考,如下所示: RequestProcessor.java requestValidator.java 如何解决?我的理解正确吗? 另一种方

  • 通常在Spring上下文中,如果原型bean被注入到单例bean中,父类的属性将重写原型bean作用域。但是,如果在原型bean作用域中注入一个单例作用域bean会发生什么。仍然使用内部bean的get bean会返回内部bean的新实例吗?

  • 在Spring Hibernate XML配置中,我有 我知道SpringJava配置的等价物如下:LocalSessionFactoryBuilder(dataSource())。AddAnnotatedClass(Foo.class)。buildSessionFactory(); 我的问题是,如果我不使用LocalSessionFactoryBuilder类,而是使用HibernateJpaV