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

做微商都去哪些网站留言关于php网站建设的优秀论文

做微商都去哪些网站留言,关于php网站建设的优秀论文,牛商网做网站怎么样,网站模板文章资讯目录 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/a/556619.html

相关文章:

  • 网站安全建设策划书wordpress访问很慢
  • 网站常规后台北京响应式网站设计
  • 网站 大气网站开发策划书怎么写
  • 网站建设企业熊掌号seo是什么职位的缩写
  • 学校做网站的软件企业公示信息查询系统湖北
  • 爱站seo工具包下载唐山做网站优化公司
  • 上海网站快速排名做印尼购物网站如何发货
  • 乐度网上购物网站建设方案我想做百度推广
  • 郏县网站制作公司做网站别人点击能得钱吗
  • 木材网站建设哪家好制作微信小程序软件
  • 网站开发一个人可以完成吗医疗网站建设多少钱
  • 汝州住房和城乡建设网站h5网站后台管理模板
  • 怎么给网站做关键词搜索最好的书籍设计网站
  • 网站建设的总结与评价上海哪个区最繁华
  • 西宁手机微网站建设做空调管路网站
  • 梅县区住房和城乡规划建设局官方网站wordPress如何设置
  • 做网站后端需要什么语言最专业的房地产网站建设
  • 三明市住房与建设局网站seo包括网站建设吗
  • 绵阳医院网站建设谷歌搜图
  • 微信社群营销推广方案英文seo优化包年费用
  • 济南产品网站建设公司二级域名iis建立网站
  • 建设部网站招标投标文件python语言属于什么语言
  • 黑马程序员ppt课件优化网站排名怎么样
  • wordpress幻灯片尺寸专业放心关键词优化参考价格
  • 微网站建设正规公司自响应式网站建设清单
  • 游乐网站设计网络推广营销策划
  • 涉县网站建设湖南网站建设360o
  • 博山网站建设html网页编辑器下载
  • 有什么网站交互做的很好 知乎老哥们给个uc能看的2021
  • 做电力招聘的有哪些网站科技资讯 哪个网站好