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
元素指定beanA
的getBeanB
方法将会被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>
经过以上两步以后每次在调度beanA
的getBeanB()
方法时,Spring
都重新从bean
容器中获取一个beanB
,因为beanB
定义为多例形式,所以每次都会获取一个全新的BeanB
对象。
在给一个bean
指定了lookup-method
后,Spring
将通过CGLIB
动态的生成一个该bean
对应类型的子类,然后在该子类中实现或重写lookup-method
元素指定的方法,并从bean
容器中获取lookup-method
元素指定的bean
作为返回值进行返回。当bean
指定的类型是一个抽象类且lookup-method
指定的方法是一个抽象方法时,Spring
就将实现该抽象方法,否则就是重写。定义了lookup-method
的bean
真正的类型是Spring
动态生成类的类型,但是它可以被当做bean
本身指定的类型使用,因为动态生成的类就是继承自bean
本身指定的类型的。
由于Spring
是需要动态生成类来重写或实现指定的方法的,所以我们必须确保由lookup-method
指定的方法是可以被重写的,这就要求该方法对子类是可访问的,而且不能是final
型的。具体来讲lookup-method
元素指定的方法需要具有如下形式:
<public|protected> [abstract] <return-type> methodName(no-arguments)
如你所见,lookup-method
指定的方法还不能有参数。
(注:本文是基于Spring4.1.0所写)
相关推荐
RevitLookup-2021.0.0.13,供各位做REVIT二次开发的同仁们下载、学习、研究。
revit开发必备工具 本包中是已经编译过的文件,可以直接使用 ...编辑其中RevitLookup.dll 路径为编译路径 C:\RevitLookup-2016.0.0.6\CS\bin\Debug\RevitLookup.dll 重启revit: 即可在菜单栏看到工具
RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5
RevitLookup - 2016 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2016下即可
RevitLookup - 2017 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2017下即可
前端开源库-nsq-lookup-jcnsq lookup jc,通过nsqlookupd查找nsqd实例
RevitLookup-2020.0.0.4 官方公布源代码需要自己编译,方便学习REVIT内核构架和开发
RevitLookup - 2018 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2018下即可
“Lookup方法”可以使Spring替换一个bean原有的,获取其它对象具体的方法,并自动返回在容器中的查找结果。下面这篇文章主要给大家介绍了关于Spring中Lookup(方法注入)的相关资料,需要的朋友可以参考下
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:iso3_lookup-0.3.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Spring系列第12篇:lazy-init:bean延迟初始化Spring系列第13篇:使用继承简化bean配置(abstract & parent)Spring系列第14篇:lookup-method和replaced-method比较陌生,怎么玩的?Spring系列第15篇:代理详解(Java...
lookup-dns- dns.lookup替换dns.lookup标准方法的DNS缓存超级简单易用const request = require ( 'request' ) ;const { lookup } = require ( 'lookup-dns-cache' ) ;// With "request" modulerequest ( { url : '...
python库,解压后可用。 资源全名:databricks_feature_lookup-0.0.5-py3-none-any.whl
资源来自pypi官网。 资源全名:databricks_feature_lookup-0.0.5-py3-none-any.whl
资源来自pypi官网。 资源全名:digdeo-syspass-ansible-lookup-0.2.4.tar.gz
资源来自pypi官网。 资源全名:drf-multi-lookup-0.0.14.tar.gz
python库,解压后可用。 资源全名:spacy_lookup-0.0.5-py2.py3-none-any.whl
资源来自pypi官网。 资源全名:spacy_lookup-0.0.5-py2.py3-none-any.whl
资源来自pypi官网。 资源全名:drf-multi-lookup-0.0.19.tar.gz