当前位置: 首页 > 面试题库 >

如何使用Spring Java配置在Singleton bean中生成原型对象

翟理
2023-03-14
问题内容

这是我现在可以正常使用的东西。它所做的只是一个市场类,该市场类返回一系列项目对象:

我有上课市场

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;
    }
}

class Item是简单的类,具有用于名称和值的getter和setter

这是我的配置文件的外观:

@Configuration
public class MarketConfig {

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

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

Item item = new Item();

然后的方法。我希望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。我怎么能告诉春天给我。

我知道的一种方法是

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

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


问题答案:

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

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

并调用您的查找方法:

@Service 
public class MyService{

   @Autowired
   ItemFactory itemFactory;

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

}

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

PS: 我看到您正在使用@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();
            }
        };
    }
}


 类似资料:
  • 这是我现在能做的很好的东西。它所做的只是一个market类,该类返回一个items对象数组: 我有班级市场 类 Item 是简单类,具有名称和值的获取器和设置器 以下是我的配置文件的外观: 我想如何更改我的代码:(原因:我不想 在then方法中。我希望Spring将其注入市场) 我知道原型作用域每次调用Item()都会给我新的bean;现在我想要createItems方法的for循环中的每次迭代都

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

  • 默认情况下,对于JSON规范中的“type”:“boolean”,Swagger将在模型中生成一个<code>boolean<code>(object,non-primitive,null)字段。有没有办法让Swagger在模型中生成<code>布尔</code>(原始,不可为空)字段? 基本原理是:Spring MVC将在无效输入上用<code>null</code>初始化这些字段,这是非常不可

  • 我尝试删除方法改造与原始json对象使用删除我的列表项。我曾经使用POST方法与原始方法它成功了,但我需要相同的@DELETE方法。 我需要这种类型的DELETE方法,使用这种url类型的原始对象 API/跟踪/删除/{user_id} 我试着用 我把我的json

  • 微信小程序可以在项目根目录使用 project.config.json 文件对项目进行配置(支付宝小程序存在对应功能的 mini.project.json 文件,但官网并未释出具体文档。因此下面均以微信小程序为例讲解)。如果需要配置该文件,可有以下两种方式: 在项目根目录中配置 当在项目根目录中创建 project.config.json 时,必须指定 miniprogramRoot 字段为编译后

  • 在我的项目中,有两个和一些: 我得到的结果和错误如下: 生成的如下: 我认为和没有正确生成,因为它们是字符串类型,没有引号。 我不知道为什么它会以这种方式产生。请告诉我如何解决这个问题。