【保姆级】lookup-method标签实践与分析

article/2025/10/19 6:31:54

【Spring源码系列- IOC】

1

【Spring源码】0.安装Gradle环境

2

【Spring源码】1.下载与编译_pom relocation to an other version number is not f

3

【Spring源码】2.试个水先~Debug找到传说中的三级缓存(图解向,堆图预警)

4

【Spring源码】3. xml文件如何转换成BeanDefinition(主要涉及prepareRefresh()+ obtainFreshBeanFactory()两个函数,图解向,堆图预警)_spring xml转bean

5

【Spring源码】4. 自己搞个标签?~自定义标签保姆级全过程(图解向,堆图预警)

6

【Spring源码】5.spring的bean工厂准备工作(prepareBeanFactory(beanFactory)

7

【Spring源码】6. Spring扩展自定义属性编辑器保姆级教程

8

【Spring源码】7. 如何添加自定义的BeanFactoryPostProcessor

9

【Spring源码】8. 捋下invokeBeanFactoryPostProcessors()主要处理流程

10

【Spring源码】9. 超级重要的ConfigurationClassPostProcessor

11

【Spring源码】10. 递归调用的processConfigurationClass()方法

12

【Spring源码】11. 我是注解类不?checkConfigurationClassCandidate()注解类判断方法详解

13

【Spring源码】12. 注册bean处理器registerBeanPostProcessors()

14

【Spring源码】13. 国际化处理initMessageSource()源码解析

【补充内容】【保姆级】SpringBoot项目中的i18n国际化

15

【Spring源码】14. 消息多播器(观察者模式)

【补充内容】【保姆级示例向】观察者模式

16

【Spring源码】15. Bean的创建过程(1.概述篇)

17

【Spring源码】16. Bean的创建过程(2)

18

【Spring源码】17.创建Bean这篇认真的@(・●・)@

【补充内容】

【保姆级·创建对象】如何通过Supplier创建对象

【保姆级·创建对象】如何通过factory-method创建对象

【保姆级·创建对象】如何利用resolveBeforeInstantiation()在预处理阶段返回一个Bean的实例对象

19

【Spring源码】18. factory-method创建对象关键函数详解:instantiateUsingFactoryMethod()

20

【Spring源码】19. 没合适的构造器?找determineCandidateConstructors()!

21

【Spring源码】20. MergedBeanDefinitionPostProcessor修改/合并bean定义

【补充内容】

【保姆级】@PostConstruct & @PreDestroy使用示例

【Spring源码】AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()详解

【Spring源码】CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()详解

22

【Spring源码】21. 初探循环依赖

【补充内容】

【保姆级】手把手Debug循环依赖的整体流程

【实践向】当移除了三级缓存……

【分析向】没有三级缓存会导致什么?

【Spring源码】插播一个创建代理对象的wrapIfNecessary()方法

23

【Spring源码】22. 属性填充populateBean()详解

【补充内容】

【Spring源码】自动注入·名称:autowireByName()详解

【Spring源码】自动注入·类型:autowireByType()详解

【Spring源码】属性值的解析与赋值:populateBean().applyPropertyValues()

【保姆级】超超超简单的自定义注解实现@Autowired同款功能

24

【Spring源码】23. 执行初始化逻辑:initializeBean()

本文目录

🌰

文件结构

​创建实体类

创建配置文件

新建Spring配置文件

创建测试类

测试结果

​测试分析

获取一个类的不同实例

xml配置文件

测试结果

​测试分析


一句话:这个注解是在单例中引用原型使用的

详细点说:Spring中默认的对象都是单例的(而且Spring会在一级缓存中保存该对象以便下次直接获取),如果是原型作用域,每次会创建一个新的对象。如果在单例模式的bean下引用一个原型模式的bean,此时就需要引用lookup-method标签来解决此类问题。 个人理解:由于当调用getBean()方法时,Spring会先在容器中查找有没有这个类,或者这个类的子类,通常情况下,Spring在查找的时候,如果没有匹配或者匹配到多个类都会报错,然而我们又想在一个程序中实现如下两个功能:

  • 分别获取这个父类的两个不同的子类的实例

  • 每次获取到的都是同一个类的不同实例

而lookup-method这个标签就是解决这些问题的

本文就是这两种情况的栗子🌰,感兴趣的同学可以跟着一步一步操作,绝对保姆级教程(不愧是俺(˶‾᷄ ⁻̫ ‾᷅˵))

🌰

获取同一父类的不同子类

文件结构

这个示例一共需要新建6个文件

​创建实体类

有4个实体类(一个父类+两个子类+一个操作类)

Animal.java(父类)

package com.aqin.custom.MethodOverride.lookup;/*** @Description* @Author aqin1012 AQin.* @Date 2022/8/22 9:28 AM* @Version 1.0*/
public class Animal {public Animal() {System.out.println("吃点啥嘞?");}
}

Cat.java

package com.aqin.custom.MethodOverride.lookup;/*** @Description* @Author aqin1012 AQin.* @Date 2022/8/22 10:01 AM* @Version 1.0*/
public class Cat extends Animal{public Cat() {System.out.println("吃(_ _).。oO……猫粮");}
}

Dog.java

package com.aqin.custom.MethodOverride.lookup;/*** @Description* @Author aqin1012 AQin.* @Date 2022/8/22 9:29 AM* @Version 1.0*/
public class Dog extends Animal{public Dog() {System.out.println("吃(*≧ω≦)……狗粮");}
}

AnimalAction.java

package com.aqin.custom.MethodOverride.lookup;/*** @Description* @Author aqin1012 AQin.* @Date 2022/8/22 10:25 AM* @Version 1.0*/
public abstract class AnimalAction {/*** 获取执行该动作的动物** @return*/public abstract Animal getAnimal();
}

创建配置文件

新建Spring配置文件

​添加如下bean定义:

<bean id="dog" class="com.aqin.custom.MethodOverride.lookup.Dog"></bean>
<bean id="cat" class="com.aqin.custom.MethodOverride.lookup.Cat"></bean><bean id="animalAction_A" class="com.aqin.custom.MethodOverride.lookup.AnimalAction"><lookup-method name="getAnimal" bean="dog"></lookup-method>
</bean><bean id="animalAction_B" class="com.aqin.custom.MethodOverride.lookup.AnimalAction"><lookup-method name="getAnimal" bean="cat"></lookup-method>
</bean>

创建测试类

package com.aqin.custom.MethodOverride.test;import com.aqin.custom.MethodOverride.lookup.AnimalAction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @Description* @Author aqin1012 AQin.* @Date 2022/8/22 10:29 AM* @Version 1.0*/
public class TestMethodOverride {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("MethodOverride.xml");AnimalAction animalActionA = (AnimalAction) applicationContext.getBean("animalAction_A");animalActionA.getAnimal();AnimalAction animalActionB = (AnimalAction) applicationContext.getBean("animalAction_B");animalActionB.getAnimal();}
}

