首页 > 编程语言 >【Spring编程常见错误50例】02.原型bean被固定

【Spring编程常见错误50例】02.原型bean被固定

时间:2024-11-03 16:19:59浏览次数:5  
标签:02 return Spring bean 50 Bean 实例 hiScope public

Demo

如下所示 ,通过将ServiceImplScope 设置为原型,但是在每次调用接口获取的时候 返回的都是同一个实例。显然是不符合我们预期。

    @RequestMapping(path = "/hiScope",method = RequestMethod.GET)
    public String hiScope() {
        return "hiScope"+serviceImplScope;
    }
	@Service
	@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
	public class ServiceImplScope {
	
	}

hiScopecom.qxlx.spingboot.service.ServiceImplScope@5d805805

分析问题

对于一个bean来说 分为三个步骤,加载、创建、使用。那么一定在创建bean、填充属性的时候被固定了。
在这里插入图片描述
在这里插入图片描述

解决方案

方式一:通过IOC容器 每次都获取

    @RequestMapping(path = "/hiScope",method = RequestMethod.GET)
    public String hiScope() {
        return "hisocpe"+getServiceImplScope();
    }


    public ServiceImplScope getServiceImplScope () {
        return applicationContext.getBean(ServiceImplScope.class);
    }

具体原理

protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
		@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
	// 如果是单例 第一次会创建 第二次会直接从缓冲中获取		
	// Create bean instance.
	if (mbd.isSingleton()) {
		// xxx 
	} else if (mbd.isPrototype()) {
		// 原型 就会创建一个新的实例
		// It's a prototype -> create a new instance.
		Object prototypeInstance = null;
		try {
			beforePrototypeCreation(beanName);
			prototypeInstance = createBean(beanName, mbd, args);
		}
		finally {
			afterPrototypeCreation(beanName);
		}
		bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
	}
	return (T) bean;
}

方式二: @Lookup注解

    @RequestMapping(path = "/hiScope",method = RequestMethod.GET)
    public String hiScope() {
        return "hi"+getServiceImplScopePrototype();
    }

    @Lookup
    public ServiceImplScope getServiceImplScopePrototype() {
        return null;
    }

使用方法注入的方法需要满足以下语法要求:

<public|protected> [abstract] theMethodName(no-arguments);

方法访问权限必须为public或protected:这与@Lookup的底层原理有关——动态代理
abstract(可选):如果是抽象方法,代理类会实现这方法;如果不是抽象方法,代理类会覆盖这方法
return-type:原型Bean的类型
no-arguments:参数列表必须为空

那么具体原理是什么呢?

在这里插入图片描述

Spring bean作用域

① singleton

使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。

② prototype

使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。

③ request

该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。

④ session

该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。

⑤ global-session

该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。

标签:02,return,Spring,bean,50,Bean,实例,hiScope,public
From: https://blog.csdn.net/jia970426/article/details/143463286

相关文章

  • Adobe IC 下载与快捷键使用【2017-2024】
    目录一、AdobeIC功能介绍1.1强大的图像编辑能力1.2丰富的画笔与图层管理工具1.3模板库与高效协作二、AdobeIC下载与安装2.1下载2.2安装三、AdobeIC快捷键使用3.1基本编辑快捷键3.2视图与导航快捷键3.3协作与批注快捷键一、AdobeIC功能介绍1.1......
  • 第四次:2024年郑州马拉松赛事记
    目录第一次报名通道开启第二次通道开启完赛奖牌和参赛T恤官方召开新闻发布会参加赛事第一次报名通道开启时间回到了九月底,郑州马拉松官方公众号推送消息,报名通道9月27日开启,一致期待的郑马报名终于落地了。第一次抽签,系统推送消息,没有中签。官方通告信息显......
  • 2024-2025-1 20241301 《计算机基础与程序设计》第六周学习总结
    |这个作业属于哪个课程|<2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)>||这个作业要求在哪里|<2024-2025-1计算机基础与程序设计第六周作业](https://www.cnblogs.com/rocedu/p/9577842.html#WEEK06)>||这个作业的目标|<夯实基础,......
  • 2024-2025-1 20241312《计算机基础与程序设计》第6周学习总结
    这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第六周作业)这个作业的目标Polya如何解决问题简单类型与组合类型复合数据结构查找与排序算法算法复杂度递归代码......
  • 【论文阅读】<ICSE2024>CoderEval: A Benchmark of Pragmatic Code Generation......
    CoderEval:ABenchmarkofPragmaticCodeGenerationwithGenerativePre-trainedModels标题:CoderEval:基于生成式预训练模型的实用代码生成基准摘要:基于预训练和微调范式的代码生成模型在学术界和工业界中得到了广泛应用,催生了许多知名的工业模型,如Codex、CodeGen和Pan......
  • 2024-2025-1 20241407《计算机基础与程序设计》第六周学习总结
    这个作业属于哪个课程[2024-2025-1计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里2024-2025-1计算机基础与程序设计第六周作业这个作业的目标学习Polya如何解决问题,简单类型与组合类型,复合数据结构,查找与排序算法......
  • 2024.11.2 2024ICPC成都站
    Solved:7/13Penalty:793Rank:40Rank(ucup):152L.RecoverStatistics输出50个P50、45个P95,4个P99和1个P99+1即可。#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(0);cin.tie(0);inta,b,c;cin>>a>&g......