FactoryBean和BeanFactory都是spring中的接口,从名字上看大家一定觉得这两个东西有某些联系,但是其实这个两个接口除了名字像之外真的没啥关系
(1)BeanFactory
这个接口是spring IOC容器最顶层的接口,大家可以看一下类图
这个接口提供了最基本的容器方法,其他的容器类都是继承这个接口来拓展相应的功能的,感兴趣的同学可以去看看
(2)FactoryBean
这个接口是spring提供的用于装饰用户bean的接口,这里采用了装饰器模式,没有研究过的同学可以看我的另一篇博文:https://my.oschina.net/u/1169535/blog/757276
举个例子
实体类:
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>
测试类
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方法返回对象实例,具体的细节感兴趣的同学可以看相应的代码