当前位置:首页 > 数码 > Spring-BeanFactory-在-与-终极指南-FactoryBean-中的区别 (springernature)

Spring-BeanFactory-在-与-终极指南-FactoryBean-中的区别 (springernature)

admin4个月前 (05-06)数码30

咱们还是来剖析面试题,当天了不起来来带大家看看这个须要看源码的面试题,由于面试的时刻,有很多状况不必定须要去看源码就能回答的疑问,然而也有很多的疑问是须要咱们去看源码才干回答的疑问,当天咱们就来看看一个比拟经典的疑问,也是关于Spring的面试题。

BeanFactory

BeanFactory是Spring容器的顶级接⼝,给详细的IOC容器的成功提供了规范。

BeanFactory只是个接口,并不是IOC容器的详细成功.

而Spring的实质是一个Bean工厂(BeanFactory)或许说Bean容器,它依照咱们的要求,消费咱们须要的各种各样的Bean,提供应咱们经常使用。只是在消费Bean的环节中,须要处置Bean之间的依赖疑问,才引入了依赖注入(DI)这种技术。也就是说依赖注入是BeanFactory消费Bean时为了处置Bean之间的依赖的一种技术而已。

BeanFactory的成功

Spring容器给出了很多种成功,如DefaultListableBeanFactory、XmlBeanFactory、licationContext等。而这些详细的容器都是成功了BeanFactory,再在其基础之上附加了其余的性能。

DefaultListableBeanFactory

BeanFactory接口体系的自动成功类,成功以上接口的性能,提供BeanDefinition的存储map,Bean对象对象的存储map。

其中Bean对象实例的存储map,定义在FactoryBeanRegistrySupport,FactoryBeanRegistrySupport成功了SingletonBeanRegistry接口,而DefaultListableBeanFactory的基类AbstractBeanFactory,承袭于FactoryBeanRegistrySupport。

StaticListableBeanFactory

用于存储给定的bean对象实例,不支持灵活注册性能,是ListableBeanFactory接口的繁难成功。

ApplicationContext

ApplicationContext蕴含BeanFactory的一切性能,通常倡导⽐BeanFactory优先。

ApplicationContext以⼀种更向⾯向框架的⽅式⼯作以及对高低⽂进⾏分层和成功承袭,ApplicationContext包还提供了以下的性能:

BeanFactory提供的⽅法及其繁难,仅提供了六种⽅法供客户调⽤:源码如下

StringFACTORY_BEAN_PREFIX="&";//判别⼯⼚中能否蕴含给定称号的bean定义,若有则前往truebooleancontnsBean(StringbeanName)//前往给定称号注册的bean实例。依据bean的性能状况,假设是singleton形式将前往⼀个共享实例,否则将前往⼀个新建的实例,假设没有找到指定bean,该⽅法或许会抛出意外ObjectgetBean(String)//前往以给定称号注册的bean实例,并转换为给定class类型ClassgetType(Stringname)前往给定称号的bean的Class,假设没有找到指定的bean实例,则排除NoSuchBeanDefinitionException意外ObjectgetBean(String,Class)//判别给定称号的bean定义能否为单例形式booleanisSingleton(String)//前往给定bean称号的一切别名String[]getAliases(Stringname)

而FactoryBean是干什么用的呢?

FactoryBean

⼀般状况下,Spring经过反射机制利⽤<bean>的class属性指定成功类实例化Bean,在某些状况下,实例化Bean环节⽐较复杂,假设依照传统的⽅式,则须要在<bean>中提供⼤量的性能信息。性能⽅式的灵敏性是受限的,这时采⽤编码的⽅式或许会失掉⼀个繁难的⽅案。

Spring为此提供了⼀个org.springframework.bean.factory.FactoryBean的⼯⼚类接⼝,⽤户可以经过成功该接⼝定制实例化Bean的逻辑。FactoryBean接⼝关于Spring框架来说占⽤关键的位置,Spring⾃身就提供了70多个FactoryBean的成功。它们暗藏了实例化⼀些复杂Bean的细节,给下层应⽤带来了便利。从Spring3.0开局,FactoryBean开局⽀持泛型,即接⼝申明改为FactoryBean<T>的方式

以Bean开头,示意它是⼀个Bean,不同于个别Bean的是:它是成功了FactoryBean<T>接⼝的Bean,依据该Bean的ID从BeanFactory中失掉的实践上是FactoryBean的getObject()前往的对象,⽽不是FactoryBean自身,假设要失掉FactoryBean对象,请在id前⾯加⼀个&符号来失掉。

springernature

