- 简单的说FactoryBean实际上是一个Bean,并不是一个工厂,它能够为我们创建一个Bean,但是创建的这个Bean实际指向的并不是FactoryBean类型的,而是其中
getObject方法返回类型的对象。
接口解析
- FactoryBean中有三个需要实现的方法,如下:
getObject() public Class<?> getObjectType() public boolean isSingleton()
自定义实现
-
自定义一个FactoryBean,实现Admin的注入,如下:
/** * 自定义FactoryBean,用来创建对象 * 1、@Component :将创建的MyFactoryBean注入到容器中 * 2、实现FactoryBean * 3、指定泛型<T> */ @Component public class MyFactoryBeanimplements FactoryBean<Admin>{ @Override public Admin getObject()throws Exception { System.out.println("创建Admin"); return new Admin(); } @Override public Class<?> getObjectType() { return Admin.class; } @Override public boolean isSingleton(){ return true; } } -
此时即可从容器中获取到对应的Bean了,如下:
@Test public void testFactoryBean(){ //根据id获取实例,这里实际获取的是getObject返回的对象 Admin admin1 = applicationContext.getBean("myFactoryBean", Admin.class); System.out.println(admin1); } -
以上是获取的实例Bean,现在我们就想获取MyBeanFactory本身这个对象,可以在id的前面加上
&即可,如下:@Test public void testFactoryBean2(){ //根据&id获取实例,实际获取的就是MyFactoryBean的对象 MyFactoryBean bean = applicationContext.getBean("&myFactoryBean", MyFactoryBean.class); System.out.println(bean); }
源码解析
- 指定的是FactoryBean的id,为什么获取的是getObject返回的对象?
- 简单的逻辑:判断传入的类型是否是
FactoryBean类型,如果是该类型的,调用getObject方法返回对象即可。 - 在源码中可以看到调用的是
org.springframework.beans.factory.support.FactoryBeanRegistrySupport#doGetObjectFromFactoryBean方法 -
- 简单的逻辑:判断传入的类型是否是
以上所述就是小编给大家介绍的《FactoryBean解析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 每秒解析千兆字节的 JSON 解析器开源,秒杀一大波解析器!
- 注册中心 Eureka 源码解析 —— EndPoint 与 解析器
- 新一代Json解析库Moshi源码解析
- mybatis源码配置文件解析之三:解析typeAliases标签
- MySQL内核源码解读-SQL解析之解析器浅析
- Laravel 核心——IoC 服务容器源码解析(服务器解析)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
人人都在晒,凭什么你出彩
【美】奥斯丁•克莱恩 / 张舜芬、徐立妍 / 北京联合出版公司 / 2015-4 / 38.00
1. 《纽约时报》、亚马逊畅销书排名第1位、好评如潮的创意营销书。《出版人周刊》称其在社交网络时代“在安全范围内提供了实用的自我营销策略”。 2. TED演讲者创意分享:晒对了,全世界都为你点赞:别人在朋友圈、微博晒自拍、晒孩子、晒吃喝,你来晒创意、晒灵感、晒工作、晒收获,发出自己的声音,找到伙伴,机会也会主动找上门! 3. 10堂创意课+手绘涂鸦,所有人都能轻松读完、迅速学会的创意小......一起来看看 《人人都在晒,凭什么你出彩》 这本书的介绍吧!