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
阿成 閱讀(297)
評論(0) 編輯 收藏 所屬分類:
Spring