最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年03月23日 14:31:00   作者:郭乾亮1998.  
這篇文章主要介紹了Spring框架花式創(chuàng)建Bean的n種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(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容器中注冊(cè)組件對(duì)象的其他方法。

實(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有多個(gè),使用這種方法查找就會(huì)報(bào)錯(cuò)。可以改用下面的方式:

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

實(shí)驗(yàn)2:通過(guò)有參構(gòu)造器為bean的屬性賦值

需要提前在bean中添加有參構(gòu)造器,才能進(jìn)行下面的測(cè)試。

	<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)行索引,可以不按順序)

通過(guò)名稱空間為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:為各種屬性賦值

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

如題,給出一個(gè)賦值的Bean對(duì)象,為其在容器中注冊(cè)。此時(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 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:通過(guò)繼承實(shí)現(xiàn)bean配置信息的重用

下面的代碼中p4繼承了p3,需要改動(dòng)的屬性在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:?jiǎn)螌?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ì)象

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

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

ioc容器中注冊(cè)的組件:

  • 單實(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測(cè)試

在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中注冊(cè)組件:

<bean id="book01" class="com.gql.bean.Book" destroy-method="myDestory" init-method="myInit"></bean>

測(cè)試:

在ApplicationContext中沒(méi)有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測(cè)試

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

<bean id="book01" class="com.gql.bean.Book" destroy-method="myDestory" init-method="myInit" scope="prototype"></bean>

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


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

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

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


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

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

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

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

不管有沒(méi)有初始化方法,后置處理器都會(huì)默認(rèn)其有,繼續(xù)工作。

后置處理器:

package com.gql.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
 * 1.編寫后置處理器 
 * 2.將后置處理器注冊(cè)在配置文件
 * @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;
	}
}

將后置處理器注冊(cè)在配置文件:

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

測(cè)試:

@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ù)庫(kù)作為單實(shí)例是最好不過(guò)的,一個(gè)項(xiàng)目就是一個(gè)連接池,連接池里面管理很多連接,連接是直接從連接池中拿??梢宰孲pring幫我們創(chuàng)建連接池對(duì)象,管理連接池。

注冊(cè)連接池第一代

在配置中注冊(cè)連接池:

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

測(cè)試:

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

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

注冊(cè)連接池第二代

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

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

jdbc.username:root
jdbc.password:Hudie
jdbc.jdbcUrl:jdbc:mysql://localhost:3306/test
jdbc.driverClass:com.mysql.jdbc.Driver

注冊(cè)數(shù)據(jù)庫(kù)連接池:

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

測(cè)試:

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

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

相關(guān)文章

  • Java的Hibernate框架中的雙向主鍵關(guān)聯(lián)與雙向外鍵關(guān)聯(lián)

    Java的Hibernate框架中的雙向主鍵關(guān)聯(lián)與雙向外鍵關(guān)聯(lián)

    Hibernate想要實(shí)現(xiàn)雙向的關(guān)聯(lián)就必須在映射文件的兩端同時(shí)配置<one-to-one>,另外還要在主映射的一端采用foreign外鍵關(guān)聯(lián)屬性,下面我們就一起來(lái)看一下Java的Hibernate框架中的雙向主鍵關(guān)聯(lián)與雙向外鍵關(guān)聯(lián)方法:
    2016-06-06
  • IntelliJ IDEA使用maven實(shí)現(xiàn)tomcat的熱部署

    IntelliJ IDEA使用maven實(shí)現(xiàn)tomcat的熱部署

    這篇文章主要介紹了IntelliJ IDEA使用maven實(shí)現(xiàn)tomcat的熱部署,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 詳解java8中的Stream數(shù)據(jù)流

    詳解java8中的Stream數(shù)據(jù)流

    Stream使用一種類似用SQL語(yǔ)句從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)的直觀方式來(lái)提供一種對(duì)Java集合運(yùn)算和表達(dá)的高階抽象。接下來(lái)通過(guò)本文給大家分享java8中的Stream數(shù)據(jù)流知識(shí),感興趣的朋友一起看看吧
    2017-10-10
  • Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序

    Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序

    這篇文章主要介紹了Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序,主要通過(guò)案例用TreeSet集合存儲(chǔ)多個(gè)學(xué)生信息,并遍歷該集合,要按照總分從高到低進(jìn)行排序,下文介紹需要的朋友可以參考一下
    2022-04-04
  • 老生常談java數(shù)組中的常見(jiàn)異常

    老生常談java數(shù)組中的常見(jiàn)異常

    數(shù)組是用來(lái)存儲(chǔ)一系列數(shù)據(jù),但它往往被認(rèn)為是一系列相同類型的變量,異常是程序中的一些錯(cuò)誤,但并不是所有的錯(cuò)誤都是異常,并且錯(cuò)誤有時(shí)候是可以避免的,接下來(lái)讓我們?cè)敿?xì)的了解吧
    2022-03-03
  • Java開(kāi)發(fā)中的容器概念、分類與用法深入詳解

    Java開(kāi)發(fā)中的容器概念、分類與用法深入詳解

    這篇文章主要介紹了Java開(kāi)發(fā)中的容器概念、分類與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了java容器的相關(guān)概念、分類、使用方法與注意事項(xiàng),需要的朋友可以參考下
    2017-11-11
  • java生成餅圖svg及JFreeChart生成svg圖表

    java生成餅圖svg及JFreeChart生成svg圖表

    java生成餅圖svg,代碼實(shí)現(xiàn)感覺(jué)有點(diǎn)復(fù)雜,個(gè)人認(rèn)為不如用JFreeChart,這篇文章主要介紹java生成餅圖svg及JFreeChart生成svg圖表,有需要的小伙伴可以參考下
    2015-08-08
  • spring boot項(xiàng)目fat jar瘦身的實(shí)現(xiàn)

    spring boot項(xiàng)目fat jar瘦身的實(shí)現(xiàn)

    這篇文章主要介紹了spring boot項(xiàng)目fat jar瘦身的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 解析JDK14中的java tools簡(jiǎn)介

    解析JDK14中的java tools簡(jiǎn)介

    這篇文章主要介紹了JDK14中的java tools簡(jiǎn)介,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java后臺(tái)處理前端傳的json串方法

    java后臺(tái)處理前端傳的json串方法

    今天小編就為大家分享一篇java后臺(tái)處理前端傳的json串方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08

最新評(píng)論

成都市| 曲沃县| 蓝山县| 江孜县| 昌吉市| 扶沟县| 长阳| 和静县| 周口市| 温宿县| 临城县| 甘南县| 河曲县| 徐水县| 海门市| 江华| 江陵县| 清水河县| 光山县| 濉溪县| 房产| 年辖:市辖区| 连南| 确山县| 镇沅| 桐乡市| 拜泉县| 若尔盖县| 嘉峪关市| 拉萨市| 分宜县| 陇南市| 汶川县| 固原市| 泰来县| 旺苍县| 页游| 清水河县| 靖远县| 石台县| 岫岩|