您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)怎么在Spring框架中創(chuàng)建一個Bean,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
常用的從容器中獲取bean實(shí)例使用這樣的方式:
@Test public void test() { Persion p = (Persion) ioc.getBean("p1"); System.out.println(p); }
常用的在容器中配置組件使用這樣的方式:
<bean id="p1" class="com.gql.bean.Persion"> <property name="name" value="張三"></property> <property name="age" value="18"></property> <property name="email" value="zs@163.com"></property> <property name="gender" value="男"></property> </bean>
下面的實(shí)驗(yàn)介紹一些Spring容器中注冊組件對象的其他方法。
實(shí)驗(yàn)1:根據(jù)bean的類型從ioc容器中獲取實(shí)例
@Test public void test01() { Persion p = ioc.getBean(Persion.class); System.out.println(p); }
這種方法查找的好處是不需要類型轉(zhuǎn)換,但是如果ioc容器中要找的bean有多個,使用這種方法查找就會報錯??梢愿挠孟旅娴姆绞剑?/p>
@Test public void test01() { Persion p = ioc.getBean("p1", Persion.class); System.out.println(p); }
實(shí)驗(yàn)2:通過有參構(gòu)造器為bean的屬性賦值
需要提前在bean中添加有參構(gòu)造器,才能進(jìn)行下面的測試。
<bean id="p2" class="com.gql.bean.Persion"> <constructor-arg name="name" value="李四"></constructor-arg> <constructor-arg name="age" value="22"></constructor-arg> <constructor-arg name="email" value="ls@163.com"></constructor-arg> <constructor-arg name="gender" value="男"></constructor-arg> </bean>
使用這種有參構(gòu)造器為bean的屬性賦值,可以省略name,但是value的順序必須與bean中的順序一致。(若再使用index和type進(jìn)行索引,可以不按順序)
通過名稱空間為bean賦值:
添加p命名空間標(biāo)簽頭:xmlns:p=“http://www.springframework.org/schema/p”
<bean id="p4" class="com.gql.bean.Persion" p:name="小王" p:age="22" p:gender="男" p:email="wang@163.com"></bean>
實(shí)驗(yàn)3:為各種屬性賦值
引用類型、集合類型、級聯(lián)類型。
如題,給出一個賦值的Bean對象,為其在容器中注冊。此時所有復(fù)雜的賦值都在property標(biāo)簽體內(nèi)。
public class Persion { private String name; private String gender; private Integer age; private String email; private Car car; private List<Book> book; private Map<String, Object> maps; private Properties properties; //省略setter與getter方法 }
普通屬性賦值:
<!-- 普通屬性賦值 --> <property name="name" value="張三"></property> <property name="gender" value="男"></property> <property name="age" value="20"></property> <property name="email"> <null /> </property>
引用類型賦值:
<bean id="p1" class="com.gql.bean.Persion"> <!-- 引用外部bean --> <!-- <property name="car" ref="c1"></property> --> <!-- 引用內(nèi)部bean(內(nèi)部bean不能被獲取到) --> <property name="car"> <bean class="com.gql.bean.Car"> <property name="carName" value="自行車"></property> <property name="color" value="黑色"></property> <property name="price" value="400"></property> </bean> </property> </bean> <bean id="c1" class="com.gql.bean.Car"> <property name="carName" value="寶馬"></property> <property name="color" value="白色"></property> <property name="price" value="30000"></property> </bean>
集合類型賦值:
list
<bean id="p1" class="com.gql.bean.Persion"> <property name="book"> <list> <bean class="com.gql.bean.Book" p:bookName="西游記" p:author="吳承恩"></bean> <ref bean="book01" /> </list> </property> </bean> <bean id="book01" class="com.gql.bean.Book"> <property name="bookName" value="水滸傳"></property> <property name="author" value="施耐庵"></property> </bean>
map
<property name="maps"> <map> <entry key="k01" value="v01"></entry> <entry key="k02" value="v02"></entry> <entry key="k03" value-ref="book01"></entry> <entry key="k04"> <bean class="com.gql.bean.Car"> <property name="carName" value="捷豹"></property> <property name="color" value="紅色"></property> <property name="price" value="50000"></property> </bean> </entry> </map> </property>
properties
<property name="properties"> <props> <prop key="username">root</prop> <prop key="password">123456</prop> </props> </property>
實(shí)驗(yàn)4:通過繼承實(shí)現(xiàn)bean配置信息的重用
下面的代碼中p4繼承了p3,需要改動的屬性在property標(biāo)簽中修改即可,其余的全部原樣繼承。
<bean id="p3" class="com.gql.bean.Persion"> <property name="name" value="張三"></property> <property name="age" value="20"></property> <property name="gender" value="男"></property> <property name="email" value="zs@163.com"></property> </bean> <bean id="p4" parent="p3"> <property name="name" value="李四"></property> </bean>
實(shí)驗(yàn)5:單實(shí)例singleton和多實(shí)例prototype
單實(shí)例singleton | 多實(shí)例prototype |
---|---|
①容器啟動時 創(chuàng)建好對象并保存在容器中 | ①獲取Bean時 才會創(chuàng)建這個對象 |
②調(diào)用初始化方法 | ②調(diào)用初始化方法 |
③容器關(guān)閉時調(diào)用銷毀方法 | ③容器銷毀時不調(diào)用銷毀方法 |
任何時間獲取都是獲取之前創(chuàng)建好的那個對象 | 每次獲取都會創(chuàng)建一個新的對象 |
詳情可參照博客:通過工廠創(chuàng)建Bean的三種方式
實(shí)驗(yàn)6:創(chuàng)建帶有生命周期的Bean
ioc容器中注冊的組件:
單實(shí)例:容器啟動的時候就會創(chuàng)建好,容器關(guān)閉也會銷毀創(chuàng)建的bean。
多實(shí)例:獲取的時候才創(chuàng)建。
可以為bean自定義一些生命周期方法,spring在創(chuàng)建或銷毀的時候就會調(diào)用指定的方法。
(1)單實(shí)例Singleton測試
在Book類中創(chuàng)建方法:
package com.gql.bean; public class Book { private String bookName; private String author; public void myInit() { System.out.println("Book的初始化方法..."); } public void myDestory() { System.out.println("Book的銷毀方法..."); } public Book() { super(); // TODO Auto-generated constructor stub System.out.println("Book創(chuàng)建..."); } }
在xml中注冊組件:
<bean id="book01" class="com.gql.bean.Book" destroy-method="myDestory" init-method="myInit"></bean>
測試:
在ApplicationContext中沒有close方法,需要將容器類型轉(zhuǎn)換為ConfigurableApplicationContext 。
public class IoCTest { ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("ApplicationContext.xml"); @Test public void test10() { System.out.println("容器關(guān)閉了"); ioc.close(); } }
(2)多實(shí)例prototype測試
只需要改變xml中注冊組件為多實(shí)例:
<bean id="book01" class="com.gql.bean.Book" destroy-method="myDestory" init-method="myInit" scope="prototype"></bean>
仍然使用上面的方法進(jìn)行測試:
可以看到容器的創(chuàng)建銷毀一系列都沒有進(jìn)行,這是因?yàn)槎鄬?shí)例在獲取bean的時候才創(chuàng)建實(shí)例。
多實(shí)例測試中增加獲取bean:
@Test public void test10() { Object bean = ioc.getBean("book01"); System.out.println(bean); System.out.println("容器關(guān)閉了"); ioc.close(); }
測試結(jié)果中,成功創(chuàng)建了實(shí)例,但是容器關(guān)閉并沒有銷毀Bean。
實(shí)驗(yàn)7:測試Bean的后置處理器
后置處理器有一點(diǎn)代理對象的意思,使用后置處理器,Bean的生命周期變成下面的樣子:
容器啟動—>后置處理器Before—>初始化方法—>后置處理器After—>容器關(guān)閉(調(diào)用銷毀方法)
不管有沒有初始化方法,后置處理器都會默認(rèn)其有,繼續(xù)工作。
后置處理器:
package com.gql.bean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; /** * 1.編寫后置處理器 * 2.將后置處理器注冊在配置文件 * @author guoqianliang * */ public class MyBeanPostProcessor implements BeanPostProcessor { /** * 初始化前調(diào)用 */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub System.out.println("Before:" + beanName + "將要調(diào)用初始化方法了..." + bean); return bean; } /** * 初始化后調(diào)用 */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub System.out.println("After:" + beanName + "初始化方法調(diào)用完了" + bean); return bean; } }
將后置處理器注冊在配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="book01" class="com.gql.bean.Book" destroy-method="myDestory" init-method="myInit" scope="singleton"></bean> <!-- 后置處理器:可以在bean的初始化前后調(diào)用方法 --> <bean id="beanPostProcessor" class="com.gql.bean.MyBeanPostProcessor"></bean> </beans>
測試:
@Test public void test11() { Object bean = ioc.getBean("book01"); System.out.println("容器關(guān)閉了"); ioc.close(); }
實(shí)驗(yàn)8:引用外部文件
在Spring中bean默認(rèn)都是單實(shí)例的,而數(shù)據(jù)庫作為單實(shí)例是最好不過的,一個項(xiàng)目就是一個連接池,連接池里面管理很多連接,連接是直接從連接池中拿??梢宰孲pring幫我們創(chuàng)建連接池對象,管理連接池。
注冊連接池第一代
在配置中注冊連接池:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="root"></property> <property name="password" value="Hudie"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> </bean>
測試:
@Test public void test12() throws SQLException { // 從容器中拿到連接 // DataSource bean = (DataSource) ioc.getBean("dataSource"); DataSource bean2 = ioc.getBean(DataSource.class); System.out.println(bean2.getConnection()); }
成功獲取到了這個連接:
注冊連接池第二代
在config包下創(chuàng)建一個dbconfig.properties用來保存數(shù)據(jù)庫連接信息。
為了防止配置文件中的key與Spring自己的關(guān)鍵字沖突??梢詾閗ey加一個前綴,業(yè)內(nèi)通用的做法是使用jabc.xxx
jdbc.username:root jdbc.password:Hudie jdbc.jdbcUrl:jdbc:mysql://localhost:3306/test jdbc.driverClass:com.mysql.jdbc.Driver
注冊數(shù)據(jù)庫連接池:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> </bean>
測試:
@Test public void test12() throws SQLException { DataSource bean2 = ioc.getBean(DataSource.class); System.out.println(bean2.getConnection()); }
以上就是怎么在Spring框架中創(chuàng)建一個Bean,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。