- 简单的说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解析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Pro Django
Marty Alchin / Apress / 2008-11-24 / USD 49.99
Django is the leading Python web application development framework. Learn how to leverage the Django web framework to its full potential in this advanced tutorial and reference. Endorsed by Django, Pr......一起来看看 《Pro Django》 这本书的介绍吧!