首先咱们要知道Spring就是一个大的Bean容器池,用户经过简单的配置,让Spring帮忙实例化对象,而Spring是经过反射原理建立Bean的。java
而后咱们知道通常状况下咱们配置Bean时使用的是类的全路径。Spring还提供了另一种方法,经过FactoryBean的方式配置Bean。下面详细讲解FactoryBean。spring
(1)FactoryBean是Spring的一个接口,定义了如下3个接口方法:缓存
Object getObject():返回有FactoryBean建立的Bean实例,若是isSingleton()返回true,则该实例会放到Spring容器的单实例缓存池中。
boolean isSingleton():肯定由FactoryBean建立Bean的做用域是singleton仍是prototype。
Class getObjectType():返回FactoryBean建立Bean的类型。ide
(2)当配置文件中 <bean>的class属性配置的实现类是FactoryBean时,经过getBean方法返回的不是FactoryBean自己,而是 FactoryBean#getObject()方法所返回的对象,至关于FactoryBean#getObject()代理了getBean()方法。this
(3)举一个简单的例子,好比当咱们建立某个bean时,须要作一些特殊的事情。代码以下:prototype
import org.springframework.beans.factory.FactoryBean; public class MyFactoryBean implements FactoryBean { private MyBean instance; private String myFactoryBeanAttr; public String getMyFactoryBeanAttr() { return myFactoryBeanAttr; } public void setMyFactoryBeanAttr(String myFactoryBeanAttr) { this.myFactoryBeanAttr = myFactoryBeanAttr; } @Override public Object getObject() throws Exception { if (instance == null) { instance = createInstance(); } return instance; } public Class getObjectType() { return MyBean.class; } protected MyBean createInstance() throws Exception { // do something return new MyBean(); } public boolean isSingleton() { return true; } private static final class MyBean { } }
这样当咱们在Spring中注册MyBeanFactory时实际生成的是MyBean的实例化对象。代理