spring prototype 使用场景
在 Spring IoC 容器中具有以下几种作用域:
- singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例,适用于无状态bean;
- prototype:原型模式,`每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例,适用于有状态的Bean; ----
demo
环境搭建
定义@Scope(“prototype”)- bean
@Slf4j
@Component
@Scope("prototype")
public class FooService {@Value("${x.foo}")private String foo;public void foo() {log.info("---foo:{} ,{}", foo, this);}@PostConstructpublic void init() {log.info("---foo:init");}public FooService(){log.info("---foo:construct");}@PreDestroypublic void destroy(){log.warn("---foo:destroy");}
}@Slf4j
@Component
@Scope("prototype")
public class BarService {@Value("${x.bar}")private String bar;public void bar() {log.info("---bar:{} ,{}",bar,this);}@PostConstructpublic void init() {log.info("---bar:init");}public BarService(){log.info("---bar:construct");}@PreDestroypublic void destroy(){log.warn("---bar:destroy");}
}
定义@Scope(“singleton”)-bean
@Component
@Scope("singleton")
//@Lazy
@Slf4j
public class SingletonService {public void exec() {log.info("---singleton:{} ", this);}@PostConstructpublic void init() {log.info("---singleton:init");}public SingletonService(){log.info("---singleton:construct");}@PreDestroypublic void destroy(){log.warn("---singleton:destroy");}
}
定义bean调用者
@RestController
@RequestMapping("/test")
public class TestController {@Autowiredprivate FooService fooService;@Autowiredprivate ApplicationContext applicationContext;@GetMapping("/refresh")public String refresh(){log.info("-------------------------------");applicationContext.getBean(BarService.class).bar();fooService.foo();applicationContext.getBean(SingletonService.class).exec();return "success";}@GetMapping("/shutdown")public void shutdownContext() {((ConfigurableApplicationContext) applicationContext).close();}
}
日志
启动服务时
2022-09-28 13:56:02.035 [main] INFO c.j.e.e.refresh2.service.FooService - ---foo:construct
2022-09-28 13:56:02.038 [main] INFO c.j.e.e.refresh2.service.FooService - ---foo:init
2022-09-28 13:56:02.042 [main] INFO c.j.e.e.r.service.SingletonService - ---singleton:construct
2022-09-28 13:56:02.042 [main] INFO c.j.e.e.r.service.SingletonService - ---singleton:init
- FooService: 虽然
scope为"prototype"
,但是由@Autowired
自动注入,所以在启动容器时就已经通过getBean()
被注入。 - SingletonService:
scope为"singleton"
,启动时便被注入- 可以通过:
@Lazy
来控制是否在容器启动时就初始化。
- 可以通过:
执行"/refresh"请求
- BarService:在执行请求后,方才执行
getBean()
方法,此时BarService才初始化。 — 延迟初始化
2022-09-28 13:56:39.693 [http-nio-8080-exec-1] INFO c.j.e.e.refresh2.TestController - -------------------------------
2022-09-28 13:56:39.694 [http-nio-8080-exec-1] INFO c.j.e.e.refresh2.service.BarService - ---bar:construct
2022-09-28 13:56:39.695 [http-nio-8080-exec-1] INFO c.j.e.e.refresh2.service.BarService - ---bar:init
2022-09-28 13:56:39.695 [http-nio-8080-exec-1] INFO c.j.e.e.refresh2.service.BarService - ---bar:BAR4 ,cn.jhs.e2e.e2eencryptionbiz.refresh2.service.BarService@4cfd6769
2022-09-28 13:56:39.697 [http-nio-8080-exec-1] INFO c.j.e.e.refresh2.service.FooService - ---foo:FOO4 ,cn.jhs.e2e.e2eencryptionbiz.refresh2.service.FooService@2f51409b
2022-09-28 13:56:39.697 [http-nio-8080-exec-1] INFO c.j.e.e.r.service.SingletonService - ---singleton:cn.jhs.e2e.e2eencryptionbiz.refresh2.service.SingletonService@60aec68a
再次执行"/refresh"请求
- BarService:在执行第二次请求后,由spring再次初始化,返回一个新的实例.
2022-09-28 13:57:35.822 [http-nio-8080-exec-2] INFO c.j.e.e.refresh2.TestController - -------------------------------
2022-09-28 13:57:35.823 [http-nio-8080-exec-2] INFO c.j.e.e.refresh2.service.BarService - ---bar:construct
2022-09-28 13:57:35.823 [http-nio-8080-exec-2] INFO c.j.e.e.refresh2.service.BarService - ---bar:init
2022-09-28 13:57:35.823 [http-nio-8080-exec-2] INFO c.j.e.e.refresh2.service.BarService - ---bar:BAR4 ,cn.jhs.e2e.e2eencryptionbiz.refresh2.service.BarService@71f187fc
2022-09-28 13:57:35.823 [http-nio-8080-exec-2] INFO c.j.e.e.refresh2.service.FooService - ---foo:FOO4 ,cn.jhs.e2e.e2eencryptionbiz.refresh2.service.FooService@2f51409b
2022-09-28 13:57:35.823 [http-nio-8080-exec-2] INFO c.j.e.e.r.service.SingletonService - ---singleton:cn.jhs.e2e.e2eencryptionbiz.refresh2.service.SingletonService@60aec68a
执行"/shutdown"
只有@Scope("singleton")
bean ,会执行destory()
方法.
2022-09-28 13:59:31.973 [http-nio-8080-exec-4] WARN c.j.e.e.r.service.SingletonService - —singleton:destroy
结论
Spring
- 不对作用域为prototype的bean的整个生命周期负责:容器在bean
初始化&实例后
,不再负责bean的销毁。 - 作用域为singleton的bean的整个生命周期负责
spring prototype 使用场景相关推荐
- 《Spring技术内幕》——1.4节Spring的应用场景
1.4 Spring的应用场景 通过介绍Spring架构设计,我们了解到Spring是一个轻量级的框架.在Spring这个一站式的应用平台或框架中,其中的各个模块除了依赖IoC容器和AOP之外,相互之 ...
- 原型(Prototype)的场景是不支持循环依赖的
原型(Prototype)的场景是不支持循环依赖的,通常会走到AbstractBeanFactory类中下面的判断,抛出异常.
- Spring boot的场景启动器
场景启动器 Spring boot将所有的功能场景,抽取出来 做成一个个独立的starters启动器 只有在项目里面,引入了starters 这些场景的所有依赖,都会导出到工程中 需要什么样的功能,引 ...
- Spring事务使用场景
常规调用 @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) methodA{--try ...
- spring aop应用场景
场景一: 记录日志 场景二: 监控方法运行时间 (监控性能) 场景三: 权限控制 场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据 ...
- Spring事务失效场景
1.Spring事务最终依赖的数据库的事务,如果用的是mysql的话,执行引擎要是innodb;因为只有innoDB 支持事务. 2.Spring的事务是原理是aop,所以加事务所在bean是要Spr ...
- 再述Spring AOP 应用场景
AOP 是OOP 的延续,是Aspect Oriented Programming 的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种 ...
- 8个Spring事务失效的场景,你碰到过几种?
前言 作为Java开发工程师,相信大家对Spring种事务的使用并不陌生.但是你可能只是停留在基础的使用层面上,在遇到一些比较特殊的场景,事务可能没有生效,直接在生产上暴露了,这可能就会导致比较严重的 ...
- 图解Spring解决循环依赖
点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:juejin.cn/post/684490412216 ...
最新文章
- 云计算的服务模型 SaaS PaaS IaaS
- qdialog 返回值_python-PyQt QDialog返回响应是或否
- pyspark intersection代码示例
- Linux使用imagemagick的convert命令压缩图片、节省服务器空间
- 推荐搞IT的你读读《软件随想录》
- 经济学家告诉你,胸越大的女生越会花钱!
- 设置log缓存_Redis中缓存击穿 缓存穿透 缓存雪崩解决方案
- 使用Html5+C#+微信 开发移动端游戏详细教程 :(三)使用html5引擎搭建游戏框架...
- 又有好奇心,又能自主学习,这个机器人棒棒哒!
- 切换输入法快捷键_输入法失灵怎么办?该怎么恢复?
- springBoot项目首页居然还有这么多种玩儿法,index.html并不是必须的
- python 爬虫生成csv文件和图_python爬虫系列(4.2-python操作csv文件)
- 搭建Hadoop开发环境(全过程)
- dell笔记本驱动安装失败_如何以正确的顺序重新安装驱动程序 | Dell 中国
- 用递归法打印九九乘法表c语言,java递归打印九九乘法表
- python怎么添加包_python怎样导入包
- 恢复被误删的ESP引导分区
- 单元测试测试用例覆盖率为0
- 基于区块链的隐私保护与访问控制云框架
- 432偏计算机编程,统计学考研432笔记