Beans, BeanFactory ApplicationContext <bean id="my Value Calculator class=x y. z MyValue Calculator> <I-- arbitrary method replacement -- Kreplaced-method name=compute Value replacer="replacementCompute value> <arg-type )String</arg-type> </replaced-method> <bean id="replacementCompute Value class=a b c. ReplaceMentCompute value </bean> replaced- method元素中的一个或多个arg-type元素用来表示,这个被重载方法的方法签名。注意,参数 的签名只有在方法被重载并且该方法有多个不同的形式的时候才真正需要。为了方便,参数的类型字 符串可以使全限定名的子字符串。比如,以下的都匹配java.lang. String java. lang String String 因为参数的个数通常就足够区别不同的可能,所以仅仅使用匹配参数的最短的字符串能够节省很多键 入工作 3.3.4.使用 depends-on 对于大多数的情况,一个bean被另一个bean依赖,是由这个bean是否被当作其他bean的属性来表达的 。在 XmlBean Factory中,它是通过ref元素来完成的。与这种方式不同的是,有时一个知道容器的 bean仅仅会被给与它所的依赖的id(使用一个字符串值或等价的 idref元素)。接着第一个bean就以编 程的方式地向容器请求它的依赖。在两种情况下,被依赖的bean都会在依赖它的bean之前被恰当地初 始化 对于相对罕见的情况, beans之间的依赖不够直接(举例,当一个类中的静态初始块需要被触发,比如 数据库驱动的注册), depends-on元素可以用来在初始化使用这个元素的bean之前,强制一个或多个 beans初始化。 下面是一个配置的例子: <bean id="beanOne class="ExampleBean depends-on="manager> <property name="manager><ref local="manager"/></property> <bean id=manager class="ManagerBean/> 3.3.5.自动装配协作对象 BeanFactory能够自动装配合作bean之间的关系。这就意味着,让 Spring通过检查 BeanFactory的内容 来自动装配你的bean的合作者(也就是其他的bean)。自动装配功能有5种模式。自动装配可以指定给 每一个bean,因此可以给一些bean使用而其他的bean不自动装配。通过使用自动装配,可以减少(或 消除)指定属性(或构造函数参数)的需要,显著节省键入工作。在 XmlBeanFactory中,使用bean 元素的 autowire属性来指定bean定义的自动装配模式。以下是允许的值 表3.2.自动装配模式 see第3.3.1节“设置 bean b的属性和合作者 Version 1.1
D$$ ȝ "" ǥ àST9$%&:GH.JKLá ɭ9$%& 2@ɦȲB-£%1$%1*1%+, *1%''ɦȲ3-ž-£%1$%1*1%+,Ȳɮ ɭɯ66 %,92+,%,- B$+@ ,$01%*$B$&+ 66ɮ ɭ,$01%*$@6B$+@ &%B$ɦȲ*B0+$£%1$Ȳ ,$01%*$,ɦȲ,$01%*$B$&+B0+$£%1$Ȳɮ ɭ%,E6+-0$ɮD+,2&Eɭ%,E6+-0$ɮ ɭ,$01%*$@6B$+@ɮ ɭ9$%&ɮ ɭ9$%& 2@ɦȲ,$01%*$B$&+B0+$£%1$Ȳ *1%''ɦȲ%9*Ī$01%*$$&+B0+$£%1$Ȳɮ ɭ9$%&ɮ ,$01%*$@6B$+@âɬ:wxůƫx%,E6+-0$ âɬ¨ňǢI ŷxßƗǯ[\:[\ŕȸƘ ƼIZY :ŕȸƺœ[\ßƗǯǟǵLj[\œƫxzʼn:ɡÜ:ŹʍʠɲȾąØƘ m[ÚIZY:;Æȹ ?ǭäÁ Ȑɴaȸ:pȹ?ǭƘǬĤIÁŗ:ɓ˓P ǒ%%1%&ED+,2&EƘ ǒ%%1%&ED+,2&E D+,2&E D+, ɐZY:xYÖĘƠʀȕĶķzʼn:äIŖÁdzdz ˓PZY:LJ˚:ȹ?ǭȕǥʺǠƫ˛ !KƘ ¦¦À fg @$0$&@'6& ^ŌȏƫY:ȋȌIwx9$%&ßāwx9$%&I{ɫŷx9$%&{FßȆKÉÊ9$%&:GH¨ňˋ: Ƙ śB1#$%&)%*+,-I|{ÖŪ,$5âɬ¨ſ}:Ƙ AŷĂ[Üzʼn:{IœŹwx×ɣijµ: 9$%&dzdzəßøA|Ŗ::2@ ò wxȹ?ǭ§ůʵ˄:2@,$5âɬôƘkƾȝwx9$%&ƠÁ³ Í:[ÜĴijµǍnj|:Ƙ ɀĂȋȌŗIß:9$%&ɓə|:9$%&qߘȆĴȄ ȅĨƘ ^ŌǸ^˝ɝ:ȋȌI9$%&'qr:zȕȍkòĵðIȆwx;:ɳŦȄȅǤąØßɻ IǬĤ Y¶ģãN: ô I@$0$&@'6& âɬäÁ¨ȄȅĨ ŷxâɬ:9$%&qIȡwxůƫx 9$%&'ȄȅĨƘ ŗÌ{wxPT:ðpË ɭ9$%& 2@ɦȲ9$%& &$Ȳ *1%''ɦȲ3%B01$#$%&Ȳ @$0$&@'6&ɦȲB%&%E$,Ȳɮ ɭ0,0$,+- &%B$ɦȲB%&%E$,Ȳɮɭ,$5 1*%1ɦȲB%&%E$,Ȳɮɭ0,0$,+-ɮ ɭ9$%&ɮ ɭ9$%& 2@ɦȲB%&%E$,Ȳ *1%''ɦȲ%&%E$,#$%&Ȳɮ ¦¦Å ÊËÌÍ34× #$%&)%*+,-ȕMNOPJK9$%&qr:ŋƱƘŷƠƼƽƾIơD0,2&EÖŪQR#$%&)%*+,-:Åij ¨MNOPĄ:9$%&:JKLòƔƠ{ÉÊ:9$%&ôƘMNOPœCĂĭÜƘMNOPäÁljaø ǧwx9$%&IɐɛäÁøwŸ9$%& yÉÊ:9$%&zMNOPƘÖŪ MNOPIäÁ ēĔòů šǩôljaGHòůVWXYZYô:ąØIʭ˞ǥʺ˛!KƘ śB1#$%&)%*+,-I 9$%& âɬ:%+2,$GH¨lja9$%&ab:MNOPĭÜƘÁŗ{Ƶƶ:§ ň " MNOPĭÜ #$%&'( #$%&)%*+,-./0012*%+2&&+$3+ £$,'2&
Beans, BeanFactory ApplicationContext 模式 解释 不使用自动装配。Bean的引用必须通过ref元素定义。这是默认的配置,在较大的部 署环境中不鼓励改变这个配置,因为明确的指定合作者能够得到更多的控制和清晰 性。从某种程度上说,这也是系统结构的文档形式。 byName 通过属性名字进行自动装配。这个选项会会检查 BeanFactory,查找一个与将要装配 的属性同样名字的bean。比如,你有一个bean的定义被设置为通过名字自动装配, 它包含一个 master属性(也就是说,它有一个 seaMaster(.)方法), Spring就会 查找一个叫做 master的bean定义,然后用它来设置 master属性 byt 如果 BeanFactory中正好有一个同属性类型一样的bean,就自动装配这个属性。如果 有多于一个这样的bean,就抛出一个致命异常,它指出你可能不能对那个bean使用 by Type的自动装配。如果没有匹配的bean,则什么都不会发生,属性不会被设置 如果这是你不想要的情况(什么都不发生),通过设置 dependency- check=" objects"属性 值来指定在这种情况下应该抛出错误。 constructor这个同 by Type类似,不过是应用于构造函数的参数。如果在 BeanFactory中不是恰好 有一个bean与构造函数参数相同类型,则一个致命的错误会产生。 autodetect通过对bean检查类的内部来选择 constructor或 lby Type。如果找到一个缺省的构造 函数,那么就会应用 by type 注意:显式的指定依赖,比如 property和 constructor-arg元素,总会覆盖自动装配。自动装配的行为可以 和依赖检査结合使用,依赖检査会在自动装配完成后发生。 注意:正如我们已经提到过的,对于大型的应用,自动装配不鼓励使用,因为它去除了你的合作类的 透明性和结构 3.3.6.依赖检查 对于部署在 Beanfactory的bean的未解决的依赖, Spring有能力去检查它们的存在性。这些依赖要么 是bean的 Javabean式的属性,在bean的定义中并没有为它们设置真实的值,要么是通过自动装配特性 被提供。 当你想确保所有的属性(或者某一特定类型的所有属性)都被设置到bean上面的时候,这项特性就很 有用了。当然,在很多情况下一个bean类的很多属性都会有缺省的值,或者一些属性并不会应用到所 有的应用场景,那么这个特性的作用就有限了。依赖检査能够分别对每一个bean应用或取消应用, 就像自动装配功能一样。缺省的是不检査依赖关系。依赖检査可以以几种不同的模式处理。在 Ⅻ ml BeanFactory中,通过bean定义中的 dependency- check属性来指定依赖检査,这个属性有以下的值 表3.3.依赖检査模式 模式 解释 none 不进行依赖检査。没有指定值的bean属性仅仅是没有设值。 SImp le 对基本类型和集合(除了合作者外,比如其他的bean,所有东西)进行依赖检査。 object 对合作者进行依赖检查。 Version 1.1 19
ĭÜ nȻ & z MNOPƘ#$%&:ʡʎʏÖŪ,$5âɬabƘŷ{ʁų:PTIɼȏ:Ʒ ʚɎɏz˟ˠȷƢŷxPTIɐÿȿ:ljaJKLȕvŊĢƫ:.ȇȈ HƘ©ɥĂÍƁŇǙIŷƔ{ƱşŚV:ņŜɡÜƘ 9-Ā%B$ ÖŪGHȸȹ¼MNOPƘŷxŵəəQR#$%&)%*+,-IRʮwxAǦØOP :GHʼnȒȸȹ:9$%& ƘǬĤIĄœwx9$%&:abßSTÖŪȸȹMNOPI |ƂǞwxB%'+$,GHòƔƠ{ǙI|œwx'$+%'+$,[\ôID0,2&EƠə RʮwxɁȦB%'+$,:9$%&abIȩȼ|¨STB%'+$,GHƘ 9-Ý-0$ Ĥƙ#$%&)%*+,-ȾƐœwxʼnGH;ÆwȒ:9$%&IƠMNOPŷxGHƘĤƙ œƫŌwxŷȒ:9$%&IƠˀŲwxĖhėĘI|ljŲĄäz^ƞx9$%& 9-Ý-0$:MNOPƘĤƙDžœ˓P:9$%&IȘȵƟɓzə gIGHzəßSTƘ Ĥƙŷ{ĄzʅØ:ȋȌòȵƟɓz gôIÖŪST@$0$&@$&*-6*$*ɦȲ9ǒ$*+'ȲGH §¨ljaŷĂȋȌŗªLjˀŲĝĞƘ *&'+,*+, ŷxʼn9-Ý-0$;ʐIzŪ{ªŌVWXY:ZYƘĤƙ#$%&)%*+,-z{˜Ɛ œwx9$%&AVWXYZYǸʼn;ÆIȘwxĖh:ĝĞəɜgƘ %+@$+$*+ ÖŪ^9$%& QR;:ÅƷ¨ŵŶ*&'+,*+,ů9-Ý-0$ƘĤƙʮŊwxʹʺ:VW XYIƞƟƠəª9-Ý-0$Ƙ ƼȱʭÜ:ljaIǬĤ0,0$,+-.*&'+,*+,6%,EâɬIřəˆˇMNOPƘMNOP:äÁ .QRŚJ IQRəMNOPſ}ȼ gƘ ƼȱȾĤǓǎƣȚ¿ŊŪ:I^ŌȏÆ:ªIMNOPz˟ˠ Iɐ|ʼǩmĄ:JK;: ƬÿH.ŚVƘ ¦¦Ø ¢£ÎÏ ^ŌƷʚ#$%&)%*+,-:9$%&:ˡnƦ:ID0,2&EœƳʼQR|ǎ:ţHƘ ŷŸØƟ {9$%&:Ù%%#$%&Ü:GHI9$%&:abǟDžœ|ǎSTɲÓ:§I ØƟ{ÖŪMNOPeH ß¿÷Ƙ ȆĄʅȿʷŖœ:GHòůLɥwea;Æ:ŖœGHôɓßSTŊ9$%&ŇÌ:ŹʍI ŷeHƠǠ œmƘȆȩIǠƫȋȌŗwx9$%&;:ǠƫGHɓəœʹʺ:§I ůLwŸGHǟzəªŊŖ œ:ªIƞƟŷxeH:KƠœɴm Ƙ QRȕIJķ^ǧwx9$%&ªůÀšªI ƠȑMNOPwȒƘʹʺ:{z QRŋƱƘ QRäÁÁǃĂzʼn:ĭܽ¾Ƙ śB1#$%&)%*+,-I ÖŪ9$%&ab: @$0$&@$&*-6*$* GH¨ljaQRIŷxGHœÁŗ:§ Ƙ ň "" QRĭÜ ĭÜ nȻ &&$ z¼QRƘDžœlja§:9$%&GHdzdz{DžœS§Ƙ '2B01$ ^7c;Æ.íJòǩmJKLʃIǬĤÉÊ:9$%&IŖœʪʫô¼QRƘ 9ǒ$*+ ^JKL¼QRƘ #$%&'( #$%&)%*+,-./0012*%+2&&+$3+ £$,'2&
Beans, BeanFactory ApplicationContext 模式 解释 对合作者,基本类型和集合都进行依赖检查。 34.自定义bean的本质特征 3.4.1.生命周期接口 Spring提供了一些标志接口,用来改变 BeanFactory中的bean的行为。它们包括 nitializingBean和 DisposableBean。实现这些接口将会导致 BeanFactory调用前一个接口的 afterPropertiesset0方法,调用 后一个接口 destroy0方法,从而使得bean可以在初始化和析构后做一些特定的动作 在内部, Spring使用 BeanPost Processors来处理它能找到的标志接口以及调用适当的方法。如果你需要 自定义的特性或者其他的 Spring没有提供的生命周期行为,你可以实现自己的 Bean Post Processor。关于 这方面更多的内容可以看这里:第3.7节“使用 BeanPostprocessors定制bean” 所有的生命周期的标志接口都在下面叙述。在附录的一节中,你可以找到相应的图,展示了 Spring如 何管理bean;那些生命周期的特性如何改变你的bean的本质特征以及它们如何被管理。 3.4.1.1. Initial izingBean/init-method 实现org. springframework. beans. factory. InitializingBean接口允许一个bean在它的所有必须的属性被 BeanFactory设置后,来执行初始化的工作。 InitializingBean接口仅仅制定了一个方法: * Invoked by a BeanFactory after it has set all bean properties supplied *(and satisfied Bean FactoryAware and ApplicationContextAware) < p>This method allows the bean instance to perform initialization only possible when all bean properties have been set and to throw ar ** exception he event of m figuration. @throws Exception in the event of misconfiguration (such as failure to set an essential property) or if initialization fails. void afterPropertiesSeto throws Exception 注意:通常 InitializingBean接口的使用是能够避免的(而且不鼓励,因为没有必要把代码同 Spring耦合 起来)。Bean的定义支持指定一个普通的初始化方法。在使用 XmlBean Factory的情况下,可以通过指 定init- method属性来完成。举例来说,下面的定义: <bean id=exampleInitBean class="examples. ExampleBean" init-method="init/> ublic class ExampleBean public void inito i // do some initialization work 同下面的完全一样 <bean id="example InitBean" class=examples. AnotherExampleBean/> public class AnotherExampleBean implements InitializingBean t public void afterPropertiesSeto I // do some initialization work Version 1.1
ĭÜ nȻ %11 ^JKLI7c;Æ.íJɓ¼QRƘ ¦À ÊÙÚ 97ÛÜÝ ¦À Þßàá|â D0,2&E¿÷mwŸ=>klI¨ȷƢ#$%&)%*+,-:9$%&:Ƙ |ǎƂƨ&2+2%12ž2&E#$%&. 42'0'%91$#$%&Ƙ ÓÔŷŸklǦəʟĖ#$%&)%*+,-¤wxkl:%5+$,,0$,+2$'D$+[\I ¤ ȼwxkl@$'+,-[\I©y v9$%&äÁȄȅĨ.łVȼȦwŸea:NKƘ ÅƷID0,2&E #$%&'+,*$'',' ¨½¾|ʮŊ:=>klÁ¤ɍȆ:[\Ƙ ĤƙĄąØ Mab:eHůLÉÊ:D0,2&EDžœ¿÷:ghijI ĄäÁÓÔMo: #$%&'+,*$'',ƘŋŌ ŷ[ÌĢƫ:ÅijäÁʶŷǨȱ ȝ "~ ǥ à #$%&'+0,*$'','a9$%&áƘ Ŗœ:ghij:=>klɓŗÌʌîƘˢ:wǥIĄäÁʮŊǸª:ŁI ĻǢmD0,2&EĤ ĥú¾9$%&ʒƞŸghij:eHĤĥȷƢĄ:9$%&:cdefÁÂ|ǎĤĥßú¾Ƙ ¦À %ã § 2&2+6B$+@ ÓÔ,E'0,2&E5,%B$,9$%&'5%*+,-&2+2%12ž2&E#$%& klƵƶwx9$%&|:Ŗœʎʏ:GHß #$%&)%*+,-STȼI ¨ĠȄȅĨ:KƘ&2+2%12ž2&E#$%&kldzdzamwx[\ȱ ˙ &$@ 9- % #$%&)%*+,- %5+$, 2+ %' '$+ %11 9$%& 0,0$,+2$' '0012$@ ˙ %&@ '%+2'52$@ #$%&)%*+,-/%,$ %&@ /0012*%+2&&+$3+/%,$ ˙ ɭ0ɮÝ2' B$+@ %11' +$ 9$%& 2&'+%&*$ + 0$,5,B 2&2+2%12ž%+2& &1- ˙ 0''291$ $& %11 9$%& 0,0$,+2$' %$ 9$$& '$+ %&@ + +, %& ˙ $3*$0+2& 2& +$ $$&+ 5 B2'*&52E,%+2& ˙ ˣ+,' 3*$0+2& 2& +$ $$&+ 5 B2'*&52E,%+2& '* ˙ %' 5%21,$ + '$+ %& $''$&+2%1 0,0$,+- , 25 2&2+2%12ž%+2& 5%21' ˙ 2@ %5+$,,0$,+2$'D$+ +,' 3*$0+2&ɧ ƼȱÖĘ&2+2%12ž2&E#$%&kl: {ȕˤ˥:òyǵz˟ˠIɐDžœʎØƭ®¯ʼnD0,2&EǿJ Ő¨ôƘ#$%&:abæçljawxőÖ:ȄȅĨ[\Ƙ śB1#$%&)%*+,-:ȋȌŗIäÁÖŪlj a2&2+6B$+@GH¨ſ}Ƙ ĵð¨ǙIŗÌ:abȱ ɭ9$%& 2@ɦȲ$3%B01$&2+#$%&Ȳ *1%''ɦȲ$3%B01$'3%B01$#$%&Ȳ 2&2+6B$+@ɦȲ2&2+Ȳɮ 0912* *1%'' 3%B01$#$%& ɨ 0912* 2@ 2&2+ ɨ @ 'B$ 2&2+2%12ž%+2& , ɩ ɩ ʼnŗÌ:ſȐwȒȱ ɭ9$%& 2@ɦȲ$3%B01$&2+#$%&Ȳ *1%''ɦȲ$3%B01$'/&+$,3%B01$#$%&Ȳɮ 0912* *1%'' /&+$,3%B01$#$%& 2B01$B$&+' &2+2%12ž2&E#$%& ɨ 0912* 2@ %5+$,,0$,+2$'D$+ ɨ @ 'B$ 2&2+2%12ž%+2& , #$%&'( #$%&)%*+,-./0012*%+2&&+$3+ £$,'2&
Beans, Bean Factory MApplicationContext 但却不把代码耦合于 Spring。 3.4.1.2. DisposableBean /destroy-method 实现org. springframework. beans. factory. DisposableBean接口允许一个bean,可以在包含它的 BeanFactory销 毁的时候得到一个回调。 DisposableBean也只指定了一个方法 Invoked by a BeanFactory on destruction of a singleton s @throws Exception in case of shutdown errors. Exceptions will get logged but not rethrown to allo * other beans to release their resources too void destroyo throws Exception 注意:通常 DisposableBean接口的使用能够避免的(而且是不鼓励的,因为它不必要地将代码耦合于 Spring)。Bean的定义支持指定一个普通的析构方法。在使用 Xml BeanFactory使用的情况下,它是通 过 destroy- method属性完成。举例来说,下面的定义: <bean id="exampleInitBean class="examples. ExampleBean" destroy-method="destroy /> public class ExampleBean I public void cleanup t // do some destruction work (like closing connection) 同下面的完全一样 <bean id="example InitBean class="examples. AnotherExampleBean/> ublic class Another ExampleBean implements DisposableBean public void destroyo f // do some destruction work 但却不把代码耦合于 Spring 重要的提示:当以 portotype模式部署一个bean的时候,bean的生命周期将会有少许的变化。通过定 义, Spring无法管理一个non- singleton/ prototype bean的整个生命周期,因为当它创建之后,它被 交给客户端而且容器根本不再留意它了。当说起non- singleton/ prototype bean的时候,你可以把 Spring的角色想象成“new”操作符的替代品。从那之后的任何生命周期方面的事情都由客户端来处 理。 BeanFactory中bean的生命周期将会在第3.4.1节“生命周期接口”一节中有更详细的叙述 3.4.2.了解自己 3. 4.2. 1. Bean FactoryAware 对于实现了org. springframework. beans. factory. BeanFactoryAware接口的类,当它被 Bean Factory创建后,它 会拥有一个指向创建它的 BeanFactory的引用 Version 1.1 21
ɩ ɩ ɤ˦zƭ®¯ǿJŌD0,2&EƘ ¦À ¬ § @$'+,-6B$+@ ÓÔ,E'0,2&E5,%B$,9$%&'5%*+,-42'0'%91$#$%&klƵƶwx9$%&I äÁƂǞ|:#$%&)%*+,-˧ ˨:ŹʍvŊwx¦¤Ƙ42'0'%91$#$%&Ɣƺljamwx[\ȱ ˙˙ ˙ &$@ 9- % #$%&)%*+,- & @$'+,*+2& 5 % '2&E1$+& ˙ ˣ+,' 3*$0+2& 2& *%'$ 5 '+@& $,,,' ˙ 3*$0+2&' 211 E$+ 1EE$@ 9+ &+ ,$+,& + %11 ˙ +$, 9$%&' + ,$1$%'$ +$2, ,$',*$' + ˙ 2@ @$'+,- +,' 3*$0+2&ɧ ƼȱÖĘ42'0'%91$#$%&kl: ȕˤ˥:òyǵ{z˟ˠ:Iɐ|zʎØĴǦ®¯ǿJŌ D0,2&EôƘ #$%&:abæçljawxőÖ:łV[\Ƙ śB1#$%&)%*+,- :ȋȌŗI|{Ö Ū @$'+,-6B$+@GHſ}Ƙ ĵð¨ǙIŗÌ:abȱ ɭ9$%& 2@ɦȲ$3%B01$&2+#$%&Ȳ *1%''ɦȲ$3%B01$'3%B01$#$%&Ȳ @$'+,-6B$+@ɦȲ@$'+,-Ȳɮ 0912* *1%'' 3%B01$#$%& ɨ 0912* 2@ *1$%&0 ɨ @ 'B$ @$'+,*+2& , 12$ *1'2&E *&&$*+2& ɩ ɩ ʼnŗÌ:ſȐwȒȱ ɭ9$%& 2@ɦȲ$3%B01$&2+#$%&Ȳ *1%''ɦȲ$3%B01$'/&+$,3%B01$#$%&Ȳɮ 0912* *1%'' /&+$,3%B01$#$%& 2B01$B$&+' 42'0'%91$#$%& ɨ 0912* 2@ @$'+,- ɨ @ 'B$ @$'+,*+2& , ɩ ɩ ɤ˦zƭ®¯ǿJŌD0,2&EƘ ƗØ:¿ǢȱȆÁ0,++-0$ĭÜƷʚwx9$%&:ŹʍI9$%&:ghijǦəœĔƶ:ƢĨƘ ÖŪa bID0,2&EŤ\ú¾wx&&6'2&E1$+&0,++-0$ 9$%&:ǝxghijI ɐȆ|«¬qȼI|ß søŬŭŮyǵijµƿczȪʈƼ|mƘ ȆǙŐ&&6'2&E1$+&0,++-0$ 9$%&:ŹʍIĄäÁƭ D0,2&E:ʥʦʅ_}à&$áÞK?:ʧ®ʨƘ ©ƞqȼ:ƃĥghij[Ì:ȋɓɫŬŭ٨½ ¾Ƙ#$%&)%*+,-9$%&:ghijǦəȝ "< ǥ àghijklá wǥœĢɷɸ:ʌî ¦À WäÊå ¦À § %¨ª ^ŌÓÔm,E'0,2&E5,%B$,9$%&'5%*+,-#$%&)%*+,-/%,$kl:;I Ȇ|ß#$%&)%*+,-«¬ȼI| əƎœwxlj«¬|:#$%&)%*+,-:ʡƘ #$%&'( #$%&)%*+,-./0012*%+2&&+$3+ £$,'2&
Beans, Bean Factory FlApplicationContext public interface Bean FactoryAware Callback that supplies the owning factory to a bean instance. * < p>Invoked after population of normal bean properties but before an init s callback like InitializingBean s afterPropertiesSet or a custom init-me thod. 4 param beanFactory owning BeanFactory (may not be null) * The bean can immediately call methods on the factory. *throws BeansException in case of initialization errors * @see BeanInitializationException void setBean Factory( Bean Factory beanFactory) throws Beans Exception 这允许bean可以以编程的方式操控创建它们的 BeanFactory,既可以直接使用 org. springframework. beans. factory. BeanFactory接口,也可以将引用强制将类型转换为已知的子类型从而获 得更多的功能。这个特性主要用于编程式地取得其他bean。虽然在一些场景下这个功能是有用的,但 是一般来说它应该避免使用,因为它使代码与 Spring耦合在一起,而且也不遵循反向控制的风格(合 作者应当作属性提供给bean)。 3. 4. 2.2. Bean NameAware 如果一个bean实现了org. springframework. beans. factory. BeanName Aware接口,并且被部署到一个 BeanFactory中,那么 BeanFactory就会通过这个接口来调用bean,以便通知这个bean它被部署的id 这个回调发生在普通的bean属性设置之后,在初始化回调之前,比如 IInitializingBean的 afterPropertiesSet方法(或者自定义的init- method)。 3.4. 3. Factory Bean 接口org. springframework. beans. factory. Factory Bean一般由本身是工厂类的对象实现。 BeanFactory接口提 供了三个方法 0 bject getObject0:必须返回一个这个工厂类创建的对象实例。这个实例可以是共享的(取决于这个 工厂返回的是 singleton还是 prototype)。 boolean issingleton0:如果 Factory返回的对象是 singleton,返回true,否则返回 false Class getobjectType0:返回 IgetObject0方法返回的对象的类型,如果类型不是预先知道的,则返回 null 35.子bean定义 一个bean定义可能会包含大量的配置信息,包括容器相关的信息(比如初始化方法,静态工厂方法名 等等)以及构造函数参数和属性的值。一个子bean定义是一个能够从父bean定义继承配置数据的bean 定义。它可以覆盖一些值,或者添加一些其他需要的值。使用父和子的bean定义可以节省很多的输入 工作。实际上,这就是一种模版形式。 当以编程的方式使用一个 BeanFactory,子bean定义用 childBeanDefinition类表示。大多数的用户从来不 需要以这个方式使用它们,而是在类似Xm1 BeanFactory的 BeanFactory中以声明的方式配置bean定义 在一个Xm1 BeanFactory的bean定义中,使用 parent属性指出一个子bean定义,而父bean则作为这个属 性的值。 <bean id="inheritedTestBean class="org. springframework beans. TestBean> <property name="name ><value>parent</value></property <property name="age><value>1</value>/property> Version 1.1
0912* 2&+$,5%*$ #$%&)%*+,-/%,$ ɨ ˙˙ ˙ %119%* +%+ '0012$' +$ &2&E 5%*+,- + % 9$%& 2&'+%&*$ ˙ ɭ0ɮ&$@ %5+$, 001%+2& 5 &,B%1 9$%& 0,0$,+2$' 9+ 9$5,$ %& 2&2+ ˙ *%119%* 12$ &2+2%12ž2&E#$%&ƅ' %5+$,,0$,+2$'D$+ , % *'+B 2&2+6B$+@ ˙ ˣ0%,%B 9$%&)%*+,- &2&E #$%&)%*+,- B%- &+ 9$ &11 ˙ Ý$ 9$%& *%& 2BB$@2%+$1- *%11 B$+@' & +$ 5%*+,- ˙ ˣ+,' #$%&'3*$0+2& 2& *%'$ 5 2&2+2%12ž%+2& $,,,' ˙ ˣ'$$ #$%&&2+2%12ž%+2&3*$0+2& ˙ 2@ '$+#$%&)%*+,-#$%&)%*+,- 9$%&)%*+,- +,' #$%&'3*$0+2&ɧ ɩ ŷƵƶ9$%&äÁÁ³Í:[ÜÞ«¬|ǎ:#$%&)%*+,-I ˩äÁȍk ,E'0,2&E5,%B$,9$%&'5%*+,-#$%&)%*+,-klI ƔäÁǦʡȡǦ;ÆÇÈƣ×:p;Æ©yu vĢƫ:ƘŷxeHŅØŌ³ÍÜĴÀvÉÊ9$%&Ƙ ɢȩwŸŗŷx{œ:Iɤ {wɌ¨Ǚ|ªLjˤ˥ Iɐ| ®¯AD0,2&EǿJwŐI yǵƔzʉʾ:˪ɶòJ KLªȆKGH¿÷ø9$%&ôƘ ¦À § æ ª Ĥƙwx9$%&ÓÔm,E'0,2&E5,%B$,9$%&'5%*+,-#$%&Ā%B$/%,$klI ǟǵßƷʚŊwx #$%&)%*+,-IƞƟ#$%&)%*+,-ƠəÖŪŷxkl¨¤9$%&IÁÚÖ×ŷx9$%&|ßƷʚ:2@ Ƙ ŷx¦¤ gőÖ:9$%&GHSTqȼIȄȅĨ¦¤qIǬĤ&2+2%12ž2&E#$%&: %5+$,,0$,+2$'D$+[\òůLMab:2&2+6 B$+@ôƘ ¦À¦ %¨§ kl,E'0,2&E5,%B$,9$%&'5%*+,-)%*+,-#$%& wɌɫcʑ{;:^_ÓÔƘ#$%&)%*+,-kl¿ ÷mȞx[\ȱ ɱ 9ǒ$*+ E$+ 9ǒ$*+Ë ʎʏ¥¦wxŷx;«¬:^_ÓðƘŷxÓðäÁ{Ċʜ:òÀƦŌŷx ¥¦:{'2&E1$+&ă{0,++-0$ôƘ ɱ 91$%& 2'D2&E1$+&Ë Ĥƙ)%*+,-¥¦:^_{'2&E1$+&I¥¦+,$IFȘ¥¦5%1'$Ƙ ɱ 1%'' E$+ 9ǒ$*+Ý-0$Ë ¥¦E$+ 9ǒ$*+[\¥¦:^_:;ÆIĤƙ;Æz{˃Ʉ×ɣ:IȘ¥¦ &11Ƙ ¦Å ç ÙÚ wx9$%&abäəƂǞȏƚ:PTŃńIƂƨijµǸŋ:ŃńòǬĤȄȅĨ[\IɳŦ[\ȸ ʵʵôÁÂVWXYZY.GH:§Ƙwxp9$%&ab{wxȕ©ɉ9$%&abǔ˫PTY¶:9$%& abƘ |äÁˆˇwŸ§IůLĿwŸÉÊąØ:§Ƙ ɉ.p:9$%&abäÁǥʺǠƫ:ű! KƘÓǀŇIŷƠ{wĂĭŘɡÜƘ ȆÁ³Í:[Ü wx#$%&)%*+,-Ip9$%&ab21@#$%&4$52&2+2&;ňǢƘ ȏƫY:ŭ©¨z ąØÁŷx[Ü |ǎIy{;ʐśB1#$%&)%*+,-:#$%&)%*+,- Áþÿ:[ÜPT9$%&ab ƘwxśB1#$%&)%*+,-:9$%&abI 0%,$&+GHljŲwxp9$%&abIyɉ9$%&ȘKŷxG H:§Ƙ ɭ9$%& 2@ɦȲ2&$,2+$@Ý$'+#$%&Ȳ *1%''ɦȲ,E'0,2&E5,%B$,9$%&'Ý$'+#$%&Ȳɮ ɭ0,0$,+- &%B$ɦȲ&%B$Ȳɮɭ%1$ɮ0%,$&+ɭ%1$ɮɭ0,0$,+-ɮ ɭ0,0$,+- &%B$ɦȲ%E$Ȳɮɭ%1$ɮɭ%1$ɮɭ0,0$,+-ɮ #$%&'( #$%&)%*+,-./0012*%+2&&+$3+ £$,'2&