lookup-method标签实践与分析

简介: Spring中默认的对象都是单例的(而且Spring会在一级缓存中保存该对象以便下次直接获取),如果是原型作用域,每次会创建一个新的对象。如果在单例模式的bean下引用一个原型模式的bean,此时就需要引用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类似)

相关文章
|
5月前
|
存储 Java
构造String问题之构造一个Trusted MethodHandles.Lookup实例,如何实现
构造String问题之构造一个Trusted MethodHandles.Lookup实例,如何实现
|
5月前
|
监控 UED
深入理解Call-ID头字段的重要性
【8月更文挑战第24天】
260 0
|
5月前
|
XML 缓存 API
【Azure API 管理】使用APIM进行XML内容读取时遇见的诡异错误 Expression evaluation failed. Object reference not set to an instance of an object.
【Azure API 管理】使用APIM进行XML内容读取时遇见的诡异错误 Expression evaluation failed. Object reference not set to an instance of an object.
|
7月前
|
机器学习/深度学习 消息中间件 人工智能
人工智能平台PAI操作报错合集之出现报错:No factory supports the additional filters.Could not instantiate the executor.如何解决
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
8月前
|
XML 缓存 Java
Spring5源码(7)-lookup-method和replace-method注入
Spring5源码(7)-lookup-method和replace-method注入
132 0
重构——29以数据类取代记录(Replace Record with Data Class)
以数据类取代记录(Replace Record with Data Class):你需要面对传统编程环境中的记录结构;为该记录创建一个“哑”数据对象
1567 0
|
Java C++ 索引
《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到《Inside The C++ Object Model》这本书看了下, 感觉收获很大,因为书写得比较早,有些知识应该要更新,但是还是值得好好研读,由于该书的内容给人比较散的感觉,所以一直想找个时间整理一下,遂成此文,虽然都是抄书上的,但是却让我有了温故
2130 0
|
Java Spring
Spring源码(二-2)-lookup-method、replaced-method标签
lookup-method 通常称为获取器注入,spring in action 中对它的描述是,一种特殊的方法注入,它是把一个方法声明为返回某种类型的 bean,而实际要返回的 bean 是在配置文件里面配置的。
585 1
|
前端开发 JavaScript Java
前端培训-中级阶段(32)-set、map、proxy、symbol、reflect、generator
前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。
150 0
前端培训-中级阶段(32)-set、map、proxy、symbol、reflect、generator
|
测试技术
一起谈.NET技术,三种属性操作性能比较:PropertyInfo + Expression Tree + Delegate.CreateDelegate
  在《上篇》中,我比较了三种属性操作的性能:直接操作,单纯通过PropertyInfo反射和IL Emit。本篇继续讨论这个话题,我们再引入另外两种额外的属性操作方式:Expression Tree(这和IL Emit基本一致)和通过Delegate的静态方法CreateDelegate创建相应的委托进行属性的赋值和取值。
893 0