空间站

北极心空

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

BeanFactory&ApplicationContext--part1

3.1. 简介

在Spring中,两个最基本最重要的包是 org.springframework.beansorg.springframework.context. 这两个包中的代码为Spring的反向控制 特性(也叫作依赖注射)提供了基础。 BeanFactory提供了一种先进的配置机制来管理任何种类bean(对象),这种配置机制考虑到任何一种可能的存储方式。 ApplicationContext建立在BeanFactory之上,并增加了其他的功能,比如更容易同Spring AOP特性整合, 消息资源处理(用于国际化),事件传递,以声明的方式创建ApplicationContext, 可选的父上下文和与应用层相关的上下文(比如WebApplicationContext),以及其他方面的增强。

简而言之,BeanFactory提供了配置框架和基本的功能, 而 ApplicationContext为它增加了更强的功能,这些功能中的一些或许更加接近J2EE并且围绕企业级应用。一般来说,ApplicationContext是BeanFactory的完全超集, 任何BeanFactory功能和行为的描述也同样被认为适用于ApplicationContext

用户有时不能确定BeanFactory和ApplicationContext中哪一个在特定场合下更适合。 通常大部分在J2EE环境的应用中,最好选择使用ApplicationContext, 因为它不仅提供了BeanFactory所有的特性以及它自己附加的特性,而且还提供以声明的方式使用一些功能, 这通常是令人满意的。BeanFactory主要是在非常关注内存使用的情况下 (比如在一个每kb都要计算的applet中)使用,而且你也不需要用到ApplicationContext的所有特性。

这一章粗略地分为两部分,第一部分包括对BeanFactory和ApplicationContext都适用的一些基本原则。第二部分包括仅仅适用于ApplicationContext的一些特性

3.2. BeanFactory 和 BeanDefinitions - 基础

3.2.1. BeanFactory

BeanFactory实际上是实例化,配置和管理众多bean的容器。 这些bean通常会彼此合作,因而它们之间会产生依赖。 BeanFactory使用的配置数据可以反映这些依赖关系中 (一些依赖可能不像配置数据一样可见,而是在运行期作为bean之间程序交互的函数)。

一个BeanFactory可以用接口org.springframework.beans.factory.BeanFactory表示, 这个接口有多个实现。 最常使用的的简单的eanFactory实现是org.springframework.beans.factory.xml.XmlBeanFactory。 (这里提醒一下:ApplicationContext是BeanFactory的子类, 所以大多数的用户更喜欢使用ApplicationContext的XML形式)。

虽然大多数情况下,几乎所有被BeanFactory管理的用户代码都不需要知道BeanFactory, 但是BeanFactory还是以某种方式实例化。可以使用下面的代码实例化BeanFactory:

