2019独角兽企业重金招聘Python工程师标准>>>

Spring(07)——单例注入多例之lookup-method 博客分类: spring

7 单例注入多例之lookup-method

Spring有一种机制,可以动态的实现或重写bean容器中指定bean的指定方法,然后将返回值指定为bean容器中的另一个bean。现针对前文提到的单例bean需注入多例bean的应用场景来谈谈如何使用这种机制。先假设我们有一个单例beanA需注入一个多例BeanB类型的bean,那么我们可以这样来做。

1、在beanA对应的类中定义一个方法用来获取BeanB,有这么一个方法就行,可以是空实现,到时候将由Spring来为我们重写或实现,然后返回一个BeanB类型的bean。为此,可以将我们的BeanA如下定义:

public class BeanA {/**
     * 需要使用到BeanB的方法
     */public void doSomething() {BeanB beanB = this.getBeanB();System.out.println(beanB);//...}/**
     * 定义一个返回值为BeanB的方法,用来获取BeanB类型的bean,该方法将由Spring来重写。
     * @return
     */public BeanB getBeanB() {return null;}}

2、在ApplicationContext中定义一个单例beanA和一个多例beanB,同时通过lookup-method元素指定beanAgetBeanB方法将会被Spring重写并返回bean容器中的beanB

<bean id="beanB" class="com.app.BeanB" scope="prototype"/><bean id="beanA" class="com.app.BeanA"><!-- 表示将由Spring重写getBeanB()方法,并返回名为beanB的bean --><lookup-method name="getBeanB" bean="beanB"/></bean>

经过以上两步以后每次在调度beanAgetBeanB()方法时,Spring都重新从bean容器中获取一个beanB,因为beanB定义为多例形式,所以每次都会获取一个全新的BeanB对象。

在给一个bean指定了lookup-method后,Spring将通过CGLIB动态的生成一个该bean对应类型的子类,然后在该子类中实现或重写lookup-method元素指定的方法,并从bean容器中获取lookup-method元素指定的bean作为返回值进行返回。当bean指定的类型是一个抽象类且lookup-method指定的方法是一个抽象方法时,Spring就将实现该抽象方法,否则就是重写。定义了lookup-methodbean真正的类型是Spring动态生成类的类型,但是它可以被当做bean本身指定的类型使用,因为动态生成的类就是继承自bean本身指定的类型的。

由于Spring是需要动态生成类来重写或实现指定的方法的,所以我们必须确保由lookup-method指定的方法是可以被重写的,这就要求该方法对子类是可访问的,而且不能是final型的。具体来讲lookup-method元素指定的方法需要具有如下形式:

<public|protected> [abstract] <return-type> methodName(no-arguments)

如你所见,lookup-method指定的方法还不能有参数。

(注:本文是基于Spring4.1.0所写)

http://elim.iteye.com/blog/2383967

转载于:https://my.oschina.net/xiaominmin/blog/1599759

Spring(07)——单例注入多例之lookup-method相关推荐

  1. Spring中bean的单例与多例

    Spring中bean的单例与多例 前言 Spring中单例与多例 如何配置单例/多例 单例/多例Bean的使用事项 总结 前言 之前其实已经学习过对于单例模式的使用单例模式讲解,也用过一段时间的Sp ...

  2. 设计模式C#描述——单例与多例模式

    设计模式C#描述--单例与多例模式 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有以下特点: 单例类只能有一个实例. 单例 ...

  3. 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式

    设计模式C#描述之--简单工厂模式 前 言:设计模式是软件开发领域的精髓之一.学好设计模式是目前每一个开发人员的必修课.目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并 不很适合初学者 ...

  4. SpringMVC Controller单例和多例

    对于SpringMVC Controller单例和多例,下面举了个例子说明下. 第一次:类是多例,一个普通属性和一个静态属性. 结果:普通属性:0.............静态属性:0 普通属性:0. ...

  5. Java面向对象(接口、匿名内部类、object类、单例、多例)

    1.1接口(抽象类与接口,优先使用接口) 抽象方法和全局常量的集合,使用interface定义,使用implements继承 接口可以多继承(可以向上强制转换) 接口只能有public,一般不写常量 ...

  6. 这篇文章,我们来谈一谈Spring中的属性注入

    本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring中的对象跟Bean,你知道Spring怎么创 ...

  7. Spring中bean的注入方式

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类的实例再调用该实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖 ...

  8. Spring 3.0 注解注入详解

    Spring 3.0 注解注入详解 2011-04-15 09:44 17ZOUGUO ITEYE博客 我要评论(1) 字号:T | T AD: 一.各种注解方式 1.@Autowired注解(不推荐 ...

  9. java 从一个容器获取对象,Java 如何实现从spring容器中获取注入的bean对象

    Java 如何实现从spring容器中获取注入的bean对象 发布时间:2020-11-03 15:27:37 来源:亿速云 阅读:70 作者:Leah 这期内容当中小编将会给大家带来有关Java 如 ...

最新文章

  1. 《强化学习周刊》第21期:EMNLP 2020-2021强化学习的最新研究与应用
  2. 程序员该知道的7个必经阶段
  3. JS简单正则得到字符串中特定的值
  4. LeetCode(合集)删除数组中的元素(26,80,283)
  5. nll_loss 和 cross_entropy
  6. 7-207 排序 (25 分)
  7. 使用嵌套循环,打印 5 行 5 列的直角三角形
  8. APP自动化测试系列之获取Android的Activity 和 Package
  9. windows下eclipse模拟运行apk
  10. 【Java学习笔记之十一】Java中常用的8大排序算法详解总结
  11. 逆向工具IDA安装教程
  12. [算法笔记]NPC问题证明sample
  13. python--step-01
  14. html打砖块游戏制作,JavaScript实现打砖块游戏
  15. 自适应页界面HTML源码
  16. C# 开发的网络数据包抓取的的实现
  17. DevCloud注册和登录
  18. 《十周成为数据分析师》笔记——业务线 第五节 用户画像体系
  19. 2017下半年掘金日报优质文章合集:Android篇,android开发工程师
  20. 20194711 阚宇航 第一次软工作业

热门文章

  1. 超越谷歌MobileNet!华为提出端侧神经网络架构GhostNet|已开源
  2. SAP 如何看某个TR是否传入了Q或者P系统?
  3. 深度丨谈谈人工智能的潜力、实践意义和目前存在的障碍
  4. python库tqdm是什么以及怎么用tqdm、trange和tqdm.notebook
  5. (节点分类)四大图数据集AIFB,MUTAG,BGS,AM数据集获取
  6. VR视觉健康标准在穗发布 专家:VR使用不要超过45分钟
  7. 发布|CES 2019 科技趋势(附40页PPT)
  8. 脑机交互研究及标准化实践
  9. 专家:智能芯片国际竞争愈发激烈,应尽快制定国家标准
  10. 4名矿工控制50%算力 去中心化是不是谎言?