国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))

瀏覽:6日期:2023-09-14 14:04:05

常用的從容器中獲取bean實(shí)例使用這樣的方式:

@Testpublic void test() {Persion p = (Persion) ioc.getBean('p1');System.out.println(p);}

常用的在容器中配置組件使用這樣的方式:

<bean 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容器中注冊組件對(duì)象的其他方法。

實(shí)驗(yàn)1:根據(jù)bean的類型從ioc容器中獲取實(shí)例

@Testpublic void test01() {Persion p = ioc.getBean(Persion.class);System.out.println(p);}

這種方法查找的好處是不需要類型轉(zhuǎn)換,但是如果ioc容器中要找的bean有多個(gè),使用這種方法查找就會(huì)報(bào)錯(cuò)。可以改用下面的方式:

@Testpublic 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 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 p:name='小王' p:age='22'p:gender='男' p:email='wang@163.com'></bean>

實(shí)驗(yàn)3:為各種屬性賦值

引用類型、集合類型、級(jí)聯(lián)類型。

如題,給出一個(gè)賦值的Bean對(duì)象,為其在容器中注冊。此時(shí)所有復(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 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 class='com.gql.bean.Car'><property name='carName' value='寶馬'></property><property name='color' value='白色'></property><property name='price' value='30000'></property></bean>

集合類型賦值:

list

<bean class='com.gql.bean.Persion'><property name='book'><list><bean p:bookName='西游?' p:author='吳承恩'></bean><ref bean='book01' /></list></property></bean><bean 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,需要改動(dòng)的屬性在property標(biāo)簽中修改即可,其余的全部原樣繼承。

<bean 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 parent='p3'><property name='name' value='李四'></property></bean>

實(shí)驗(yàn)5:單實(shí)例singleton和多實(shí)例prototype

單實(shí)例singleton 多實(shí)例prototype ①容器啟動(dòng)時(shí)創(chuàng)建好對(duì)象并保存在容器中 ①獲取Bean時(shí)才會(huì)創(chuàng)建這個(gè)對(duì)象 ②調(diào)用初始化方法 ②調(diào)用初始化方法 ③容器關(guān)閉時(shí)調(diào)用銷毀方法 ③容器銷毀時(shí)不調(diào)用銷毀方法 任何時(shí)間獲取都是獲取之前創(chuàng)建好的那個(gè)對(duì)象 每次獲取都會(huì)創(chuàng)建一個(gè)新的對(duì)象

詳情可參照博客:通過工廠創(chuàng)建Bean的三種方式

實(shí)驗(yàn)6:創(chuàng)建帶有生命周期的Bean

ioc容器中注冊的組件:

單實(shí)例:容器啟動(dòng)的時(shí)候就會(huì)創(chuàng)建好,容器關(guān)閉也會(huì)銷毀創(chuàng)建的bean。 多實(shí)例:獲取的時(shí)候才創(chuàng)建。

可以為bean自定義一些生命周期方法,spring在創(chuàng)建或銷毀的時(shí)候就會(huì)調(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 stubSystem.out.println('Book創(chuàng)建...');}}

在xml中注冊組件:

<bean destroy-method='myDestory' init-method='myInit'></bean>

測試:

在ApplicationContext中沒有close方法,需要將容器類型轉(zhuǎn)換為ConfigurableApplicationContext 。

public class IoCTest {ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext('ApplicationContext.xml');@Testpublic void test10() {System.out.println('容器關(guān)閉了');ioc.close();}}

Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))

(2)多實(shí)例prototype測試

只需要改變xml中注冊組件為多實(shí)例:

<bean destroy-method='myDestory' init-method='myInit' scope='prototype'></bean>

仍然使用上面的方法進(jìn)行測試:

Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))

可以看到容器的創(chuàng)建銷毀一系列都沒有進(jìn)行,這是因?yàn)槎鄬?shí)例在獲取bean的時(shí)候才創(chuàng)建實(shí)例。

多實(shí)例測試中增加獲取bean:

@Testpublic void test10() {Object bean = ioc.getBean('book01');System.out.println(bean);System.out.println('容器關(guān)閉了');ioc.close();}

Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))

測試結(jié)果中,成功創(chuàng)建了實(shí)例,但是容器關(guān)閉并沒有銷毀Bean。

實(shí)驗(yàn)7:測試Bean的后置處理器

后置處理器有一點(diǎn)代理對(duì)象的意思,使用后置處理器,Bean的生命周期變成下面的樣子:

容器啟動(dòng)—>后置處理器Before—>初始化方法—>后置處理器After—>容器關(guān)閉(調(diào)用銷毀方法)

不管有沒有初始化方法,后置處理器都會(huì)默認(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)用 */@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// TODO Auto-generated method stubSystem.out.println('Before:' + beanName + '將要調(diào)用初始化方法了...' + bean);return bean;}/** * 初始化后調(diào)用 */@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// TODO Auto-generated method stubSystem.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 destroy-method='myDestory' init-method='myInit' scope='singleton'></bean><!-- 后置處理器:可以在bean的初始化前后調(diào)用方法 --><bean class='com.gql.bean.MyBeanPostProcessor'></bean></beans>

測試:

@Testpublic void test11() {Object bean = ioc.getBean('book01');System.out.println('容器關(guān)閉了');ioc.close();}

Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))

實(shí)驗(yàn)8:引用外部文件

在Spring中bean默認(rèn)都是單實(shí)例的,而數(shù)據(jù)庫作為單實(shí)例是最好不過的,一個(gè)項(xiàng)目就是一個(gè)連接池,連接池里面管理很多連接,連接是直接從連接池中拿。可以讓Spring幫我們創(chuàng)建連接池對(duì)象,管理連接池。

注冊連接池第一代

在配置中注冊連接池:

<bean 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>

測試:

@Testpublic void test12() throws SQLException {// 從容器中拿到連接// DataSource bean = (DataSource) ioc.getBean('dataSource');DataSource bean2 = ioc.getBean(DataSource.class);System.out.println(bean2.getConnection());}

成功獲取到了這個(gè)連接:

Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))

注冊連接池第二代

在config包下創(chuàng)建一個(gè)dbconfig.properties用來保存數(shù)據(jù)庫連接信息。

為了防止配置文件中的key與Spring自己的關(guān)鍵字沖突。可以為key加一個(gè)前綴,業(yè)內(nèi)通用的做法是使用jabc.xxx

jdbc.username:rootjdbc.password:Hudiejdbc.jdbcUrl:jdbc:mysql://localhost:3306/testjdbc.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>

測試:

@Testpublic void test12() throws SQLException {DataSource bean2 = ioc.getBean(DataSource.class);System.out.println(bean2.getConnection());}

Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))

到此這篇關(guān)于Spring框架花式創(chuàng)建Bean的n種方法的文章就介紹到這了,更多相關(guān)Spring 創(chuàng)建Bean內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 额济纳旗| 巩义市| 罗城| 江都市| 海安县| 柳林县| 来宾市| 东丽区| 闵行区| 台南市| 中宁县| 镇巴县| 尉氏县| 韩城市| 永泰县| 马关县| 舒城县| 肥乡县| 孙吴县| 米易县| 镇原县| 中江县| 宕昌县| 澄迈县| 宜州市| 横峰县| 营山县| 忻城县| 克山县| 浙江省| 合水县| 霍城县| 大关县| 望奎县| 比如县| 东乌珠穆沁旗| 五指山市| 大宁县| 浦江县| 望江县| 寿光市|