测试结果

​测试分析

先在下图位置打个断点

​选择debug方式执行

不断下一步,直到我们在配置类中配置的4个Bean都能在this对象中的singletonObjects中找到的时候,我们来查看使用了lookup-method标签的那两个Bean,可以看到这两个对象都是cglib的代理对象

​当调用到getAnimal()方法时,会跳转到CglibSubclassingInstantiationStrategy中的intercept()方法中

这里的lo是animalAction_A,可以看到lo中的beanName跟xml配置文件中animalAction_A的<lookup-method name="getAnimal" bean="dog"></lookup-method>标签中的bean="dog"是相对应的(animalAction_B类似)

获取一个类的不同实例

文件就用上面的结构就可以了,需要修改下测试类和xml配置文件

测试类做如下修改

public class TestMethodOverride {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("MethodOverride.xml");AnimalAction animalActionB = (AnimalAction) applicationContext.getBean("animalAction_B");animalActionB.getAnimal();AnimalAction animalActionB_2 = (AnimalAction) applicationContext.getBean("animalAction_B");animalActionB_2.getAnimal();}
}

xml配置文件

<bean id="dog" class="com.aqin.custom.MethodOverride.lookup.Dog" scope="prototype"></bean>
<bean id="cat" class="com.aqin.custom.MethodOverride.lookup.Cat" scope="prototype"></bean>

测试结果

​测试分析