InputStream is = new FileInputStream("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);

或者

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

或者

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
// of course, an ApplicationContext is just a BeanFactory
BeanFactory factory = (BeanFactory) appContext;

很多情况下,用户代码不需要实例化BeanFactory, 因为Spring框架代码会做这件事。例如,web层提供支持代码,在J2EE web应用启动过程中自动载入一个Spring ApplicationContext。这个声明过程在这里描述:

编程操作BeanFactory将会在后面提到,下面部分将集中描述BeanFactory的配置.

一个最基本的BeanFactory配置由一个或多个它所管理的Bean定义组成。在一个XmlBeanFactory中,根节点beans中包含一个或多个bean元素。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean  >
...
</bean>
<bean  >
...
</bean>
...
</beans>

3.2.2. BeanDefinition

一个XmlBeanFactory中的Bean定义包括的内容有:

  • classname:这通常是bean的真正的实现类。但是如果一个bean使用一个静态工厂方法所创建而不是被普通的构造函数创建,那么这实际上就是工厂类的classname

  • bean行为配置元素:它声明这个bean在容器的行为方式(比如prototype或singleton,自动装配模式,依赖检查模式,初始化和析构方法)

  • 构造函数的参数和新创建bean需要的属性:举一个例子,一个管理连接池的bean使用的连接数目(即可以指定为一个属性,也可以作为一个构造函数参数),或者池的大小限制

  • 和这个bean工作相关的其他bean:比如它的合作者(同样可以作为属性或者构造函数的参数)。这个也被叫做依赖。

上面列出的概念直接转化为组成bean定义的一组元素。这些元素在下面的表格中列出,它们每一个都有更详细的说明的链接。

注意bean定义可以表示为真正的接口org.springframework.beans.factory.config.BeanDefinition以及它的各种子接口和实现。然而,绝大多数的用户代码不需要与BeanDefination直接接触。

3.2.3. bean的类

class属性通常是强制性的(参考第 3.2.3.3 节 “通过实例工厂方法创建bean”第 3.5 节 “子bean定义”),有两种用法。在绝大多数情况下,BeanFactory直接调用bean的构造函数来"new"一个bean(相当于调用new的Java代码),class属性指定了需要创建的bean的类。 在比较少的情况下,BeanFactory调用某个类的静态的工厂方法来创建bean, class属性指定了实际包含静态工厂方法的那个类。 (至于静态工厂方法返回的bean的类型是同一个类还是完全不同的另一个类,这并不重要)。

3.2.3.1. 通过构造函数创建beanbean /> <bean />

至于为构造函数提供(可选的)参数,以及对象实例创建后设置实例属性,将会在后面叙述

3.2.3.2. 通过静态工厂方法创建Bean

当你定义一个使用静态工厂方法创建的bean,同时使用class属性指定包含静态工厂方法的类,这个时候需要factory-method属性来指定工厂方法名。Spring调用这个方法(包含一组可选的参数)并返回一个有效的对象,之后这个对象就完全和构造方法创建的对象一样。用户可以使用这样的bean定义在遗留代码中调用静态工厂。

下面是一个bean定义的例子,声明这个bean要通过factory-method指定的方法创建。注意这个bean定义并没有指定返回对象的类型,只指定包含工厂方法的类。在这个例子中,createInstance 必须是static方法 .

<bean
factory-method="createInstance"/>

至于为工厂方法提供(可选的)参数,以及对象实例被工厂方法创建后设置实例属性,将会在后面叙述.

3.2.3.3. 通过实例工厂方法创建bean

使用一个实例工厂方法(非静态的)创建bean和使用静态工厂方法非常类似,调用一个已存在的bean(这个bean应该是工厂类型)的工厂方法来创建新的bean。

使用这种机制,class属性必须为空,而且factory-bean属性必须指定一个bean的名字,这个bean一定要在当前的bean工厂或者父bean工厂中,并包含工厂方法。 而工厂方法本身仍然要通过factory-method属性设置。

下面是一个例子:

<!-- The factory bean, which contains a method called
createInstance -->
<bean
>
...
</bean>
<!-- The bean to be created via the factory bean -->
<bean
factory-bean="myFactoryBean"
factory-method="createInstance"/>

虽然我们要在后面讨论设置bean的属性,但是这个方法意味着工厂bean本身能够被容器通过依赖注射来管理和配置

3.2.4. Bean的标志符 (idname)

每一个bean都有一个或多个id(也叫作标志符,或名字;这些名词说的是一回事)。这些id在管理bean的BeanFactory或ApplicationContext中必须是唯一的。 一个bean差不多总是只有一个id,但是如果一个bean有超过一个的id,那么另外的那些本质上可以认为是别名。

在一个XmlBeanFactory中(包括ApplicationContext的形式), 你可以用id或者name属性来指定bean的id(s),并且在这两个或其中一个属性中至少指定一个id。 id属性允许你指定一个id,并且它在XML DTD(定义文档)中作为一个真正的XML元素的ID属性被标记, 所以XML解析器能够在其他元素指回向它的时候做一些额外的校验。正因如此,用id属性指定bean的id是一个比较好的方式。 然而,XML规范严格限定了在XML ID中合法的字符。通常这并不是真正限制你, 但是如果你有必要使用这些字符(在ID中的非法字符),或者你想给bean增加其他的别名, 那么你可以通过name属性指定一个或多个id(用逗号,或者分号;分隔)。

3.2.5. Singleton的使用与否

Beans被定义为两种部署模式中的一种:singleton或non-singleton。 (后一种也别叫作prototype,尽管这个名词用的不精确因为它并不是非常适合)。 如果一个bean是singleton形态的,那么就只有一个共享的实例存在, 所有和这个bean定义的id符合的bean请求都会返回这个唯一的、特定的实例。

如果bean以non-singleton,prototype模式部署的话,对这个bean的每次请求都会创建一个新的bean实例。这对于例如每个user需要一个独立的user对象这样的情况是非常理想的。

Beans默认被部署为singleton模式,除非你指定。要记住把部署模式变为non-singletion(prototype)后,每一次对这个bean的请求都会导致一个新创建的bean,而这可能并不是你真正想要的。所以仅仅在绝对需要的时候才把模式改成prototype。

在下面这个例子中,两个bean一个被定义为singleton,而另一个被定义为non-singleton(prototype)。客户端每次向BeanFactory请求都会创建新的exampleBean,而AnotherExample仅仅被创建一次;在每次对它请求都会返回这个实例的引用。

<bean
singleton="false"/>
<bean
singleton="true"/>

注意:当部署一个bean为prototype模式,这个bean的生命周期就会有稍许改变。 通过定义,Spring无法管理一个non-singleton/prototype bean的整个生命周期, 因为当它创建之后,它被交给客户端而且容器根本不再跟踪它了。当说起non-singleton/prototype bean的时候, 你可以把Spring的角色想象成“new”操作符的替代品。从那之后的任何生命周期方面的事情都由客户端来处理 。BeanFactory中bean的生命周期将会在 第 3.4.1 节 “生命周期接口”一节中有更详细的叙述。

3.3. 属性,合作者,自动装配和依赖检查

3.3.1. 设置bean的属性和合作者

反向控制通常与依赖注入同时提及。基本的规则是bean通过以下方式来定义它们的依赖(比如它们与之合作的其他对象):构造函数的参数,工厂方法的参数;当对象实例被构造出来或从一个工厂方法返回后设置在这个实例上的属性。容器的工作就是创建完bean之后,真正地注入这些依赖。这完全是和一般控制方式相反的(因此称为反向控制),比如bean实例化,或者直接使用构造函数定位依赖关系,或者类似Service Locator模式的东西。我们不会详细阐述依赖注射的优点,很显然通过使用它:代码变得非常清晰;当bean不再自己查找他们依赖的类而是由容器提供,甚至不需要知道这些类在哪里以及它们实际上是什么类型,这时高层次的解耦也变得很容易了。

正如上面提到的那样,反向控制/依赖注射存在两种主要的形式:

  • 基于setter的依赖注射,是在调用无参的构造函数或无参的静态工厂方法实例化你的bean之后, 通过调用你的bean上的setter方法实现的。 在BeanFactory中定义的使用基于setter方法的注射依赖的bean是真正的JavaBean。 Spring一般提倡使用基于setter方法的依赖注射,因为很多的构造函数参数将会是笨重的, 尤其在有些属性是可选的情况下。

  • 基于构造函数的依赖注射,它是通过调用带有许多参数的构造方法实现的, 每个参数表示一个合作者或者属性。 另外,调用带有特定参数的静态工厂方法来构造bean可以被认为差不多等同的, 接下来的文字会把构造函数的参数看成和静态工厂方法的参数类似。 虽然Spring一般提倡在大多数情况下使用基于setter的依赖注射, 但是Spring还是完全支持基于构造函数的依赖注射, 因为你可能想要在那些只提供多参数构造函数并且没有setter方法的遗留的bean上使用Spring。 另外对于一些比较简单的bean,一些人更喜欢使用构造函数方法以确保bean不会处于错误的状态。

BeanFactory同时支持这两种方式将依赖注射到被管理bean中。(实际上它还支持在一些依赖已经通过构造函数方法注射后再使用setter方法注射依赖)。依赖的配置是以BeanDefinition的形式出现,它和JavaBeans的PropertyEditors一起使用从而知道如何把属性从一个格式转变为另一个。真正传送的值被封装为PropertyValue对象。然而,大多数Spring的使用者并不要直接(比如编程的方式)处理这些类,而更多地使用一个XML定义文件,这个文件会在内部被转变为这些类的实例,用来读取整个BeanFactory或ApplicationContext。

Bean依赖的决定通常取决于下面这些内容:

  1. BeanFactory通过使用一个描述所有bean的配置被创建和实例化。大多数的Spring用户使用一个支持XML格式配置文件的BeanFactory或ApplicationContext实现。

  2. 每一个bean的依赖表现为属性,构造函数参数,或者当用静态工厂方法代替普通构造函数时工厂方法的参数。这些依赖将会在bean真正被创建出来后提供给bean。

  3. 每一个属性或者构造函数参数要么是一个要被设置的值的定义,要么是一个指向BeanFactory中其他bean的引用。在ApplicationContext的情况下,这个引用可以指向一个父亲ApplicationContext中bean。

  4. 每一个属性或构造函数参数的值,必须能够从(配置文件中)被指定的格式转变为真实类型。缺省情况下,Spring能够把一个字符串格式的值转变为所有内建的类型,比如int, longString, boolean等等。另外当说到基于XML的BeanFactory实现的时候(包括ApplicationContext实现),它们已经为定义Lists, Maps, Sets和Properties集合类型提供了内在的支持。另外,Spring通过使用JavaBeans的 PropertyEditor定义,能够将字符串值转变为其他任意的类型。(你可以为PropertyEditor提供你自己的PropertyEditor定义从而能够转变你自定义的类型;更多关于PropertyEditors的信息以及如何手工增加自定义的PropertyEditors请参看第 3.9 节bean > <property ><ref bean="anotherExampleBean"/></property> <property ><ref bean="yetAnotherBean"/></property> <property ><value>1</value></property> </bean> <bean /> <bean />

    
        
        

     

     

    public class ExampleBean {
        private AnotherBean beanOne;
        private YetAnotherBean beanTwo;
        private int i;
        public void setBeanOne(AnotherBean beanOne) {
        this.beanOne = beanOne;
        }
        public void setBeanTwo(YetAnotherBean beanTwo) {
        this.beanTwo = beanTwo;
        }
        public void setIntegerProperty(int i) {
        this.i = i;
        }
        }

    正如你所看到的一样,setter方法被声明以符合XML文件中指定的属性。(XML文件中的属性,直接对应着RootBeanDefinition中的PropertyValues对象)

    接着是一个使用IoC type3(基于构造函数的依赖注射)的BeanFactory。下面是XML配置中的一段,指定了构造函数参数以及展示构造函数的代码:

    <bean  >
        <constructor-arg><ref bean="anotherExampleBean"/></constructor-arg>
        <constructor-arg><ref bean="yetAnotherBean"/></constructor-arg>
        <constructor-arg><value>1</value></constructor-arg>
        </bean>
        <bean  />
        <bean  />

     

    public class ExampleBean {
        private AnotherBean beanOne;
        private YetAnotherBean beanTwo;
        private int i;
        public ExampleBean(AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {
        this.beanOne = anotherBean;
        this.beanTwo = yetAnotherBean;
        this.i = i;bean
        factory-method="createInstance">
        <constructor-arg><ref bean="anotherExampleBean"/></constructor-arg>
        <constructor-arg><ref bean="yetAnotherBean"/></constructor-arg>
        <constructor-arg><value>1</value></constructor-arg>
        </bean>
        <bean  />
        <bean  />

     

    public class ExampleBean {
        ...
        // a private constructor
        private ExampleBean(...) {
        ...
        }
        // a static factory method
        // the arguments to this method can be considered the dependencies of the bean that
        // is returned, regardless of how those arguments are actually used.
        public static ExampleBean ExampleBean(AnotherBean anotherBean,
        YetAnotherBean yetAnotherBean, int i) {
        ExampleBean eb = new ExampleBean(...);
        // some other operations
        ...
        return eb;
        }
        }

    需要注意的是:静态工厂方法的参数由 constructor-arg元素提供,这和构造函数的用法是一样的。这些参数是可选的。重要的一点是工厂方法所返回的对象类型不一定和包含这个静态工厂方法的类一致,虽然上面这个例子中是一样的。前面所提到的实例工厂方法(non-static)用法基本上是一样的(除了使用factory-bean属性代替class属性),在这里就不再详细叙述了。 .

3.3.2. 深入Bean属性和构造函数参数

正如前面提到的那样,bean的属性和构造函数参数可以被定义为其他bean的引用(合作者),或者内联定义的值。为了达到这个目的,XmlBeanFactory在property和constructor-arg元素中支持许多子元素类型。

value元素用适合人读的字符串形式指定属性或构造函数参数。正如前面提到的那样,JavaBeans的PropertyEditors被用来将这些字符串从java.lang.String类型转变为真实的属性类型或参数类型。

<beans>
<bean   destroy-method="close">
<!-- results in a setDriverClassName(String) call -->
<property >
<value>com.mysql.jdbc.Driver</value>
</property>
<property >
<value>jdbc:mysql://localhost:3306/mydb</value>
</property>
<property >
<value>root</value>
</property>
</bean>
</beans>bean >
<property ><value></value></property>
</bean>        

导致email属性被设置为””,同java代码:exampleBean.setEmail("")等价。而专门的<null>元素则可以用来指定一个null值,所以

<bean >
<property ><null/></property>
</bean>        

同代码:exampleBean.setEmail(null)是等价的.

list, set, map, 以及 props 元素可以用来定义和设置类型 为Java的List,Set, Map, 和 Properties .

<beans>
...
<bean  >
<!-- results in a setPeople(java.util.Properties) call -->
<property >
<props>
<prop key="HarryPotter">The magic property</prop>
<prop key="JerrySeinfeld">The funny property</prop>
</props>
</property>
<!-- results in a setSomeList(java.util.List) call -->
<property >
<list>
<value>a list element followed by a reference</value>
<ref bean="myDataSource"/>
</list>
</property>
<!-- results in a setSomeMap(java.util.Map) call -->
<property >
<map>
<entry key="yup an entry">
<value>just some string</value>
</entry>
<entry key="yup a ref">
<ref bean="myDataSource"/>
</entry>
</map>
</property>
<!-- results in a setSomeSet(java.util.Set) call -->
<property >
<set>
<value>just some string</value>
<ref bean="myDataSource"/>
</set>
</property>
</bean>
</beans>

注意:Map的entry或set的value,它们的值又可以是下面元素中的任何一个:

(bean | ref | idref | list | set | map | props | value | null)

property 元素中定义的bean元素用来定义一个内联的bean,而不是引用BeanFactory其他地方定义的bean。内联bean定义不需要任何id定义

<bean  >
<!-- Instead of using a reference to target, just use an inner bean -->
<property >
<bean >
<property ><value>Tony</value></property>
<property ><value>51</value></property>
</bean>
</property>
</bean>

idref元素完全是一种简写和防止错误的方式,用来设置属性值为容器中其他bean的idname

<bean  >
</bean>
<bean  >
<property >
<idref bean="theTargetBean"/>
</property>
</bean>
bean > </bean> <bean > <property > <value>theTargetBean</value> </property> </bean>

第一种形式比第二种形式更好的原因是:使用idref标记将会使Spring在部署的时候就验证其他的bean是否真正存在;在第二种形式中,targetName属性的类仅仅在Spring实例化这个类的时候做它自己的验证,这很可能在容器真正部署完很久之后。

另外,如果被引用的bean在同一个xml文件中而且bean的名称是bean的 id,那么就可以使用local属性。它会让XML解析器更早,在XML文档解析的时候,验证bean的名称。

    <property >
<idref local="theTargetBean"/>
</property>

ref元素是最后一个能在property元素中使用的元素。它是用来设置属性值引用容器管理的其他bean(可以叫做合作者)。正如前一节提到的,拥有这些属性的bean依赖被引用的bean,被引用的bean将会在属性设置前,必要的时候需要时初始化(如果是一个singleton bean可能已经被容器初始化)。所有的引用根本上是一个指向其他对象的引用,不过有3种形式指定被引用对象的id/name,这3种不同形式决定作用域和如何处理验证。

ref元素的bean属性指定目标bean是最常见的形式,它允许指向的bean可以在同一个BeanFactory/ApplicationContext(无论是否在同一个XML文件中)中,也可以在父BeanFactory/ApplicationContext中。bean属性的值可以同目标bean的id属性相同,也可以同目标bean的name属性中任何一个值相同。

    <ref bean="someBean"/>

local属性指定目标bean可以利用XML解析器的能力在同一个文件中验证XML id引用。local属性的值必须与目标bean的id属性一致。如果在同一个文件中没有匹配的元素,XML解析器将会产生一个错误。因此,如果目标bean在同一个XML文件中,那么使用local形式将是最好的选择(为了能够尽可能早的发现错误)。

    <ref local="someBean"/>

parent属性指定目标bean允许引用当前BeanFactory(ApplicationContext)的父BeanFactory(ApplicationContext)中的bean。parent属性的值可以同目标bean的id属性相同,也可以同目标bean的name属性中的一个值相同,而且目标bean必须在当前BeanFactory(ApplicationContext)的父BeanFactory(ApplicationContext)中。当需要用某种proxy包装一个父上下文中存在的bean(可能和父上下文中的有同样的name),所以需要原始的对象用来包装它。

    <ref parent="someBean"/>

3.3.3. 方法注入

对于大部分的用户来说,容器中多数的bean是singleton的。当一个singleton的bean需要同另一个singleton的 bean合作(使用)时,或者一个非singleton的bean需要同另一个非singleton的bean合作的时候,通过定义一个bean为另一个bean的属性来处理这种依赖的关系就足够了。然而当bean的生命周期不同的时候就有一个问题。想想一下一个singleton bean A,或许在每次方法调用的时候都需要使用一个non-singleton bean B。容器仅仅会创建这个singleton bean A一次,因此仅仅有一次的机会去设置它的属性。因此容器没有机会每次去为bean A提供新的bean B的实例。

一个解决这个问题的方法是放弃一些反向控制。Bean A可以通过实现 BeanFactoryAware知道容器的存在(参见这里)),使用编程的手段(参见这里)在需要的时候通过调用getBean("B")来向容器请求新的bean B实例。 因为bean的代码知道Spring并且耦合于Spring,所以这通常不是一个好的方案。

方法注入,BeanFactory的高级特性之一,可以以清洁的方式处理这种情况以及其他一些情况。

3.3.3.1. Lookup方法注入


如果方法不是抽象的,Spring就会直接重写已有的实现。在XmlBeanFactory的情况下,你可以使用bean定义中的lookup-method 属性来指示Spring去注入/重写这个方法,以便从容器返回一个特定的bean。举个例子说明:

<!-- a stateful bean deployed as a protype (non-singleton) -->
<bean  singleton="false">
</bean>
<!-- myBean uses singleShotHelper -->
<bean  >
<lookup-method
bean="singleShotHelper"/>
<property>
...
</property>
</bean>

myBean需要一个新的singleShotHelper的实例的时候, 它就会调用它自己的createSingleShotHelper 方法。 值得注意的是:部署beans的人员必须小心地将singleShotHelper作为一个non-singleton部署 (如果确实需要这么做)。如果它作为一个singleton(除非明确说明,否则缺省就是singletion)而部署, 同一个singleShotHelper实例将会每次被返回。

注意Lookup方法注射能够同构造函数注射结合(对创建的bean提供可选的构造函数参数), 也可以同setter方法注射结合(在创建的bean之上设置属性)。

3.3.3.2. 任意方法的替换

另一种方法注射没有lookup方法注入用的多,它用另一个方法实现替换被管理bean的任意一个方法。用户可以放心跳过这一节(这是个有点高级的特性),除非这个功能确实需要。

在一个XmlBeanFactory中,对于一个被部署的bean, replaced-method元素可以用来把已存在的方法实现替换为其他的实现。 考虑如下的类,有一个我们想要重写的computeValue方法:

...
public class MyValueCalculator {
public String computeValue(String input) {
... some real code
}
... some other methods
}

需要为新方法定义提供实现 org.springframework.beans.factory.support.MethodReplacer接口的类。

/** meant to be used to override the existing computeValue
implementation in MyValueCalculator */
public class ReplacementComputeValue implements MethodReplacer {
public Object reimplement(Object o, Method m, Object[] args) throws Throwable {
// get the input value, work with it, and return a computed result
String input = (String) args[0];
...
return ...;bean >
<!-- arbitrary method replacement -->
<replaced-method  replacer="replacementComputeValue">
<arg-type>String</arg-type>
</replaced-method>
</bean>
<bean  >
</bean>

replaced-method元素中的一个或多个arg-type 元素用来表示,这个被重载方法的方法签名。注意,参数的签名只有在方法被重载并且该方法有多个不同的形式的时候才真正需要。为了方便,参数的类型字符串可以使全限定名的子字符串。比如,以下的都匹配 java.lang.String

    java.lang.String
String
Str

因为参数的个数通常就足够区别不同的可能,所以仅仅使用匹配参数的最短的字符串能够节省很多键入工作。

3.3.4. 使用bean depends-on="manager"> <property ><ref local="manager"/></property> </bean> <bean />

posted on 2008-07-17 10:33 芦苇 阅读(291) 评论(0)  编辑  收藏 所属分类: Spring

只有注册用户登录后才能发表评论。


网站导航: