当前位置: 首页 > news >正文

Spring 多实例注入

文章目录
  • 1. Spring 多实例注入的应用场景
  • 2. Spring 多实例注入的使用
      • 2.1 通过 ApplicationContext 获取多实例
      • 2.2 配置 @Scope 的 proxyMode 属性获取多实例

1. Spring 多实例注入的应用场景

Spring 容器中保存的 bean 默认是单例的,通常来说这样做可以降低 bean 对象创建的频率,在某些访问量大的场景下可以节省对象创建消耗的时间,提高响应性能。但在一些其他场景,比如脚本调度处理多个消息队列中的消息,这时候拉取各个队列消息的步骤是完全相同的,只不过各条队列的名称和密码不一样,显然可以使用一个专门的processor来处理,以便减少重复代码。这样一来,一个解决方式是每一条队列使用一个单独的processor实例,这就需要用到 Spring 的多实例注入了

2. Spring 多实例注入的使用

Spring 框架中, 可以通过在一个Java 类上添加注解@Scope并配置注解相关属性将该类声明为原型作用域,这样每次从 Spring 容器中获取其实例的时候都会返回一个新的对象

2.1 通过 ApplicationContext 获取多实例

如果在一个Java 类上只添加注解@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE),这种声明为多实例的 bean 对象通过注解@Resource@Autowired自动注入无法保证每次获取的都是新的实例,一个解决方法是通过 Spring 的ApplicationContext,直接获取容器中的 bean 实例,示例代码如下

  1. 首先在目标类上添加注解@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)声明其每次使用都需要新的实例

    @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class MessageProcessor { ...... private String queueName; private String passWord; ...... }
  2. 创建实现ApplicationContextAware接口的SpringBeanProvider工具类。使用时注入SpringBeanProvider实例,调用其getBean()方法,传入指定参数即可获取到类的新实例

    @Component public class SpringBeanProvider implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 通过 beanName 获取 Bean * @param beanName * @return */ public Object getBean(String beanName) { return applicationContext.getBean(beanName); } /** * 通过class获取Bean * @param clazz * @param <T> * @return */ public <T> T getBean(Class<T> clazz) { return applicationContext.getBean(clazz); } /** * 通过 beanName ,以及Clazz返回指定的Bean * @param beanName * @param clazz * @param <T> * @return */ public <T> T getBean(String beanName, Class<T> clazz) { return applicationContext.getBean(beanName, clazz); } }
2.2 配置 @Scope 的 proxyMode 属性获取多实例

这种方式需要在实现类上添加注解@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)指定类的代理模式,这样使用注解@Resource@Autowired自动注入也能保证每次方法调用都是基于新对象,其底层实现原理是基于 AOP 机制

  1. 使用ScopedProxyFactoryBean作为代理类替换掉目标类,生成相应的 BeanDefintion 注册到容器中
  2. 上层应用获取目标类实例时,实际最终获取到代理类ScopedProxyFactoryBean实例
  3. ScopedProxyFactoryBean作为目标实例代理对象,其每次方法调用时会触发拦截器执行,在拦截器逻辑中会通过BeanFactory#getBean()方法新建目标对象,从而实现多例
@Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS) public class MessageProcessor { ...... private String queueName; private String passWord; ...... }
http://www.jsqmd.com/news/450414/

相关文章:

  • 2026年四川抖音短视频代运营公司5强推荐榜单发布 - 精选优质企业推荐榜
  • Flutter 三方库 open_simplex_2 的鸿蒙化适配指南 - 掌控噪声资产、精密 Simplex 治理实战、鸿蒙级物理专家
  • HC六辊轧机轧辊总装图CAD图纸
  • Spring 循环依赖
  • Spring 核心技术解析【纯干货版】- XII:Spring 数据访问模块 Spring-R2dbc 模块精讲
  • 2026碳酸镁市场佼佼者盘点:优秀生产厂家一览,知名的碳酸镁供应商技术实力与市场口碑领航者 - 品牌推荐师
  • Android项目创建指南-Java版
  • 告别技术门槛|手把手教你,在中文平台轻松玩转MCP,联动大模型高效干活!
  • 2026年海南抖音短视频代运营公司5强推荐榜单公布 - 精选优质企业推荐榜
  • 企业级学院个人信息管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 2026年氧化铝空心球厂家盘点:这几家市场表现值得关注,氧化铝空心球/偏高岭土/白刚玉,氧化铝空心球直销厂家推荐排行榜 - 品牌推荐师
  • 2026年深圳抖音短视频代运营公司排行榜发布 - 精选优质企业推荐榜
  • 京东E卡回收,如何挑选靠谱平台 - 京顺回收
  • 2026年吉林抖音短视频代运营服务商5强推荐榜单发布 - 精选优质企业推荐榜
  • 2026年山西抖音短视频代运营公司排行榜公布 - 精选优质企业推荐榜
  • 2026年广东抖音短视频代运营服务商5强推荐榜单发布 - 精选优质企业推荐榜
  • Springboot中CommandLineRunner的用法以及执行顺序的控制
  • 2026年郑州抖音短视频代运营服务商5强推荐榜单公布 - 精选优质企业推荐榜
  • RCE基础----DVWA,Pikachu,CTFHUB
  • MySQL事务隔离与MVCC底层实战
  • SpringBoot中Get请求和POST请求接收参数详解
  • SpringBoot Maven 项目 pom 中的 plugin 插件用法整理
  • springboot+全局异常处理
  • Android跨平台开发与硬件适配技术全景解析
  • Flutter 三方库 personnummer 的鸿蒙化适配指南 - 掌控身份资产、精密编号治理实战、鸿蒙级校验专家
  • python flask的老年人个人健康管理vue统计图
  • SpringBoot后端服务重定向
  • Springboot中mybatis的使用
  • Springboot中SLF4J详解
  • 5G NR PUSCH开环功控