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

重庆永川网站建设价格互联网销售平台

重庆永川网站建设价格,互联网销售平台,网络推广模板网站,企业网站系统设计与实现目录 1、问题原因 1.1、注入点只初始化一次 1.2、代理模式问题 1.3、使用不当的获取方式 2、解决方案 2.1. ApplicationContext获取 2.2. 使用ObjectProvider 2.3. 使用Lookup方法 2.4. 使用Provider接口 3、原型模式的应用场景 1. 有状态的Bean 2. 线程不安全的对…

目录

1、问题原因

1.1、注入点只初始化一次

1.2、代理模式问题

1.3、使用不当的获取方式

2、解决方案

2.1. ApplicationContext获取

2.2. 使用ObjectProvider

2.3. 使用Lookup方法

2.4. 使用Provider接口

3、原型模式的应用场景

1. 有状态的Bean

2. 线程不安全的对象

3. 需要每次使用新实例的场景

4. 需要避免副作用的场景

4、注意事项


前言

        原型(Prototype)模式的Bean在Spring中每次请求时都会创建一个新的实例,这与单例(Singleton)模式形成对比。

如下图所示:

        默认情况下,Spring中的Bean采用单例模式,即容器始终返回同一实例。然而,通过将singleton属性设置为false,可以使得每次请求都返回一个新的Bean实例。

        当你在Spring中使用原型(prototype)作用域的Bean时,如果通过@Autowired注入后发现仍然是单例行为。


1、问题原因

1.1、注入点只初始化一次

@Autowired在依赖注入时只发生一次(在Bean创建时),之后每次访问都是同一个实例。

1.2、代理模式问题

        如果原型Bean被代理(如AOP代理),而代理配置不正确,可能导致每次获取的都是同一个代理实例。

1.3、使用不当的获取方式

直接通过@Autowired注入原型Bean实际上违背了原型模式的设计初衷

总结:

  @Autowired在依赖注入时只执行一次,将原型Bean注入到单例Bean中时,这个注入动作只发生一次,因此单例Bean持有的始终是同一个原型Bean实例。这与原型Bean的设计初衷相违背。

        正确的方式应该是每次需要新实例时都从容器中显式获取,而不是在初始化时就注入并持有。


2、解决方案

2.1. ApplicationContext获取

@Autowired
private ApplicationContext applicationContext;public void someMethod() {PrototypeBean bean = applicationContext.getBean(PrototypeBean.class);// 每次调用getBean()都会返回新实例
}

2.2. 使用ObjectProvider

使用(Spring 4.3+)版本,代码示例如下:

@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;public void someMethod() {PrototypeBean bean = prototypeBeanProvider.getObject();// 每次getObject()都会返回新实例
}

2.3. 使用Lookup方法

通过@lookup注解,重写get${method}方法。

代码示例如下:

@Configuration
public class AppConfig {@Bean@Scope("prototype")public PrototypeBean prototypeBean() {return new PrototypeBean();}
}@Component
public class SingletonBean {// 使用方法注入@Lookuppublic PrototypeBean getPrototypeBean() {return null; // Spring会覆盖此方法实现}public void someMethod() {PrototypeBean bean = getPrototypeBean(); // 每次调用都返回新实例}
}

2.4. 使用Provider接口

Provider接口是位于(javax.inject)包下。

代码实现如下:

@Autowired
private Provider<PrototypeBean> prototypeBeanProvider;public void someMethod() {PrototypeBean bean = prototypeBeanProvider.get();// 每次get()都会返回新实例
}

3、原型模式的应用场景

1. 有状态的Bean

当Bean需要维护状态,且不同使用者需要独立的状态时:

  • 用户会话相关的对象

  • 请求处理过程中的上下文对象

  • 购物车实例

  • 表单数据对象

@Scope("prototype")
@Component
public class ShoppingCart {private List<Item> items = new ArrayList<>();// 每个用户需要自己的购物车实例
}

2. 线程不安全的对象

当Bean不是线程安全的,且需要在多线程环境中使用时:

  • 简单的日期格式化器(SimpleDateFormat)

  • 随机数生成器

  • 某些第三方库的非线程安全类

@Scope("prototype")
@Component
public class DateFormatter {private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 每个线程需要自己的实例
}

3. 需要每次使用新实例的场景

  • 临时计算器对象

  • 事务处理器(某些场景下)

  • 原型设计模式的实际应用

@Scope("prototype")
@Component
public class ReportGenerator {// 每次生成报告都需要新的实例来保持独立性
}

4. 需要避免副作用的场景

当Bean的操作会修改内部状态,且这种修改不应该影响其他使用者时:

  • 数据处理器

  • 文件处理器

  • 临时缓存对象

@Scope("prototype")
@Component
public class FileProcessor {private File currentFile;// 每个文件处理需要独立的处理器实例
}

4、注意事项

  1. 内存考虑:原型Bean不会自动销毁,需要确保不会造成内存泄漏

  2. 性能影响:频繁创建复杂对象可能影响性能

  3. 依赖管理:原型Bean注入单例Bean时要特别小心(通常使用方法注入)

  4. 测试复杂性:原型Bean可能增加测试的复杂性

        正确使用原型模式可以解决许多与状态和线程安全相关的问题,但需要权衡其带来的资源开销。

http://www.dtcms.com/wzjs/283847.html

相关文章:

  • 宣传部网站建设方案常德网站建设制作
  • 蒙牛企业网站建设规划书十八大禁用黄app入口
  • 中国有没有开源社区朝阳区seo技术
  • 宜春做网站的公司营销型网站建设公司
  • php做门户网站网络服务商
  • 阿里云部署网站百度投放广告平台
  • 学php动态网站开发好不好seo流量
  • 资讯类响应式网站模板昆明seo网站建设
  • python爬虫爬小说来做网站网络营销的特征和功能
  • 免费建网站域名seo优化的技巧
  • 域名网址注册seo系统源码
  • 网站开发需要什么软件湖南广告优化
  • 网站超市深圳百度推广公司
  • 做诈骗网站以及维护网站设计是做什么的
  • 新吴区推荐做网站价格百度推广开户多少钱一个月
  • 做网站优化就是发文章吗2021年网络十大关键词
  • 建设银行网站怎么修改手机号码搜易网服务内容
  • 长春快速建站模板上海百度推广方案
  • 网上购物网站建设企业网站制作流程
  • 苏州网站建设开发如何自建网站
  • 新手学做网站难吗谷歌搜索引擎免费入口镜像
  • 什么是软件开发平台厦门seo外包公司
  • 化妆品网站制作需要公众号seo排名优化
  • 哪里有免费建设网站百度推广引流
  • 发放淘宝优惠券的网站怎么做免费网站外链推广
  • 国外做西餐的网站win10必做的优化
  • 淄博网站建设多搜索引擎优化是指
  • 苏州网站建设排名珠海网站建设
  • 夜店做鸭网站统计网站流量的网站
  • 北京网站建设熊掌号网络营销推广流程