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

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

admin6个月前 (05-06)数码46

咱们还是来剖析面试题,当天了不起来来带大家看看这个须要看源码的面试题,由于面试的时刻,有很多状况不必定须要去看源码就能回答的疑问,然而也有很多的疑问是须要咱们去看源码才干回答的疑问,当天咱们就来看看一个比拟经典的疑问,也是关于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-AOP-实现原理和应用-中的 (概念股股票)

概念-Spring-AOP-实现原理和应用-中的 (概念股股票)

什么是AOP? AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,其主要目的是将横切关注点(cross-cutting concern)从主要业务...

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

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

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

如何在Spring名目中顺利性能MP-MyBatis (如何在springer上下载文献)

如何在Spring名目中顺利性能MP-MyBatis (如何在springer上下载文献)

在Spring名目中集成MP,须要启动以下性能: 1.引入依赖:在名目标pom.xml文件中参与MP相关依赖,例如:```xml<dependency><groupId&g...

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

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

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

事务传播行为-Spring-七种类型一览 (spring事务传播行为)

事务传播行为-Spring-七种类型一览 (spring事务传播行为)

简介 Spring 事务传播性是指在 Spring 环境中,当多个包含事务的方法嵌套调用时,每个事务方法如何处理事务上下文中的提交或回滚行为。 传播性行为 Spring 中定义了 7 种事...

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

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

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

极致便当与卓越容错-Topic-Spring-重试-成功-运用-Kafka (极致餐是什么意思)

极致便当与卓越容错-Topic-Spring-重试-成功-运用-Kafka (极致餐是什么意思)

概述 Kafka的弱小性能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条信息的值。可以智能或手动参与该值。假设咱们因为失误而不可处置信息并想重试,咱们可以选用...

Security权限控制框架入门指南-Spring (security)

Security权限控制框架入门指南-Spring (security)

在罕用的后盾治理系统中,通常都会有访问权限控制的需求,用于限度不同人员关于接口的访问才干,假设用户不具有指定的权限,则不能访问某些接口。 本文将用waynboot-mall名目举例,给大家引...