Spring中bean指定prototype原型模式写法及使用场景

>> 饿了么、美团外卖红包领取地址<<

在Spring中,默认bean对象都是单例的,也就是通过getBean方法或者@Autowired注解获取到的bean对象都是同一个。我们可以通过@Scope注解来修改bean的模式为原型模式,这样每一次从Spring容器中获取到的bean对象就都是新的了。

通过@Scope注解及prototype参数即可修改bean为原型模式

@Component
@Scope("prototype")

为了避免prototype写错(毕竟没有提示,不过写错的时候启动会报错也无碍),建议使用ConfigurableBeanFactory接口中的常量

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

在Spring中,prototype原型模式使用的场景不多,只有当你的bean的属性中会有数据存在的时候,才需要使用原型模式,否则数据就串了不是。我自己使用过的一个场景是用EasyExcel实现导入功能的时候会使用到。

https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read

在使用EasyExcel读取表格文件时,官方文档推荐的是自己进行new一个Listener对象,但是想在这个对象中使用其他service对象的话,就不能使用@Autowired了,不方便,所以我们可以考虑将这个Listener对象变成原型模式:

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class DemoDataListener extends AnalysisEventListener<DemoData> {

    /**
     * 表格中的数据
     */
    private List<DemoData> dataList = new ArrayList<>();

    @Autowired
    private DemoService demoService;

    @Override
    public void invoke(DemoData data, AnalysisContext context) {
        dataList.add(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        demoService.save(dataList);
    }

}

然后在Controller里面通过Spring容器获取这个对象(注意:一定要通过容器手动获取,prototype原型模式的bean如果还通过@Autowired的形式注入的话,这个对象还是同一个,因为@Autowired只会注入一次)

DemoDataListener listener = SpringUtil.getApplicationContext().getBean(DemoDataListener.class);

获取Spring容器的部分可以参考:Spring获取上下文对象ApplicationContext的2种办法


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍

维特丝(vetes)泡沫发蜡喷雾干胶定型弹力素羊毛卷男女保湿蓬松发胶 泡沫发蜡450ml+旅行装99ml
¥34.00
维特丝(vetes)一梳黑染发剂染发梳植物潮色显白遮盖白发自然清水纯黑发焗油男女梳炫彩 自然黑LW00
¥49.00
维特丝(vetes)染发笔遮白补染快速染发天然植物一次性染发棒 一次性染发棒黑色
¥46.00
维特丝 护发精油防毛躁清香玫瑰奇焕亮发干枯烫发卷发直发头发润发护发素男女士 滋养柔顺护发精油100ml
¥36.00