FactoryBean和BeanFactory都是spring中的接口,从名字上看你们必定以为这两个东西有某些联系,可是其实这个两个接口除了名字像以外真的没啥关系spring
(1)BeanFactory测试
这个接口是spring IOC容器最顶层的接口,你们能够看一下类图this
这个接口提供了最基本的容器方法,其余的容器类都是继承这个接口来拓展相应的功能的,感兴趣的同窗能够去看看.net
(2)FactoryBeanxml
这个接口是spring提供的用于装饰用户bean的接口,这里采用了装饰器模式,没有研究过的同窗能够看个人另外一篇博文:http://www.javashuo.com/article/p-wsjpurue-mr.html对象
举个例子blog
实体类:继承
public class C { private String attr; public String getAttr() { return attr; } public void setAttr(String attr) { this.attr = attr; } }
spring xml配置文件接口
<bean name="c" class="com.chameleon.dao.daoImpl.C"> <property name="attr" value="ceshi"/> </bean>
测试类get
public class MainClient { public static void main(String[] args) { BeanFactory beanFactory = new ClassPathXmlApplicationContext("META-INF/spring/chameleon-context.xml"); C c = (C)beanFactory.getBean("c"); System.out.println(c.getAttr()); } }
结果:ceshi
这就是一个spring依赖注入的简单的不能再简单的例子
那如今我有一个想法,就是在获取这个C的实例的时候通知一下标记一下,或者计数也好,怎么办呢?这个时候就能够使用factorybean装饰一下了,只须要改一下实体类
public class C implements FactoryBean { private String attr; public String getAttr() { return attr; } public void setAttr(String attr) { this.attr = attr; } public Object getObject() throws Exception { System.out.println("装饰一下"); C c = new C(); c.setAttr(attr); return c; } public Class<?> getObjectType() { return C.class; } public boolean isSingleton() { return true; } }
在运行一下测试方式
结果为:
装饰一下
ceshi
具体的实现就是spring在进行依赖注入的时候会判断当前的bean 是否是 instanceOf factoryBean 若是属于的话 会执行getObject方法返回对象实例,具体的细节感兴趣的同窗能够看相应的代码