张春 发表于 2023-2-26 11:00:20

spring 中 singleton 和 prototype 作用域的比较

Spring Bean 作用域

主要了解 singleton 和prototype 就好了,他们分别使用 单例模式 和 原型模式
来源说明singleton默认作用域,一个BeanFactory有且仅有一个实例(并不是在JVM进程里是唯一的)prototype原型作用域,每次以来查找和依赖注入生成新的Bean对象request将Spring Bean存储在ServletRequest上下文中session将Spring Bean存储在HttpSession中application将Spring Bean 存储在ServletContext中依赖查找: 比较 singleton 和 prototype 两种作用域

结论: 使用依赖查找时,singleton会拿到相同的对象,prototype 会拿到不同的对象
首先我们将User对象通过 singleton 和prototype 两种方式分别注入到容器中
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104444720-1539418723.png
我们三次拿到User对象,比较结果(比较name属性)
观察可以看到,使用 singleton 作用域拿到的是相同的对象,prototype 作用域拿到的是不同的对象
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104445311-603524511.png
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104445805-143546887.png
依赖注入 比较 singleton 和 prototype 两种作用域

结论:singleton 作用域拿到的是相同的对象,prototype 作用域拿到的仍然是不同的对象
通过@Autowired方式依赖查找对象
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104446180-766239686.png
把他们打印出来看看,这样子会报错,因为容器中有重复的对象,而我们没有指定哪个是primary
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104446740-1430664442.png
如果我们使用 @Qualifier 注解指定要注入的对象名称,就不会报错了
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104447169-1235000076.png
输出结果如下:可以看到,singleton 作用域拿到的是相同的对象,prototype 作用域拿到的仍然是不同的对象
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104447585-1063807395.png
依赖注入集合时 singleton 和 prototype 作用域的比较

结论:集合中会同时存在一份 singleton bean 和 prototype bean
使用@Autowired直接注入map集合
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104447926-1627231860.png
输出,打印,可以看到 singleton 和 prototype 作用域的对象同时存在
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104448286-2008815051.png
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104448669-805668784.png
singleton 和 prototype 作用域的生命周期方法的回调情况

结论:
singleton 和 prototype 都会执行初始化方法回调
但仅 singleton 会执行销毁方法回调
为了方便看到 beanName,User类实现了 BeanNameAware 接口,并定义了 初始化 和 销毁方法,具体如下:
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104449015-231631156.png
我们仍然使用依赖注入集合的方式同时拿到 singleton 和 prototype 作用域中的 User bean,并将他们输出
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104449484-1627469152.png
输出看看,可以看到 prototype bean 的销毁方法并没有被回调
https://img2023.cnblogs.com/blog/2439937/202302/2439937-20230226104449996-1916514745.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: spring 中 singleton 和 prototype 作用域的比较