Spring中BeanFactory与FactoryBean有什么区别


小编给大家分享一下Spring中BeanFactory与FactoryBean有什么区别,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在Spring中有BeanFactory和FactoryBean这2个接口,从名字来看很相似,比较容易搞混。BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean()containsBean()等管理Bean的通用方法。Spring的容器都是它的具体实现如:DefaultListableBeanFactoryXmlBeanFactoryApplicationContext这些实现类又从不同的维度分别有不同的扩展。从Ioc容器中获取Bean(byName or byType)检索Ioc容器中是否包含指定的Bean判断Bean是否为单例首先它是一个Bean,但又不仅仅是一个Bean。它是一个能生产或修饰对象生成的工厂Bean,类似于设计模式中的工厂模式和装饰器模式。它能在需要的时候生产一个对象,且不仅仅限于它自身,它能返回任何Bean的实例。从它定义的接口可以看出,FactoryBean表现的是一个工厂的职责。 即一个Bean A如果实现了FactoryBean接口,那么A就变成了一个工厂,根据A的名称获取到的实际上是工厂调用getObject()返回的对象,而不是A本身,如果要获取工厂A自身的实例,那么需要在名称前面加上’&‘符号。getObject(‘name’)返回工厂中的实例getObject(‘&name’)返回工厂本身的实例通常情况下,bean 无须自己实现工厂模式,Spring 容器担任了工厂的 角色;但少数情况下,容器中的 bean 本身就是工厂,作用是产生其他 bean 实例。由工厂 bean 产生的其他 bean 实例,不再由 Spring 容器产生,因此与普通 bean 的配置不同,不再需要提供 class 元素。先定义一个Bean实现FactoryBean接口MyBean实现了FactoryBean接口的两个方法,getObject()是可以返回任何对象的实例的,这里测试就返回MyBean自身实例,且返回前给message字段赋值。同时在构造方法中也为message赋值。然后测试代码中先通过名称获取Bean实例,打印message的内容,再通过&+名称获取实例并打印message内容。说了这么多,为什么要有FactoryBean这个东西呢,有什么具体的作用吗?
FactoryBean在Spring中最为典型的一个应用就是用来创建AOP的代理对象。我们知道AOP实际上是Spring在运行时创建了一个代理对象,也就是说这个对象,是我们在运行时创建的,而不是一开始就定义好的,这很符合工厂方法模式。更形象地说,AOP代理对象通过Java的反射机制,在运行时创建了一个代理对象,在代理对象的目标方法中根据业务要求织入了相应的方法。这个对象在Spring中就是——ProxyFactoryBean。所以,FactoryBean为我们实例化Bean提供了一个更为灵活的方式,我们可以通过FactoryBean创建出更为复杂的Bean实例。他们两个都是个工厂,但FactoryBean本质上还是一个Bean,也归BeanFactory管理BeanFactory是Spring容器的顶层接口,FactoryBean更类似于用户自定义的工厂接口。BeanFactoryFactoryBean的区别确实容易混淆,死记硬背是不行的,最好还是从源码层面,置于spring的环境中去理解。看完了这篇文章,相信你对“Spring中BeanFactory与FactoryBean有什么区别”有了一定的了解,如果想了解更多相关知识,欢迎关注开发云行业资讯频道 香港云主机,感谢各位的阅读!

相关推荐: vue中mixins属性有什么用

本篇内容介绍了“vue中mixins属性有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mixin.js 文件这个文件就暴露出一个对象,不过这个对象和组件…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/25 20:59
Next 07/25 20:59

相关推荐