例如⾃⼰成功⼀个FactoryBean,性能:⽤来代理⼀个对象,对该对象的一切⽅法做⼀个阻拦,在调⽤前后都输入⼀⾏LOG,模拟ProxyFactoryBean的性能。

FactoryBean⼀个接⼝,当在IOC容器中的Bean成功了FactoryBean后,经过getBean(StringBeanName)失掉到的Bean对象并不是FactoryBean的成功类对象,⽽是这个成功类中的getObject()⽅法前往的对象。要想失掉FactoryBean的成功类,就要getBean(&BeanName),在BeanName之前加上&.

在该接⼝中还定义了以下3个⽅法:

TgetObject():前往由FactoryBean创立的Bean实例,假设isSingleton()前往true,则该实例会放到Spring容器中单实例缓存池中;booleanisSingleton():前往由FactoryBean创立的Bean实例的作⽤域是singleton还是prototype;ClassgetObjectType():前往FactoryBean创立的Bean类型。

总结

BeanFactory是个Factory,也就是IOC容器或对象⼯⼚,FactoryBean是个Bean。在Spring中,一切的Bean都是由BeanFactory(也就是IOC容器)来进⾏治理的。但对FactoryBean⽽⾔,这个Bean不是繁难的Bean,⽽是⼀个能⽣产或许润色对象⽣成的⼯⼚Bean,它的成功与设计形式中的⼯⼚形式和润色器形式相似。


Spring中BeanFactory与FactoryBean的作用与区别

