1. BeanFactory

  BeanFactory,以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

  Spring为我们提供了许多易用的BeanFactory实现,XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。

  实例化容器

Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);

ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);

 ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
BeanFactory factory = (BeanFactory) context;

基本就是这些了,接着使用getBean(String beanName)方法就可以取得bean的实例;BeanFactory提供的方法及其简单,仅提供了六种方法供客户调用:

  •   boolean containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true
  •   Object getBean(String) 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常
  •   Object getBean(String, Class) 返回以给定名称注册的bean实例,并转换为给定class类型
  •   Class getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常
  •   boolean isSingleton(String) 判断给定名称的bean定义是否为单例模式
  •   String[] getAliases(String name) 返回给定bean名称的所有别名

2. FactoryBean

  以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean<T>接口的Bean,根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,如果要获取FactoryBean对象,请在id前面加一个&符号来获取。

  例如自己实现一个FactoryBean,功能:用来代理一个对象,对该对象的所有方法做一个拦截,在调用前后都输出一行LOG,模仿ProxyFactoryBean的功能。

/*** my factory bean<p>* 代理一个类,拦截该类的所有方法,在方法的调用前后进行日志的输出* @author daniel.zhao**/
public class MyFactoryBean implements FactoryBean<Object>, InitializingBean, DisposableBean {private static final Logger logger = LoggerFactory.getLogger(MyFactoryBean.class);private String interfaceName;private Object target;private Object proxyObj;@Overridepublic void destroy() throws Exception {logger.debug("destroy......");}@Overridepublic void afterPropertiesSet() throws Exception {proxyObj = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] { Class.forName(interfaceName) }, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {logger.debug("invoke method......" + method.getName());logger.debug("invoke method before......" + System.currentTimeMillis());Object result = method.invoke(target, args);logger.debug("invoke method after......" + System.currentTimeMillis());return result;}});logger.debug("afterPropertiesSet......");}@Overridepublic Object getObject() throws Exception {logger.debug("getObject......");return proxyObj;}@Overridepublic Class<?> getObjectType() {return proxyObj == null ? Object.class : proxyObj.getClass();}@Overridepublic boolean isSingleton() {return true;}public String getInterfaceName() {return interfaceName;}public void setInterfaceName(String interfaceName) {this.interfaceName = interfaceName;}public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public Object getProxyObj() {return proxyObj;}public void setProxyObj(Object proxyObj) {this.proxyObj = proxyObj;}}

XML-Bean配置如下

<bean id="fbHelloWorldService" class="com.ebao.xxx.MyFactoryBean">
<property name="interfaceName" value="com.ebao.xxx.HelloWorldService" />
<property name="target" ref="helloWorldService" />
</bean>

Junit Test class

@RunWith(JUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyFactoryBeanConfig.class })
public class MyFactoryBeanTest {@Autowiredprivate ApplicationContext context;/*** 测试验证FactoryBean原理,代理一个servcie在调用其方法的前后,打印日志亦可作其他处理* 从ApplicationContext中获取自定义的FactoryBean* context.getBean(String beanName) ---> 最终获取到的Object是FactoryBean.getObejct(), * 使用Proxy.newInstance生成service的代理类*/@Testpublic void testFactoryBean() {HelloWorldService helloWorldService = (HelloWorldService) context.getBean("fbHelloWorldService");helloWorldService.getBeanName();helloWorldService.sayHello();}
}

其实FactoryBean这栋特点,可以实现很多有用的功能,实现大家多多评论多多补充,一起探讨。

