日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

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

下面的實驗介紹一些Spring容器中注冊組件對象的其他方法。

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

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

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

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

實驗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>

實驗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 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>

實驗4:通過繼承實現(xiàn)bean配置信息的重用

下面的代碼中p4繼承了p3,需要改動的屬性在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>

實驗5:單實例singleton和多實例prototype

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

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

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

ioc容器中注冊的組件:

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

可以為bean自定義一些生命周期方法,spring在創(chuàng)建或銷毀的時候就會調(diào)用指定的方法。

(1)單實例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)多實例prototype測試

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

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

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

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

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

多實例測試中增加獲取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)建了實例,但是容器關(guān)閉并沒有銷毀Bean。

實驗7:測試Bean的后置處理器

后置處理器有一點代理對象的意思,使用后置處理器,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)用 */@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é))

實驗8:引用外部文件

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

注冊連接池第一代

在配置中注冊連接池:

<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());}

成功獲取到了這個連接:

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

注冊連接池第二代

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

為了防止配置文件中的key與Spring自己的關(guān)鍵字沖突。可以為key加一個前綴,業(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)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产免费播放一区二区| 97久久中文字幕| 精品不卡一区| 欧美黑人巨大videos精品| 国产精品一区亚洲| 国产精品2区| 精品国产亚洲一区二区在线观看| 免费一级欧美在线观看视频| 久久亚洲人体| 韩日一区二区| 久久国产电影| 国产精品美女久久久| 国产韩日影视精品| 欧美在线亚洲| 亚洲免费毛片| 国产香蕉精品| 97精品国产| 不卡视频在线| 日本va欧美va瓶| 精品一区91| 久久麻豆精品| 美女被久久久| 国产欧美日韩一级| 日韩伦理一区| 蜜桃av一区| 国产丝袜一区| 久久久久国产| 午夜在线观看免费一区| 青青国产精品| 高潮一区二区| 亚洲天堂日韩在线| 国产福利一区二区精品秒拍 | 久久影院资源站| 精品国产99| 九一精品国产| 日本免费一区二区视频| 精品99久久| 中文精品在线| 国产精品15p| 秋霞影视一区二区三区| 免费在线观看视频一区| 久久久国产精品入口麻豆| 亚洲精品网址| 国产精品免费大片| 久久婷婷激情| 日韩福利视频网| 久久久噜噜噜| 91欧美极品| 一区二区三区视频免费观看| 日本特黄久久久高潮| 日韩av专区| 蜜桃av一区二区在线观看| 精品国产欧美日韩| 一区二区三区四区日韩| 精品久久视频| 蜜桃av一区二区| 黑人精品一区| 日本电影久久久| 久久国产欧美| 国产欧美综合一区二区三区| 欧美aa国产视频| 国产精品美女在线观看直播| 欧美特黄一区| 精品一区电影| 日韩精品欧美大片| 99久久婷婷| 精品一区二区三区视频在线播放| 日本大胆欧美人术艺术动态| 中文另类视频| 欧美日韩亚洲三区| 国模 一区 二区 三区| 国产精品主播| 中文字幕av一区二区三区人 | 首页国产欧美久久| 91综合网人人| 国产三级一区| 三级在线观看一区二区| 97精品视频在线看| 久久狠狠久久| 丝袜国产日韩另类美女| 日韩成人亚洲| 久久中文字幕一区二区三区| 亚洲一区二区免费看| 日韩一区电影| 国产欧美精品| 亚洲人成亚洲精品| 性欧美69xoxoxoxo| 中文在线中文资源| 欧美极品一区二区三区| 91精品尤物| 中文不卡在线| 亚洲一区欧美二区| 久久婷婷亚洲| 日韩在线中文| 高清精品久久| 美女视频一区在线观看| 国产毛片一区二区三区| 亚洲少妇在线| 久久精品亚洲欧美日韩精品中文字幕| 欧美极品中文字幕| 久久国产日韩欧美精品| 亚洲2区在线| 免费在线观看视频一区| 国产精品日韩久久久| 欧美.日韩.国产.一区.二区| 蜜桃精品在线| 日韩精品久久久久久久电影99爱| 国产精品日韩精品中文字幕| 国产探花在线精品一区二区| 久久狠狠久久| 国产美女撒尿一区二区| 国产日韩欧美三级| 日韩精品免费视频人成| 亚洲免费观看高清完整版在线观| 丝袜美腿一区二区三区| 美女精品在线| 美女国产精品| 中文字幕成人| 日本成人精品| 欧美日本一区| 你懂的国产精品| 精品欧美日韩精品| 成人一二三区| 久久狠狠婷婷| 尹人成人综合网| 久久亚洲美女| 深夜福利一区| 日韩激情精品| 久久99久久人婷婷精品综合| 国产精品对白| 精品一区二区三区中文字幕视频 | 国产精品国产三级国产在线观看| 国产一区二区三区亚洲综合| 精品三级在线| 日韩国产一区二区| 欧美日韩在线观看视频小说| 三级在线看中文字幕完整版| 日韩高清欧美| 亚洲精品成人| 日韩专区欧美专区| 亚洲精品亚洲人成在线观看| 日韩国产欧美在线视频| 国产香蕉精品| 国产福利电影在线播放| 成人羞羞在线观看网站| 亚洲精品一二三区区别| 中文字幕视频精品一区二区三区| 日韩黄色av| 国产成人精品亚洲线观看| 欧美一区二区性| 另类激情亚洲| 青草综合视频| 97国产成人高清在线观看| 亚洲网站视频| 亚洲精品少妇| 久草精品视频| 午夜欧美精品| 97久久亚洲| 日韩成人亚洲| 最近国产精品视频| 欧美激情aⅴ一区二区三区| 中文字幕在线免费观看视频| 亚洲激情婷婷| 久久99蜜桃| 亚洲欧美日韩高清在线| 日本视频一区二区| 国产精品不卡| 免费欧美在线视频| 91成人精品观看| 裤袜国产欧美精品一区| 久久国产88| 粉嫩av一区二区三区四区五区 | 欧美一区成人| 群体交乱之放荡娇妻一区二区| 丝袜a∨在线一区二区三区不卡| 国产精品流白浆在线观看| 免费av一区| 国产伦理一区| 香蕉精品久久| 国产精品jk白丝蜜臀av小说| 在线视频观看日韩| 国产伦理一区| 99在线精品免费视频九九视 | 91久久国产| 国产精品一区二区三区av| 欧美a级一区| 国产毛片一区二区三区| 欧美日韩国产精品一区二区亚洲| 国产麻豆精品| 宅男噜噜噜66国产日韩在线观看| 国产精品白丝久久av网站| 国产伊人精品| 欧美精品二区| 中文字幕一区二区三区日韩精品| 国产精品久久观看| 欧美影院视频| 香蕉国产精品| bbw在线视频| 国产精品一卡| 亚洲我射av|