Spring Framework,今年夏天你可能已经听见很多的议论。 在本文中,我将试图解释Spring能完成什么,和我怎么会认为它能帮助你开发J2EE应用程序。 另一framework? 你可能正在想“不过是另外一个的framework”。 当已经有许多开放源代码(和专有) J2EE framework时,为什么你应该费心读这篇文章,或下载Spring Framework? 我相信Spring是独特的,因为若干个原因: . 它定位的领域是许多其他流行的framework没有的。 Spring关注提供一种方法管理你的业务对象。 . Spring是全面的和模块化的。 Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。 因此从你的学习中,你可得到最大的价值。 例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。 . 它的设计从底部帮助你编写易于测试的代码。 Spring是用于测试驱动工程的理想的framework。 Spring对你的工程来说,它不需要一个以上的framework。 Spring是潜在地一站式解决方案,定位于与典型应用相关的大部分基础结构。 它也涉及到其他framework没有考虑到的内容。 尽管它仅仅是一个从2003年2月才开始的开源工程,但Spring有较长的历史根基。 这个开源工程是起源自我在2002年后期出版的《Expert One-on-One J2EE设计与开发》书中的基础代码。 这本书展示了Spring背后的基础架构。 然而,这个基础架构的概念要追溯到2000年的早些时候,并且反映了我为一系列成功的商业工程开发基础结构的经验。 从2003年1月,Spring已经落户于SourceForge上。 现在有10个开发人员,其中6是高度投入的积极分子。 Spring的架构性的好处 在我们进入细节以前,让我们看一下Spring可以给一个工程带来的一些好处: . Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。 如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题,。 . Spring能消除在许多工程上对Singleton的过多使用。 根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。 . Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。 曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。 倒置控制的使用(在下面讨论)帮助完成这种简化。 . Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。 . Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。 在Spring应用中的大多数业务对象没有依赖于Spring。 . 使用Spring构建的应用程序易于单元测试。 . Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。 你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。 . Spring帮助你解决许多问题而无需使用EJB。 Spring能提供一种EJB的替换物,它们适于许多web应用。 例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。 . Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。 Spring确实使你能通过最简单可行的解决办法解决你的问题。 这些特性是有很大价值的。 Spring能做什么? Spring提供许多功能,在此我将快速地依次展示其各个主要方面。 任务描述: 首先,让我们明确Spring范围。 尽管Spring覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。 Spring的主要目的是使J2EE易用和促进好编程习惯。 Spring不重新开发已有的东西。 因此,在Spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。 这些均有开源项目提供(例如Commons Logging 用来做所有的日志输出,或Commons DBCP用来作数据连接池),或由你的应用程序服务器提供。 因为同样的的原因,我们没有提供O/R mapping层,对此,已有有好的解决办法如Hibernate和JDO。 Spring的目标是使已存在的技术更加易用。 例如,尽管我们没有底层事务协调处理,但我们提供了一个抽象层覆盖了JTA或任何其他的事务策略。 Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。 例如,象许多开发人员,我们从来没有为Struts高兴过,并且感到在MVC web framework中还有改进的余地。 在某些领域,例如轻量级的IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已经较为流行的解决方案。 (Spring在这些区域是开路先锋。 ) Spring也得益于内在的一致性。 所有的开发者都在唱同样的的赞歌,基础想法依然是Expert One-on-One J2EE设计与开发的那些。 并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个领域。 Spring在应用服务器之间是可移植的。 当然保证可移植性总是一次挑战,但是我们避免任何特定平台或非标准化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的应用服务器上的用户。 倒置控制容器 Spring的设计核心是 包, 为与JavaBeans一起工作而设计。 这个包一般不直接被用户使用, 但作为基础为更多的其他功能服务. 下一个较高层面的抽象是Bean Factory。 Spring bean factory 是一个普通的Factory,它使对象能够按名称获取,并且能管理对象之间的关系。 Bean factories 支持两种对象模式: . Singleton:在此模式中,有一个具有特定名称的共享对象实例,它在查找时被获取。 这是默认的,而且是最为经常使用的。 它对于无状态对象是一种理想的模式。 :在此模式中,每次获取将创建一个独立的对象。 例如,这可以被用于允许用户拥有他们自己的对象。 由于 是一个简单的接口,它能被为了底层存储方法而实现。 你能够方便地实现你自己的BeanFactory,尽管很少用户需要。 最为常用的定义是: : 可解析简单直观的定义类和命名对象属性的XML结构。 我们提供了一个DTD来使编写更容易。 :可提供解析存放在属性文件中的bean定义,和可通过编程创建BeanFactories。 每个bean定义可能是一个POJO(通过类名和JavaBean初始属性定义),或是一个FactoryBean。 FactoryBean接口添加了一个间接层。 通常,这用于使用AOP或其他方法来创建代理对象:例如,添加了声明性事务管理的代理。 (这在概念上和EJB侦听相似,但在实践中实现更简单。 ) BeanFactories能在一个层次结构中可选择性的参与,根据来自祖先的继承定义。 这使在整个应用中公共配置的共享成为可能,虽然个别资源,如controller servlets,也拥有他们自己的独立的对象集合。 这种使用JavaBeans的动机在的第四章中有描述,在TheServerSide网站上的有免费的PDF(). 通过BeanFactory概念,Spring成为一个倒置控制的容器。 (我非常不喜欢container这个术语,因为它使人联想到重量级容器,如EJB容器。 Spring的BeanFactory是一个可通过一行代码创建的容器,并且不需要特殊的部署步骤。 ) 位于倒置控制背后的概念是在Hollywood原则中经常表述:Don’t call me, I’ll call you. IoC将控制职责搬进了框架中,并脱离应用代码。 涉及到配置的地方,意思是说在传统的容器体系结构中,如EJB,一个组件可以调用容器并问“我需要它给我做工作的对象X在哪里?”;使用IoC容器则只需指出组件需要X对象,在运行时容器会提供给它。 容器基于方法名作出这种说明,或可能根据配置数据如XML。 倒置控制的几个重要好处。 如: . 因为组件不需要在运行时间寻找合作者,所以他们可以更简单的编写和维护。 在Spring的IoC版本里,组件通过暴露JavaBean的setter方法表达他们依赖的其他组件。 这相当于EJB通过JNDI来查找,EJB查找需要开发人员编写代码。 . 同样原因,应用代码更容易测试。 JavaBean属性是简单的,Java核心的,并且容易测试:仅编写一个包含自身的Junit测试方法用来创建对象和设置相关属性即可。 . 一个好的IoC实现隐藏了强类型。 如果你使用一个普通的factory来寻找合作者,你必须通过类型转换将返回结果转变为想要的类型。 这不是一个主要问题,但是不雅观。 使用IoC,你在你的代码中表达强类型依赖,框架将负责类型转换。 这意味着在框架配置应用时,类型不匹配将导致错误;在你的代码中,你无需担心类型转换异常。 . 大部分业务对象不依赖于IoC容器的APIs。 这使得很容易使用遗留下来的代码,且很容易的使用对象无论在容器内或不在容器内。 例如,Spring用户经常配置Jakarta Commons DBCP数据源为一个Spring bean:不需要些任何定制代码去做这件事。 我们说一个IoC容器不是侵入性的:使用它并不会使你的代码依赖于它的APIs。 任何JavaBena在Spring bean factory中都能成为一个组件。 最后应该强调的是,IoC 不同于传统的容器的体系结构( 如EJB), 应用代码最小程度的依靠于容器。 这意味着你的业务对象可以潜在的被运行在不同的IoC 框架上-或者在任何框架之外-不需要任何代码改。 以我的经验和作为Spring用户,过分强调IoC给应用代码带来的好处是不容易的。 IoC不是一个新概念,但是它在J2EE团体里面刚刚到达黄金时间。 有一些可供选择的IoC 容器: notably, Apache Avalon, PicoContainer 和 HiveMind. Avalon 不会成为特别流行的,尽管它很强大而且有很长的历史。 Avalon是相当的重量级和复杂的,并且看起来比新的IoC解决方案更具侵入性。 PicoContainer是一个轻量级而且更强调通过构造器表达依赖性而不是JavaBean 属性。