此时this对象中的singletonObjects中就只有animalAction_A和animalAction_B两个了(因为Cat和Dog都的scope设置成了prototype(原型))

​可以看到,两次获取的Cat一个是Cat@1730,一个是Cat@1790,并不是同一个对象,实现了在单例中引用原型(单例的bean会被Spring放在一级缓存中保存,以便下次直接获取,所以每次获取到的都是同一个实例)

返回的实际上是一个动态代理生成的对象

撒花(。・ω・。)ノ🎉🎉🎉


http://chatgpt.dhexx.cn/article/cAe63CIE.shtml

相关文章

实战! excel常用函数中lookup的用法

实战 ! VLOOKUP实操&#xff1a; 图一 图二 当我们拿到图一这样的表&#xff0c;而需要获得图二的数据时候&#xff0c;就可以这样做&#xff1a; 图三 在所需要的单元格输入公式&#xff0c;VLOOKUP([区域],表1,3,0)&am…

Xlookup、Vlookup请走开,万能的Wlookup函数来了!

前天&#xff0c;为大家介绍了关于Vlookup接班人Xlookup函数的介绍&#xff0c;一方面惊叹于Xlookup强大的查找功能&#xff0c;另一方面也担心自已只能远观而不能使用。毕竟付费office365的用户占极少数。点击进入查看>> 那怎么办&#xff1f;下面为大家编写了一个比Xl…

EXCEL基础:XLOOKUP函数的简单使用

实验表格如下&#xff0c;这是一个简单的NBA球星信息的表格&#xff1a; 最简单的使用方法&#xff1a; 1、【简单使用1】需求&#xff1a;通过【杜兰特】姓名&#xff0c;知道其所在的【球队】。 在【I3】单元格输入【XLOOKUP(H3,D2:D8,B2:B8)】&#xff0c;其中H3表示的是要…

ACCESS中Dlookup函数使用

ACCESS中Dlookup函数使用 ACCESS中Dlookup函数使用 Dlookup函数&#xff0c;利用条件从表中筛选查找需要的单项数据&#xff0c;类似EXCEL中的Vlookup函数&#xff0c;用法简单快捷&#xff0c;相对SQL语句要简单。 函数用法 Dlookup(字段名&#xff0c;表或查询名字&#…

详解-脏读、幻读与不可重复读

最近在读 《MySQL 技术内幕 InnoDB 存储引擎》&#xff0c;里面提到的各种概念都很新鲜&#xff0c;以前听说过脏读、幻读、不可重复读&#xff0c;但是对于概念不甚了解&#xff0c;于是查了一下&#xff0c;这里做个笔记。 数据库事务特征 数据库事务特征&#xff0c;即 ACID…

17@MySQL数据库读现象详解(脏读、幻读、不可重复读)

文章目录 MySQL数据库读现象一、数据库的读现象1、脏读&#xff08;dirty read&#xff09;&#xff1a;读取未提交数据【案列详解】2、不可重复读取 (nonrepeatable read)&#xff1a;前后多次读取&#xff0c;数据内容不一致【案列详解】3、幻读(nonrepeatable read)&#xf…

简单解释不可重复读和幻读

之前看了一篇关于数据库隔离级别的文章觉得挺好。http://singo107.iteye.com/blog/1175084 不过很多人对“不可重复读”和“幻读“这两者的区别搞不清楚&#xff0c;包括我自己曾也是迷糊了很久一段时间。 但是&#xff0c;必须说明的是“不可重复读”关注的重点其实在于更新…

可重复读隔离级别如何解决脏读、不可重复读

我们都知道可重复读隔离级别可以解决脏读、不可重复读。那么具体是如何解决的呢&#xff1f; 下面先通过实验来演示可重复读能够解决脏读、不可重复读问题&#xff0c;然后解释具体的原因。 环境搭建 1. 建立两个session连接MySQL,session1和session2 关闭session1和session…

简单聊聊mysql的脏读、不可重复读、幻读

最近&#xff0c;在一次 mysql 死锁的生产事故中&#xff0c;我发现&#xff0c;关于 mysql 的锁、事务等等&#xff0c;我所知道的东西太碎了&#xff0c;所以&#xff0c;我试着用几个例子将它们串起来。具体做法就是通过不断地问问题、回答问题&#xff0c;再加上“适当”的…

