Spring 基于XML配置 bean管理 Bean-IOC的方法
??一. spring學(xué)習(xí)的核心內(nèi)容
- Spring 核心學(xué)習(xí)內(nèi)容 IOC、AOP, jdbcTemplate, 聲明式事務(wù)
- IOC: 控制反轉(zhuǎn) , 可以管理 java 對(duì)象
- AOP : 切面編程
- JDBCTemplate : 是 spring 提供一套訪問(wèn)數(shù)據(jù)庫(kù)的技術(shù), 應(yīng)用性強(qiáng),相對(duì)好理解
- 聲明式事務(wù): 基于 ioc/aop 實(shí)現(xiàn)事務(wù)管理,
Spring 幾個(gè)重要概念
Spring 可以整合其他的框架(解讀: Spring 是管理框架的框架)
Spring 有兩個(gè)核心的概念: IOC 和 AOP
IOC [Inversion Of Control 反轉(zhuǎn)控制]
2.為什么學(xué)習(xí)spring,我們看一下傳統(tǒng)的開(kāi)發(fā)模式
上圖連接到數(shù)據(jù)庫(kù)為例說(shuō)明
程序員編寫(xiě)程序, 在程序中讀取配置信息
創(chuàng)建對(duì)象, new Object???() // 反射方式
使用對(duì)象完成任務(wù)
而IOC 的開(kāi)發(fā)模式 [EmpAction EmpService EmpDao Emp]程序<-----容器
解讀上圖
1.Spring 根據(jù)配置文件 xml/注解, 創(chuàng)建對(duì)象, 并放入到容器(ConcurrentHashMap)中,并且可以完成對(duì)象之間的依賴
2.當(dāng)需要使用某個(gè)對(duì)象實(shí)例的時(shí)候, 就直接從容器中獲取即可
3.程序員可以更加關(guān)注如何使用對(duì)象完成相應(yīng)的業(yè)務(wù), (以前是 new … ==> 注解/配置方式)
4.DI—Dependency Injection 依賴注入,可以理解成是 IOC 的另外叫法.
5.Spring 最大的價(jià)值,通過(guò)配置,給程序提供需要使用的web 層[Servlet(Action/Controller)]/Service/Dao/[JavaBean/entity]對(duì)象,這個(gè)是核心價(jià)值所在,也是 ioc 的具體體現(xiàn), 實(shí)現(xiàn)解耦.
3.Debug 看一下 Spring 容器的處理機(jī)制,
Spring管理 Bean-IOC
Bean管理包括兩方面,創(chuàng)建 bean 對(duì)象和給 bean 注入屬性,Bean 配置方式也有兩種,基于 xml 文件配置方式和基于注解方式
??二. 基于 XML 配置 bean
1. 通過(guò)類型來(lái)獲取 bean
通過(guò) spring 的 ioc 容器, 獲取一個(gè) bean 對(duì)象
創(chuàng)建 Monster.java在 beans.xml 配置(說(shuō)明前面已經(jīng)配置好了)
解讀:
1. 配置monster對(duì)象/javabean
2. 在beans中可以配置多個(gè)bean
3. bean表示就是一個(gè)java對(duì)象
4. class屬性是用于指定類的全路徑->spring底層使用反射創(chuàng)建
5. id屬性表示該java對(duì)象在spring容器中的id, 通過(guò)id可以獲取到對(duì)象
6. 用于給該對(duì)象的屬性賦值
<bean id="monster01" class="com.hspedu.spring.beans.Monster"> <property name="monsterId" value="1"/> <property name="name" value="牛魔王"/> <property name="skill" value="牛魔王拳"/> </bean>
完成測(cè)試
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Monster monster = ioc.getBean(Monster.class);
細(xì)節(jié)說(shuō)明
按類型來(lái)獲取 bean, 要求 ioc 容器中的同一個(gè)類的 bean 只能有一個(gè), 否則會(huì)拋出異常
NoUniqueBeanDefinitionException
這種方式的應(yīng)用場(chǎng)景:比如 XxxAction/Servlet/Controller, 或 XxxService 在一個(gè)線程
中只需要一個(gè)對(duì)象實(shí)例(單例)的情況說(shuō)明一下: 在容器配置文件(比如 beans.xml)中給屬性賦值, 底層是通過(guò)
setter 方法完成的, 這也是為什么我們需要提供 setter 方法的原因
2. 通過(guò)構(gòu)造器配置 bean
在 spring 的 ioc 容器, 可以通過(guò)構(gòu)造器來(lái)配置 bean 對(duì)象
解讀
1. constructor-arg標(biāo)簽可以指定使用構(gòu)造器的參數(shù)
2. index表示構(gòu)造器的第幾個(gè)參數(shù) 從0開(kāi)始計(jì)算的
3. 除了可以通過(guò)index 還可以通過(guò) name / type 來(lái)指定參數(shù)方式
4. 解除大家的疑惑, 類的構(gòu)造器,不能有完全相同類型和順序的構(gòu)造器,所以可以通過(guò)type來(lái)指定
<bean id="monster02" class="com.hspedu.spring.beans.Monster"> <constructor-arg value="2" index="0"/> <constructor-arg value="蜘蛛精" index="1"/> <constructor-arg value="吐口水" index="2"/> </bean>
數(shù)據(jù)類型就是對(duì)應(yīng)的 Java 數(shù)據(jù)類型,按構(gòu)造器參數(shù)順序
<bean id="monster03" class="com.hspedu.spring.beans.Monster"> <constructor-arg value="3" type="java.lang.Integer"/> <constructor-arg value="白骨精" type="java.lang.String"/> <constructor-arg value="白骨鞭" type="java.lang.String"/> </bean>
完成測(cè)試
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Object monster02 = ioc.getBean("monster02"); Object monster03 = ioc.getBean("monster03");
通過(guò) index 屬性來(lái)區(qū)分是第幾個(gè)參數(shù)
通過(guò) type 屬性來(lái)區(qū)分是什么類型(按照順序)
3. 通過(guò) p 名稱空間配置 bean
在 spring 的 ioc 容器, 可以通過(guò) p 名稱空間來(lái)配置 bean 對(duì)象
完成步驟
在 beans.xml 配置, 增加命名空間配置xmlns:p="http://www.springframework.org/schema/p"
1.將光標(biāo)放在p , 輸入alt+enter , 就會(huì)自動(dòng)的添加xmlns
2.有時(shí)需要多來(lái)幾次
<bean id="monster04" class="com.hspedu.spring.beans.Monster"> p:monsterId="4" p:name="紅孩兒" p:skill="吐火~" />
完成測(cè)試
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Monster monster04 = ioc.getBean("monster04", Monster.class);
4. 引用/注入其它 bean 對(duì)象
在 spring 的 ioc 容器, 可以通過(guò) ref 來(lái)實(shí)現(xiàn) bean 對(duì)象的相互引用
其它含義和前面一樣ref 表示 memberDAO 這個(gè)屬性將引用/指向 id = memberDAOImpl 對(duì)象
解讀
1.ref="memberDAO"表示 MemberServiceImpl對(duì)象屬性memberDAO引用的對(duì)象是id=memberDAO 的對(duì)象
2.這里就體現(xiàn)出spring容器的依賴注入
3.注意再spring容器中, 他是作為一個(gè)整體來(lái)執(zhí)行的, 即如果你引用到一個(gè)bean對(duì)象, 對(duì)你配置的順序沒(méi)有要求
4.建議還是按順序,好處是閱讀的時(shí)候,比較方便
<bean id="memberServiceImpl" class="com.hspedu.spring.service.MemberServiceImpl"> <property name="memberDAO" ref="memberDAOImpl"/> </bean> <bean id="memberDAOImpl" class="com.hspedu.spring.dao.MemberDAOImpl"/>
5. 引用/注入內(nèi)部 bean 對(duì)象
<bean id="memberServiceImpl02" class="com.hspedu.spring.service.MemberServiceImpl"> <property name="memberDAO"> <bean class="com.hspedu.spring.dao.MemberDAOImpl"/> </property> </bean>
6. 引用/注入集合/數(shù)組類型
給 bean 對(duì)象的 list 集合賦值
<bean id="master01" class="com.hspedu.spring.beans.Master"> <property name="name" value="太上老君"/> <property name="monsterList"> <list> <ref bean="monster03"/> <ref bean="monster02"/> </list> </property>
給 bean 對(duì)象的 map 集合賦值
<property name="monsterMap"> <map> <entry> <key> <value>monsterKey01</value> </key> <ref bean="monster01"/> </entry> <entry> <key> <value>monsterKey02</value> </key> <ref bean="monster02"/> </entry> </map> </property>
給 bean 對(duì)象的 properties 集合賦值 結(jié)構(gòu)k(String)-v(String)
<property name="pros"> <props> <prop key="k1">Java 工程師</prop> <prop key="k2">前端工程師</prop> <prop key="k3">大數(shù)據(jù)工程師</prop> </props> </property>
給 bean 對(duì)象的數(shù)組屬性注入值 ,array標(biāo)簽中使用 value 還是 bean , ref … 要根據(jù)你的業(yè)務(wù)決定
<property name="monsterName"> <array> <value>銀角大王</value> <value>金角大王</value> </array> </property>
給 bean 對(duì)象的 set 屬性注入值
<property name="monsterSet"> <set> <ref bean="monster01"/> <bean class="com.hspedu.spring.beans.Monster"> <property name="monsterId" value="10"/> <property name="name" value="玉兔精"/> <property name="skill" value="鉆地洞"/> </bean> </set> </property> </bean>
1.主要掌握 List/Map/Properties 三種集合的使用.
2.Properties 集合的特點(diǎn)
1)這個(gè) Properties 是 Hashtable 的子類 , 是 key-value 的形式
2)key 是 string 而 value 也是 string
7. 級(jí)聯(lián)屬性賦值
spring 的 ioc 容器, 可以直接給對(duì)象屬性的屬性賦值, 即級(jí)聯(lián)屬性賦值
<bean id="emp" class="com.hspedu.spring.beans.Emp"> <property name="name" value="jack"/> <property name="dept" ref="dept"/> <property name="dept.name" value="Java 開(kāi)發(fā)部"/> </bean> <bean id="dept" class="com.hspedu.spring.beans.Dept"/>
8. 通過(guò)靜態(tài)工廠獲取對(duì)象
先創(chuàng)建一個(gè)靜態(tài)工廠
public class MyStaticFactory { private static Map<String, Monster> monsterMap; static { monsterMap = new HashMap<String, Monster>(); monsterMap.put("monster_01", new Monster(100, "黃袍怪", "一陽(yáng)指")); monsterMap.put("monster_02", new Monster(200, "九頭金雕", "如來(lái)神掌")); } public static Monster getMonster(String key) { return monsterMap.get(key); } }
修改 beans.xml , 增加配置
1 通過(guò)靜態(tài)工廠獲取/配置bean
2. class 是靜態(tài)工廠類的全路徑
3. factory-method 表示是指定靜態(tài)工廠類的哪個(gè)方法返回對(duì)象
4. constructor-arg value=“monster02” value是指定要返回靜態(tài)工廠的哪個(gè)對(duì)象
<!-- 通過(guò)靜態(tài)工廠來(lái)獲取 bean 對(duì)象 --> <bean id="my_monster" class="com.hspedu.spring.factory.MyStaticFactory" factory-method="getMonster"> <!-- constructor-arg 標(biāo)簽提供 key --> <constructor-arg value="monster_01"/> </bean>
通過(guò)這個(gè)靜態(tài)工廠獲取的對(duì)象是同一個(gè)
9. 通過(guò)實(shí)例工廠獲取對(duì)象
在 spring 的 ioc 容器, 可以通過(guò)實(shí)例工廠獲取 bean 對(duì)象
public class MyInstanceFactory { private Map<String, Monster> monster_map; //非靜態(tài)代碼塊 { monster_map = new HashMap<String, Monster>(); monster_map.put("monster_01", new Monster(100, "猴子精", "吃人")); monster_map.put("monster_02", new Monster(200, "九頭金雕", "如來(lái)神掌")); } public Monster getMonster(String key) { return monster_map.get(key); } }
配置 beans.xm
1.factory-bean 指定使用哪個(gè)實(shí)例工廠對(duì)象返回bean
2. factory-method 指定使用實(shí)例工廠對(duì)象的哪個(gè)方法返回bean
3. constructor-arg value=“monster03” 指定獲取到實(shí)例工廠中的哪個(gè)monster
<bean id="myInstanceFactory" class="com.hspedu.spring.factory.MyInstanceFactory"/> <bean id="my_monster2" factory-bean="myInstanceFactory" factory-method="getMonster"> <constructor-arg value="monster_02"/> </bean>
通過(guò)這個(gè)實(shí)例工廠獲取的對(duì)象是同一個(gè),如果創(chuàng)建兩次實(shí)例工廠,再分別獲取對(duì)象就不是同一個(gè),這是和靜態(tài)工廠的區(qū)別。
10. 通過(guò) FactoryBean 獲取對(duì)象(重點(diǎn))
public class MyFactoryBean implements FactoryBean<Monster> { private String keyVal; private Map<String, Monster> monster_map; { monster_map = new HashMap<String, Monster>(); monster_map.put("monster_01", new Monster(100, "黃袍怪", "一陽(yáng)指")); monster_map.put("monster_02", new Monster(200, "九頭金雕", "如來(lái)神掌")); } public void setKeyVal(String keyVal) { this.keyVal = keyVal; } @Override public Monster getObject() throws Exception { // TODO Auto-generated method stub return this.monster_map.get(keyVal); } @Override public Class getObjectType() { // TODO Auto-generated method stub return Monster.class; } @Override public boolean isSingleton() { // TODO Auto-generated method stub return true; } }
解讀
1.通過(guò) FactoryBean 來(lái)獲取 bean 對(duì)象
2.name=“keyVal” 就是 MyFactoryBean 定義的 setKeyVal 方法
3.value=“monster_01” ,就是給 keyVal 的值
<bean id="myFactoryBean" class="com.hspedu.spring.factory.MyFactoryBean"> <property name="keyVal" value="monster_01"/> </bean>
11. bean 配置信息重用(繼承)
在 spring 的 ioc 容器, 提供了一種繼承的方式來(lái)實(shí)現(xiàn) bean 配置信息的重用
<!-- 繼承的方式來(lái)實(shí)現(xiàn) bean 配置信息的重用 --> <bean id="monster10" class="com.hspedu.spring.beans.Monster"> <property name="monsterId" value="10"/> <property name="name" value="蜈蚣精"/> <property name="skill" value="蜇人"/> </bean> <!-- parent="monster10" 就是繼承使用了 monster10 的配置信息 --> <bean id="monster11" class="com.hspedu.spring.beans.Monster" parent="monster10"/> <!-- 當(dāng)我們把某個(gè)bean設(shè)置為 abstract="true" 這個(gè)bean只能被繼承,而不能實(shí)例化了 --> <bean id="monster12" class="com.hspedu.spring.beans.Monster" abstract="true"> <property name="monsterId" value="12"/> <property name="name" value="美女蛇"/> <property name="skill" value="吃人"/> </bean> <!-- parent="monster12" 就是繼承使用了 monster12 的配置信息 --> <bean id="monster13" class="com.hspedu.spring.beans.Monster" parent="monster12"/>
到此這篇關(guān)于Spring 基于XML配置 bean管理 Bean-IOC的方法的文章就介紹到這了,更多相關(guān)Spring 管理 Bean-IOC內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring?IoC容器Bean作用域的singleton與prototype使用配置
- Spring?IOC容器Bean管理的完全注解開(kāi)發(fā)放棄配置文件
- 淺析Spring IOC bean為什么默認(rèn)是單例
- Spring IoC容器常見(jiàn)獲取Bean的方式匯總示例解析
- SpringBoot實(shí)現(xiàn)使用反射模擬IOC和getBean
- Spring?IOC容器Bean管理XML注入集合類型屬性
- Spring為IOC容器注入Bean的五種方式詳解
- Spring bean的實(shí)例化和IOC依賴注入詳解
- 關(guān)于SpringBoot獲取IOC容器中注入的Bean(推薦)
- spring在IoC容器中裝配Bean詳解
相關(guān)文章
SpringBoot實(shí)現(xiàn)根據(jù)手機(jī)號(hào)獲取歸屬地
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何實(shí)現(xiàn)根據(jù)手機(jī)號(hào)獲取歸屬地,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12MyBatis-Plus中的邏輯刪除功能及實(shí)例分析
本文將詳細(xì)講解MyBatis-Plus中的邏輯刪除特性,并結(jié)合實(shí)際案例進(jìn)行演示和說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03Spring?Security如何實(shí)現(xiàn)升級(jí)密碼加密方式詳解
這篇文章主要為大家介紹了Spring?Security實(shí)現(xiàn)升級(jí)密碼加密方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01SpringBoot程序預(yù)裝載數(shù)據(jù)的實(shí)現(xiàn)方法及實(shí)踐
在項(xiàng)目實(shí)際的開(kāi)發(fā)過(guò)程中,有時(shí)候會(huì)遇到需要在應(yīng)用程序啟動(dòng)完畢對(duì)外提供服務(wù)之前預(yù)先將部分?jǐn)?shù)據(jù)裝載到緩存的需求。本文就總結(jié)了常見(jiàn)的數(shù)據(jù)預(yù)裝載方式及其實(shí)踐,感興趣的朋友一起看看吧2022-04-04Java設(shè)計(jì)模式七大原則之接口隔離原則詳解
接口隔離原則(Interface Segregation Principle),又稱為ISP原則,就是在一個(gè)類中不要定義過(guò)多的方法,接口應(yīng)該盡量簡(jiǎn)單細(xì)化。本文將為大家具體介紹一下Java設(shè)計(jì)模式七大原則之一的接口隔離原則,需要的可以參考一下2022-02-02Java Swing最詳細(xì)基礎(chǔ)知識(shí)總結(jié)
這篇文章主要介紹了Java Swing最詳細(xì)基礎(chǔ)知識(shí)總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java Swing的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05java編程進(jìn)階小白也能手寫(xiě)HashMap代碼
這篇文章是一篇java小白進(jìn)階篇本文教大家手寫(xiě)一個(gè)HashMap實(shí)現(xiàn)的示例代碼,有需要的朋友可以借鑒參考下,希望對(duì)大家能夠有所進(jìn)益,祝大家早日升職加薪2021-10-10