Spring中@Bean和FactoryBean作用和区别

FactoryBean并不是简单的@Bean 一般情况下,Spring通过反射机制利用的class属性指定实现类实例化Bean,在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息。 配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。 Spring为此提供了一个的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。 FactoryBean接口对于Spring框架来说占用重要的地位,Spring自身就提供了70多个FactoryBean的实现。 它们隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利。 从Spring3.0开始,FactoryBean开始支持泛型,即接口声明改为FactoryBean<T>的形式 FactoryBean底层Java8实现两个方法: @Overridepublic Object getObject() throwsException { (getObject......); returnproxyObj;} @Overridepublic ClassgetObjectType() { return proxyObj == null ? : (); } FactoryBean是个接口,可以实例化两个对象,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。 要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Spring

“Spring-BeanFactory-在-与-终极指南-FactoryBean-中的区别 (springernature)” 的相关文章

Spring-释放数据传输潜力的数据压缩技术-微服务 (springboot启动)

Spring-释放数据传输潜力的数据压缩技术-微服务 (springboot启动)

简介 随着云原生架构的兴起,微服务已成为可扩展和可维护系统的重要构建块。顾名思义,微服务是小型的、独立的服务,它们共同构成一个完整的系统。当使用微服务构建系统时,尤其是那些具有大量数据交换的系统...

比如每日有大量用户访问和数据替换-服务器的带宽需求与网站的访问量密切相关-那么就须要更大的带宽来满足需求-访问量-假设你的网站流量大 (比如每日有大事的句子)

比如每日有大量用户访问和数据替换-服务器的带宽需求与网站的访问量密切相关-那么就须要更大的带宽来满足需求-访问量-假设你的网站流量大 (比如每日有大事的句子)

SpringBeanDefinition元信息定义形式 BeanDefinition是一个蕴含Bean元数据的对象。它形容了如何创立Bean实例、Bean属性的值以及Bean之间的依赖相关。...

b-b-核心原理拆解与源码分析-2.0-Spring-Boot-深度实践 (核心b类期刊有哪些)

b-b-核心原理拆解与源码分析-2.0-Spring-Boot-深度实践 (核心b类期刊有哪些)

SpringBoot是一个基于Spring的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用程序。随着SpringBoot2.0版本的发布,其功能和性能得...

Boot-Spring-与-3.0-加速应用性能的完美融合-GraalVM (bootstrap)

Boot-Spring-与-3.0-加速应用性能的完美融合-GraalVM (bootstrap)

在 2023 年,SpringBoot 3.0 的发布标志着 Spring 框架对 GraalVM 的全面支持。此支持对 Spring 技术栈来说是一项重大补充。 GraalVM 概述...

6-Spring-提供的四种弱小工具-远程接口调用神器 (6sp日常使用还能用多久)

6-Spring-提供的四种弱小工具-远程接口调用神器 (6sp日常使用还能用多久)

1.引见 Spring6是一个十分弱小的框架,它提供了许多工具和接口来简化远程接口调用。其中,WebClient、RestTemplate、HTTPInterface和RestClient是...

Spring-Boot-Starter原理详解-b-b (springernature)

Spring-Boot-Starter原理详解-b-b (springernature)

SpringBoot Starter 是一种包含了一组特定功能和依赖关系的依赖项,旨在为特定的应用程序场景提供快速集成和开箱即用的功能。主要用于将常用的功能模块打包成一个可重用的依赖项,开发者只需...

容器启动有效的交互-Spring-如何利用-框架提供的才干-让-Bean-深化了解并与-Spring (容器启动过程)

容器启动有效的交互-Spring-如何利用-框架提供的才干-让-Bean-深化了解并与-Spring (容器启动过程)

Spring有一个特点,就是创立进去的Bean对容器是无感的,一个Bean是怎样样被容器从一个Class整成一个Bean的,关于Bean自身来说是不知道的,当然也不须要知道,也就是Bean对容器的...

Boot中高效成功订单30分钟智能敞开的战略指南-Spring-源代码揭秘 (high boot)

Boot中高效成功订单30分钟智能敞开的战略指南-Spring-源代码揭秘 (high boot)

形式一:经常使用定时义务 代码成功如下: 首先,咱们定义一个实体类Order,蕴含基本信息以及订单的创立期间: @EntitypublicclassOrder{@Id@Generat...