MySQL MVCC多版本并发控制(脏读和不可重复读解决原理)

文章目录 一、MVCC概念二、MVCC应用于已提交读隔离级别1. 解决脏读2. 无法解决不可重复读3. 无法解决幻读 三、MVCC应用于可重复读隔离级别1. 解决脏读2. 解决不可重复读3. 理解 可重复读隔离级别&#xff0c;只生成一次数据快照4. 理解 可重复读隔离级别&#xff0c;只能部分解…

mysql防止不可重复读_mysql怎么解决不可重复读

mysql解决不可重复读的方法&#xff1a;采用了mvcc多版本并发控制&#xff0c;mvcc是利用在每条数据后面加了隐藏的两列&#xff0c;即创建版本号和删除版本号&#xff0c;每个事务在开始的时候都会有一个递增的版本号。 【相关学习推荐&#xff1a; mysql解决不可重复读的方法…

MySQL事务之不可重复读问题

版权声明&#xff1a;本文为 小异常 原创文章&#xff0c;非商用自由转载-保持署名-注明出处&#xff0c;谢谢&#xff01; 本文网址&#xff1a;https://blog.csdn.net/sun8112133/article/details/89739475 文章目录 一、不可重复读概述1、事例2、分析 二、演示不可重复读1、…

数据库脏读、幻读、不可重复读与四种隔离级别的理解

前言 本章着重点是介绍&#xff1a;出现脏读、幻读、不可重复读的原因&#xff0c;以及设定四种隔离级别如何解决这些现象&#xff0c;结合图例让读者阅读得更加通透 一、什么是事务&#xff1f; 所谓事务是用户定义的一个数据库序列&#xff0c;这些操作要么全做&#xff0…

不可重复读和幻读 重

如有侵权请联系本人删除 首先了解acid与mysql MySQL事务之ACID实现原理&#xff08;全方位解读&#xff09; 深入学习MySQL事务&#xff1a;ACID特性的实现原理 二者很相似&#xff0c;不可重复读指的是对同一条记录&#xff08;可以理解为对同一行&#xff09;前后两次的读取…

灰色关联法 —— matlab

目录 1.简介 2.算法详解 2.1 数据标准化 2.2 计算灰色相关系数 2.3 计算灰色关联度系数 3.实例分析 3.1 读取数据 3.2 数据标准化 3.3 绘制 x1,x4,x5,x6,x7 的折线图 3.4 计算灰色相关系数 完整代码 1.简介 对于两个系统之间的因素&#xff0c;其随时间或不同对象而…

如何利用python实现灰色关联分析?

1.灰色关联分析简介 灰色系统这个概念是相对于白色系统和黑色系统而言的。从控制论的知识里&#xff0c;颜色一般代表对于一个系统我们已知信息的多少&#xff0c;白色代表信息量充足&#xff0c;黑色代表我们其中的构造并不清楚的系统&#xff0c;而灰色介于两者之间&#xf…

灰色关联分析法详解及python实践

1. 关于灰色关联分析 1.1. 什么是灰色关联分析 灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法&#xff0c;其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密&#xff0c;它反映了曲线间的关联程度。 在系统发展过…

python灰色关联度分析_灰色关联分析法 python

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文2290字,预计阅读需10分钟; 关联分析(association analysis)主要用于发现隐藏在大型数据集中的有意义的联系,它起源于商品销售领域,“啤酒与尿布”的故…

灰色关联分析应用

参考学习b站&#xff1a;数学建模学习交流 感觉这篇博客写的很好&#xff1a;灰色关联分析Matlab代码实现 看完后自己尝试运行的一下&#xff0c;发现和自己本地的matlab代码运行结果不同&#xff0c;就把其中细节写到这篇博客里了 运行上述博客应用2的代码&#xff0c;将更…

灰色关联案例与代码

案例 求他们之间的关联度&#xff0c;并且大小排序。 代码 写了注释&#xff0c;自行查看,换了案例&#xff0c;你只需要修改这一部分即可&#xff1a; 因为读取不一样了嘛&#xff0c;你总要改改数字。 clc; close; clear all; xxlsread(gray_data1.xlsx); xx(:,2:end);%所…