转载于:https://www.cnblogs.com/zhimingxin/p/7737023.html

Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法相关推荐

  1. Spring源码分析-从源码看BeanFactory和FactoryBean的区别

    导语   在使用Spring 中最为核心的操作就是Bean的创建以及使用.下面就来带着大家一起来分析一下关于Spring的Bean的加载相关的知识 文章目录 BeanFactory getBean方法 ...

  2. factorybean 声明_阿里面试题:BeanFactory与FactoryBean的区别

    作者:至尊宝 来源:cnblogs.com/aspirant/p/9082858.html BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的 ...

  3. Spring中BeanFactory和FactoryBean的区别

    先介绍一下Spring的IOC容器到底是个什么东西,都说是一个控制反转的容器,将对象的控制权交给IOC容器,其实在看了源代码之后,就会发现IOC容器只是一个存储单例的一个ConcurrentHashM ...

  4. BeanFactory和FactoryBean的区别

    区别:BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean.在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管 ...

  5. c语言%.6s和%6s的差别,6s和6的区别有哪些 各方面详细介绍【图文】

    苹果 手机大家都听说过吧,它现在是很多年轻人追捧的对象,尤其是对于女性朋友来说,苹果手机是美国的一个手机品牌.在大陆市场非常受欢迎,它的价格虽然高,但是它的销量非常高,目前最为流行的款式就是苹果6S了 ...

  6. Spring中 BeanFactory 与 FactoryBean 的区别

    作者:叁滴水 blog.csdn.net/qq_30285985/article/details/115433099 文章目录 前言 为什么会有FactoryBean? 通过源码深入学习Factory ...

  7. BeanFactory与FactoryBean的区别

    spring不允许我们直接操作 BeanFactory  bean工厂,所以为我们提供ApplicationContext 这个接口 此接口继承BeanFactory 接口,ApplicationCo ...

  8. SpringBoot : BeanFactory和FactoryBean的区别

    1.美图 2.BeanFactory BeanFactory,以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂.在Spring中,BeanFactory是IOC容器的核心接 ...

  9. 黑莓9000和9900哪个好_黑莓9900和9930的区别大剖析【详细介绍】

    现在的手机越来越高级,一代比一代高配置.很多人问黑莓9900和9930的区别在哪里?黑莓9900比9930早出一年.但是很多功能比黑莓9930少很多.功能不同自然参数是不相同的了,黑莓9900和993 ...

最新文章

  1. hadoop1.x 与hadoop2.x 架构变化分析
  2. java emptylist_Java中Collections的emptyList、EMPTY_LIST详解
  3. Javascript中的对象查找【转】
  4. pytorch 之 冻结某层参数,即训练时不更新
  5. Kafka集群环境搭建
  6. 【深度学习】——训练过程
  7. 一.第一周golang学习:--string解析成基本数据类型
  8. html代码不安全,安全 – HTML编码是否会阻止各种XSS攻击?
  9. python matplotlib阶段性总结——word转txt、绘图、文件操作
  10. 小谈wagaa的下载速度
  11. 当北极光遇上阿里旅行:我是旅游IP梦工场,哪里需要那里往
  12. 小学生如何学计算机,作为小学生该如何学编程?
  13. pe下找不到ssd硬盘_WinPE无法识别NVMe SSD硬盘,如何重装系统?
  14. 18位身份证号码的编排规则
  15. Android Instant Run介绍
  16. java 长链接转短链接_java长链接转短链接代码和如何跳转使用
  17. 看什么书可以提高情商?提高情商的书籍排行榜
  18. 坚定信念,雨后终会见彩虹
  19. 爬虫:python爬取简历模板
  20. verilog 24进制+60进制 模拟时钟计数器

热门文章

  1. 【linux】Linux下LCD自动熄屏解决方法
  2. 学计算机一定要加班吗,老梁推荐:毕业后经常加班的几类专业,工作压力大,对能力要求很高...
  3. 接口是什么意思_程序员天天用却不懂得冷知识,这两句口诀,让你理解RESTful接口...
  4. git config —global_Git多用户配置
  5. 辽宁省计算机专业A类,辽宁省2008年中职升高职招生考试计算机专业综合试题
  6. AttributeError: Cant get attribute SPPF on module models
  7. 如何获取HTML元素对应JavaScript对象?
  8. iOS架构篇-4 架构模式MVVM
  9. wiki多个文件一起导入_mac文件信息管理工具EagleFiler for Mac分享给大家
  10. python dump函数_python中实现php的var_dump函数功能