Spring使用BeanFactory模式来管理Bean,但Spring中提到的Bean不是标准的意义上的JavaBean(仅包含一个默认的构造函数,在属性后面定义相对应的setter和getter方法),而是任何你想让它管理的类,比如连接池、甚至BeanFactory本身。
一)Bean的设计常用下面几种模式
1、标准Bean:
使用默认的构造函数和基于setter、getter方法的依赖注射
Bean类代码:
java代码:
|
public
class ExampleBean { private BeanOne beanOne; private BeanTwo beanTwo; privateint count; publicvoid setBeanOne(BeanOne beanOne){ this.beanOne = beanOne; } publicvoid setBeanTwo(BeanTwo beanTwo){ this.beanTwo = beanTwo; } publicvoid setCount(int count){ this.count = count; } }
|
在配置文件中定义:
java代码:
|
<bean id="exampleBean" class="examples.ExampleBean"> <property name="beanOne"><ref bean="bean1"/></property> <property name="beanTwo"><ref bean="bean2"/></property> <property name="count"><value>1</value></property> </bean>
<bean id="bean1" class="examples.BeanOne"/> <bean id="bean2" class="examples.BeanTwo"/>
|
2、构造函数模式
自定义的构造函数,基于构造函数参数的依赖注射
Bean类代码:
java代码:
|
public
class ExampleBean { private BeanOne beanOne; private BeanTwo beanTwo; privateint count; public ExampleBean(BeanOne beanOne, BeanTwo beanTwo, int count){ this.beanOne = beanOne; this.beanTwo = beanTwo; this.count = count; } }
|
在配置文件中定义:
java代码:
|
<bean id="exampleBean" class="examples.ExampleBean"> <constructor-arg><ref bean="bean1"/></constructor-arg> <constructor-arg><ref bean="bean2"/></constructor-arg> <constructor-arg><value>1</value></constructor-arg> </bean>
<bean id="bean1" class="examples.BeanOne"/> <bean id="bean2" class="examples.BeanTwo"/>
|
3、静态工厂方法模式
静态工厂方法必须是static的,基于方法参数的依赖注射。
Bean类代码:
java代码:
|
public
class ExampleBean { private BeanOne beanOne; private BeanTwo beanTwo; privateint count; //构造函数私有 private ExampleBean(BeanOne beanOne, BeanTwo beanTwo, int count){ this.beanOne = beanOne; this.beanTwo = beanTwo; this.count = count; } //对外提供静态的方法 publicstatic ExampleBean createInstance(BeanOne beanOne, BeanTwo beanTwo, int count){ ExampleBean eb = new ExampleBean(beanOne,beanTwo,count); return eb; } }
|
在配置文件中定义:
java代码:
|
<bean id="exampleBean" class="examples.ExampleBean" factory-method="createInstance"> <constructor-arg><ref bean="bean1"/></constructor-arg> <constructor-arg><ref bean="bean2"/></constructor-arg> <constructor-arg><value>1</value></constructor-arg> </bean>
<bean id="bean1" class="examples.BeanOne"/> <bean id="bean2" class="examples.BeanTwo"/>
|
3、实例工厂方法模式
调用一个已存在的bean(这个bean应该是工厂类型)的工厂方法来创建新的bean,基于方法参数的依赖注射
该模式没有Bean类;
在配置文件中定义:
java代码:
|
<bean id="exampleBean" factory-bean="myFactoryBean" factory-method="createInstance"/>
<bean id="myFactoryBean" class="examples.ExampleBean" factory-method="createInstance"> <constructor-arg><ref bean="bean1"/></constructor-arg> <constructor-arg><ref bean="bean2"/></constructor-arg> <constructor-arg><value>1</value></constructor-arg> </bean>
<bean id="bean1" class="examples.BeanOne"/> <bean id="bean2" class="examples.BeanTwo"/>
|
二)Bean其它参数的配置
一个常用Bean的配置参数和解释
<bean id="" ——标志符,用它引用唯一的Bean
class="" ——该Bean对应的类,前面说到实例工厂方法模式创建的Bean没有类
singleton="" ——值为true或false,标识该Bean是否为单实例模式?如果为false则对这个bean
的每次请求都会创建一个新的bean实例
init-method="" ——向应用层返回引用前执行的初始化方法
destroy-method="" ——该Bean的销毁方法
depends-on=""> ——在Bean加载前,首先加载的指定资源
....
</bean>
三)property(或constructor-arg元素)的配置
1、用字符串形式指定常见类型的属性或参数的value值,JavaBean的PropertyEditor负责类型转化如:
java代码:
|
<property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/mydb</value> </property>
|
2、注意null和""(空串)的区别,如:
java代码:
|
<property name="email"><value></value></property> <property name="email"><null/></property>
|
3、list、set、map、以及 props 元素用来定义和设置Java对应类型List、Set、Map、和 Properties ,如:
java代码:
|
<property name="school"> <props> <prop key="school01">The xi'an technology university</prop> <prop key="school02">The BeiJing university</prop> </props> </property>
<property name="someList"> <list> <value>a list element followed by a reference</value> <ref bean="myDataSource"/> </list> </property>
<property name="someMap"> <map> <entry key="001"> <value>just some string</value> </entry> <entry key="yup a ref"> <ref bean="myDataSource"/> </entry> </map> </property> <property name="someSet"> <set> <value>just some string</value> <ref bean="myDataSource"/> </set> </property>
|
4、内部Bean和ref元素引用容器管理的其他bean
一个内部Bean的例子:
java代码:
|
<bean id="dep" class="com.bean.Conpany"> <property name="manager"> <bean class="com.bean.Person"> <property name="name"><value>Tony</value></property> <property name="age"><value>51</value></property> </bean> </property> </bean>
|
ref元素引用的例子:
java代码:
|
<bean id="person_manger" class="com.bean.Person"> <property name="name"><value>Tony</value></property> <property name="age"><value>51</value></property> </bean>
<bean id="dep" class="com.bean.Conpany"> <property name="manager"> <idref bean="person_manager"/> </property> </bean>
|
注:元素引用可以是下面三种权限:
1)<idref bean="person_manager"/>
引用的Bean可以在同一个BeanFactory/ApplicationContext(无论是否在同一个XML文件中)中,也可以在父BeanFactory/ApplicationContext中
2)<idref local="person_manager"/>
引用的bean在同一个XML文件中
3)<idref parent="person_manager"/>
引用的bean必须在当前BeanFactory(ApplicationContext)的父BeanFactory(ApplicationContext)中.
时间: 2006-3-23 12:58:26 标题: Spring学习笔记(二)Bean | |
|
Spring使用BeanFactory模式来管理Bean,但Spring中提到的Bean不是标准的意义上的JavaBean(仅包含一个默认的构造函数,在属性后面定义相对应的setter和getter方法),而是任何你想让它管理的类,比如连接池、甚至BeanFactory本身。
一)Bean的设计常用下面几种模式
1、标准Bean:
使用默认的构造函数和基于setter、getter方法的依赖注射
Bean类代码:
java代码: | publicclass ExampleBean { private BeanOne beanOne; private BeanTwo beanTwo; privateint count; publicvoid setBeanOne(BeanOne beanOne){ this.beanOne = beanOne; } publicvoid setBeanTwo(BeanTwo beanTwo){ this.beanTwo = beanTwo; } publicvoid setCount(int count){ this.count = count; } }
|
在配置文件中定义:
java代码: | <bean id="exampleBean" class="examples.ExampleBean"> <property name="beanOne"><ref bean="bean1"/></property> <property name="beanTwo"><ref bean="bean2"/></property> <property name="count"><value>1</value></property> </bean>
<bean id="bean1" class="examples.BeanOne"/> <bean id="bean2" class="examples.BeanTwo"/>
|
2、构造函数模式
自定义的构造函数,基于构造函数参数的依赖注射
Bean类代码:
java代码: | publicclass ExampleBean { private BeanOne beanOne; private BeanTwo beanTwo; privateint count; public ExampleBean(BeanOne beanOne, BeanTwo beanTwo, int count){ this.beanOne = beanOne; this.beanTwo = beanTwo; this.count = count; } }
|
在配置文件中定义:
java代码: |
<bean id="exampleBean" class="examples.ExampleBean"> <constructor-arg><ref bean="bean1"/></constructor-arg> <constructor-arg><ref bean="bean2"/></constructor-arg> <constructor-arg><value>1</value></constructor-arg> </bean>
<bean id="bean1" class="examples.BeanOne"/> <bean id="bean2" class="examples.BeanTwo"/>
|
3、静态工厂方法模式
静态工厂方法必须是static的,基于方法参数的依赖注射。
Bean类代码:
java代码: | publicclass ExampleBean { private BeanOne beanOne; private BeanTwo beanTwo; privateint count; //构造函数私有 private ExampleBean(BeanOne beanOne, BeanTwo beanTwo, int count){ this.beanOne = beanOne; this.beanTwo = beanTwo; this.count = count; } //对外提供静态的方法 publicstatic ExampleBean createInstance(BeanOne beanOne, BeanTwo beanTwo, int count){ ExampleBean eb = new ExampleBean(beanOne,beanTwo,count); return eb; } }
|
在配置文件中定义:
java代码: | <bean id="exampleBean" class="examples.ExampleBean" factory-method="createInstance"> <constructor-arg><ref bean="bean1"/></constructor-arg> <constructor-arg><ref bean="bean2"/></constructor-arg> <constructor-arg><value>1</value></constructor-arg> </bean>
<bean id="bean1" class="examples.BeanOne"/> <bean id="bean2" class="examples.BeanTwo"/>
|
3、实例工厂方法模式
调用一个已存在的bean(这个bean应该是工厂类型)的工厂方法来创建新的bean,基于方法参数的依赖注射
该模式没有Bean类;
在配置文件中定义:
java代码: | <bean id="exampleBean" factory-bean="myFactoryBean" factory-method="createInstance"/>
<bean id="myFactoryBean" class="examples.ExampleBean" factory-method="createInstance"> <constructor-arg><ref bean="bean1"/></constructor-arg> <constructor-arg><ref bean="bean2"/></constructor-arg> <constructor-arg><value>1</value></constructor-arg> </bean>
<bean id="bean1" class="examples.BeanOne"/> <bean id="bean2" class="examples.BeanTwo"/>
|
二)Bean其它参数的配置
一个常用Bean的配置参数和解释
<bean id="" ——标志符,用它引用唯一的Bean class="" ——该Bean对应的类,前面说到实例工厂方法模式创建的Bean没有类 singleton="" ——值为true或false,标识该Bean是否为单实例模式?如果为false则对这个bean 的每次请求都会创建一个新的bean实例 init-method="" ——向应用层返回引用前执行的初始化方法 destroy-method="" ——该Bean的销毁方法 depends-on=""> ——在Bean加载前,首先加载的指定资源 .... </bean>
三)property(或constructor-arg元素)的配置
1、用字符串形式指定常见类型的属性或参数的value值,JavaBean的PropertyEditor负责类型转化如:
java代码: | <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/mydb</value> </property>
|
2、注意null和""(空串)的区别,如:
java代码: |
<property name="email"><value></value></property> <property name="email"><null/></property>
|
3、list、set、map、以及 props 元素用来定义和设置Java对应类型List、Set、Map、和 Properties ,如:
java代码: |
<property name="school"> <props> <prop key="school01">The xi'an technology university</prop> <prop key="school02">The BeiJing university</prop> </props> </property>
<property name="someList"> <list> <value>a list element followed by a reference</value> <ref bean="myDataSource"/> </list> </property>
<property name="someMap"> <map> <entry key="001"> <value>just some string</value> </entry> <entry key="yup a ref"> <ref bean="myDataSource"/> </entry> </map> </property> <property name="someSet"> <set> <value>just some string</value> <ref bean="myDataSource"/> </set> </property>
|
|
4、内部Bean和ref元素引用容器管理的其他bean
一个内部Bean的例子:
java代码:
|
<bean id="dep" class="com.bean.Conpany"> <property name="manager"> <bean class="com.bean.Person"> <property name="name"><value>Tony</value></property> <property name="age"><value>51</value></property> </bean> </property> </bean>
|
ref元素引用的例子:
java代码:
|
<bean id="person_manger" class="com.bean.Person"> <property name="name"><value>Tony</value></property> <property name="age"><value>51</value></property> </bean>
<bean id="dep" class="com.bean.Conpany"> <property name="manager"> <idref bean="person_manager"/> </property> </bean>
|
注:元素引用可以是下面三种权限:
1)<idref bean="person_manager"/>
引用的Bean可以在同一个BeanFactory/ApplicationContext(无论是否在同一个XML文件中)中,也可以在父BeanFactory/ApplicationContext中
2)<idref local="person_manager"/>
引用的bean在同一个XML文件中
3)<idref parent="person_manager"/>
引用的bean必须在当前BeanFactory(ApplicationContext)的父BeanFactory(ApplicationContext)中
引用注明出处:http://spaces.msn.com/pococoon/blog/cns!D25B6032F7AD1992!193.entry
posted on 2006-03-23 13:42
阿成 阅读(289)
评论(0) 编辑 收藏 所属分类:
Spring