前言
Spring框架中的BeanFactory接口和FactoryBean接口因为名称相似,老是容易搞混淆,而且也是面试过程中经常会碰到的一个问题。所以本文就专门给大家整理出来。
一、BeanFactory接口
BeanFactory接口是Spring容器的核心接口,负责:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
Spring为我们提供了许多易用的BeanFactory实现,XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。
1 2 3 |
|
接口中定义的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
二、FactoryBean接口
BeanFactory接口是Spring的核心接口。功能非常复杂,这个时候如果我们想要编写一些比较复杂点儿的逻辑就会触及到其他一些不必要的接口,不好实现。这时候使用FactoryBean就比较方便了。FactoryBean以Bean结尾是个Bean对象,不是工厂。接口中定义的方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1.简单实现
接口和实现类
1 2 3 4 |
|
1 2 3 4 5 6 7 8 9 10 |
|
自定义FactoryBean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
配置文件
1 2 3 4 5 6 7 |
|
测试--通过类型获取
1 2 3 4 5 6 |
|
输出结果
--IUserService实例化之前---
--被实例化了--
--IUserService实例化后---
com.dpb.service.UserServiceImpl@5315b42e
测试--通过id获取
1 2 3 4 5 6 |
|
输出结果
--IUserService实例化之前---
--被实例化了--
--IUserService实例化后---
com.dpb.service.UserServiceImpl@783e6358
如果想要获取FactoryBean对象 id前加 &就可以
1 2 3 4 5 6 |
|
输出结果
com.dpb.factorybean.MyFactoryBean@3b81a1bc
2.增强实现
通过FactoryBean创建一个代理类来增强目标类,我们来看下效果
接口和实现类
1 2 3 4 |
|
1 2 3 4 5 6 7 8 9 10 |
|
自定义FactoryBean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
|
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
测试
1 2 3 4 5 6 7 8 |
|
输出结果:
--被实例化了--
---afterPropertiesSet---
****************
----代理方法执行开始----
UserServiceImpl 。。。 被执行了
----代理方法执行结束----
小结:通过输出结果我们可以看到通过FactoryBean接口我们也可以实现BeanFactory中某些接口提供的功能,而且会更加的灵活一些。
3.FactoryBean的实际使用案例
Spring在整合mybatis框架的时候提供的SqlSessionFactoryBean就是FactoryBean的很好的实现。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Spring会调用SqlSessionFactoryBean这个实现了FactoryBean的工厂Bean 同时加载dataSource,Mapper文件的路径,对sqlSessionFactory进行初始化。
源代码比较多就不一一贴出来。到了这儿可以自行跟踪下源代码。
核心方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
maven坐标:
1 2 3 4 5 |
|
三、总结
- BeanFactory是Spring中IOC容器最核心的接口,遵循了IOC容器中所需的基本接口。例如我们很常见的:ApplicationContext,XmlBeanFactory 等等都使用了BeanFactory这个接口。
- FactoryBean是工厂类接口,当你只是想简单的去构造Bean,不希望实现原有大量的方法。它是一个Bean,不过这个Bean能够做为工厂去创建Bean,同时还能修饰对象的生成。
- FactoryBean比BeanFactory在生产Bean的时候灵活,还能修饰对象,带有工厂模式和装饰模式的意思在里面,不过它的存在还是以Bean的形式存在。