spring篇(三)龍宮尋寶
IOC容器之BeanFactory
1.什麼是BeanFactory?
顧名思義,就是生產Bean的工廠。基礎型別的IOC容器,可以提供完整的IOC服務支援。
是不是很難理解!!!打個比方BeanFactory就是生產汽車的工廠。你是不是從其他的汽車零件廠或者自己生產的零配件送到最後的組裝線上啊!最後是不是在生產線的終點取得成品的汽車。類似的,你只要把所需的所有業務物件交給BeanFactroy,剩下的就是直接從BeanFactroy取得最終完成組裝並且可以使用的物件。
2.有了BeanFactory的前後變化?
主要是物件之間依賴關係的解決方式改變了。
之前:系統業務物件需要什麼樣依賴的業務物件就自己去“拿”(想要什麼自己去取)
有了之後:需要什麼樣的依賴讓BeanFactory給送過來。
3.BeanFactory的物件註冊與依賴注入繫結的方式有哪幾種?
3.1 直接編碼方式
public class BeanFactoryTest extends TestCase {
/**
* 直接編碼方式
*/
public void testRedirectCode() {
DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
BeanFactory beanFactory = bindViaCode(beanRegistry);
Coder coder = (Coder) beanFactory.getBean("coder");
coder.getApp().say();
/**
* 輸出為:
* //通過構造方法注入的情況
* 呼叫App無參構造
* 呼叫Coder有參構造,引數app為:App{says='App'}
* App.say():App
*
* //通過setter方式注入的情況下
* 呼叫Coder無參構造
* 呼叫App無參構造
* 呼叫Coder.setApp(), 引數app為: App{says='App'}
* App.say():App
*/
}
public static BeanFactory bindViaCode(BeanDefinitionRegistry registry){
AbstractBeanDefinition appBeanDefinition = new RootBeanDefinition(App.class);
AbstractBeanDefinition coderBeanDefinition = new RootBeanDefinition(Coder.class);
//將beanDefinition註冊到容器中
registry.registerBeanDefinition("app", appBeanDefinition);
registry.registerBeanDefinition("coder", coderBeanDefinition);
//指定依賴關係
//1、可以通過構造方法注入
// ConstructorArgumentValues argumentValues = new ConstructorArgumentValues();
// argumentValues.addIndexedArgumentValue(0, appBeanDefinition);
// coderBeanDefinition.setConstructorArgumentValues(argumentValues);
//2、可以通過setter方法注入
MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
mutablePropertyValues.addPropertyValue("app", appBeanDefinition);
coderBeanDefinition.setPropertyValues(mutablePropertyValues);
//繫結完成
return (BeanFactory)registry;
}
}
3.2 外部配置檔案方式
(i)XML檔案格式
(ii)Properties檔案格式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<bean id="app" class="com.me.sourcecode.bean.App"></bean>
<!--<bean id="coder" class="com.me.sourcecode.bean.Coder">-->
<!--<constructor-arg index="0">-->
<!--<ref bean="app" />-->
<!--</constructor-arg>-->
<!--</bean>-->
<bean id="coder" class="com.me.sourcecode.bean.Coder">
<property name="app" ref="app"></property>
</bean>
</beans>
3.3註解方式
4.BeanFactory的XML
4.1< beans >和< bean >
所有註冊到容器的業務物件,在spring中統稱為bean。
在XML中把這些< bean >的元素組織起來,就叫做 < beans >
< description >:在配置檔案中指定一些描述性的資訊。
< import >:載入主要配置檔案時,用< import >元素對其所依賴的配置檔案進行引用。
比如,如果A.xml中的< bean >可能依賴與B.xml中< bean >的某些定義,那麼就可以在A.xml中使用< inport >將B.xml引入到A.xml< import resource=“B.xml”/ >
< alias>:通過< alias >為某些< bean >起一些“外號”,通常情況是為了減少輸入。
4.2 < bean >
id屬性: < bean >在容器中的標誌。
class屬性:每個註冊到容器的物件都需要通過< bean >的class屬性指定其型別。
5.spring在IOC容器的XML配置中,如何表達依賴性?
5.1通過構造方法注入XML
需要使用< constructor-arg>(constructor 建構函式)
public UserDaoImpl(String name){
this.name = name;
}
<bean id="userDao" class="com.spring.firstday.UserDaoImpl" destroy-method="">
<constructor-arg name="name" value="Hello"></constructor-arg>
</bean>
當無法明確配置項與物件的構造方法引數列表一一對應時,就需要引入< constructor-arg> 的type(型別)或者index(性質)屬性。
5.1.1 type屬性
public class ConstructorConfusion {
public ConstructorConfusion(String someValue) {
System.out.println("ConstructorConfusion(String) called");
}
public ConstructorConfusion(int someValue) {
System.out.println("ConstructorConfusion(int) called");
}
}
該類宣告瞭兩個構造方法,但是注意的是這兩個建構函式名一樣,這個時候就需要type來區別配置
<bean id="constructorConfusion" class="com.apress.prospring.ch4.ConstructorConfusion">
<constructor-arg>
<value>90</value>
</constructor-arg>
</bean>
這樣的話spring只呼叫第一個構造方法。
<bean id="constructorConfusion" class="com.apress.prospring.ch4.ConstructorConfusion">
<constructor-arg type="int">
<value>90</value>
</constructor-arg>
</bean>
5.1.2 index屬性
當只有一個建構函式,但是它的引數型別都相同的時候,就需要index來區分
public class ConstructorConfusion {
public ConstructorConfusion(String someValue1, String sone Value2) {
System.out.println("ConstructorConfusion(String) called");
System.out.println("ConstructorConfusion(String) called");
}
}
<bean id="constructorConfusion" class="com.apress.prospring.ch4.ConstructorConfusion">
<constructor-arg index="1"> <value>90</value>
<constructor-arg index="2"> <value>100</value>
</bean>
5.2 setter注入
需要使用< property>
< property >有一個name屬性,用來指定該< property >將會注入的物件所對應的例項變數名稱。之後通過value或者ref屬性或者內嵌其他元素來指定具體的依賴物件引用或值。
<bean id="constructorConfusion" class="com.apress.prospring.ch4.ConstructorConfusion">
<property name = "newListener">
<ref bean = "djNewsListener"/>
</property>
</bean>
相關文章
- 藍橋杯-地宮取寶
- PARL原始碼走讀——使用策略梯度演算法求解迷宮尋寶問題原始碼梯度演算法
- GitHub 尋寶指南Github
- [TK] 尋寶遊戲遊戲
- Go-Spring 入門篇(三)GoSpring
- 在細節豐富的歐洲城市裡尋找寶藏,《迷宮大偵探》開發團隊專訪
- Spring葵花寶典Spring
- 尋寶路漫漫,從《金銀島》聊聊”尋寶“主題遊戲的代入感進階之路遊戲
- 九宮八陣圖之龍飛陣--異常流量管理系統
- 「Golang成長之路」迷宮的廣度優先搜尋Golang
- 龍頭整機廠商寶德加入,共建龍蜥社群開源新生態
- Oracle面試寶典-鎖篇Oracle面試
- Oracle 面試寶典-RAC篇Oracle面試
- Oracle 面試寶典-UNDO篇Oracle面試
- Oracle 面試寶典-DG篇Oracle面試
- 【Android 開發 VR 實戰】三. 開發一個尋寶類 VR 遊戲 TreasureHuntAndroidVR遊戲
- 尋路者華為雲:在產業AI迷宮裡走直線產業AI
- golang學習筆記——迷宮的廣度優先搜尋Golang筆記
- 死磕Spring之AOP篇 - Spring AOP自動代理(三)建立代理物件Spring物件
- Oracle面試寶典-等待事件篇Oracle面試事件
- Oracle面試寶典-引數篇Oracle面試
- Oracle面試寶典-事務篇Oracle面試
- Redis面試寶典-持久化篇Redis面試持久化
- MySQL面試寶典-檔案篇MySql面試
- 【Javascript + Vue】實現對任意迷宮圖片的自動尋路JavaScriptVue
- dfs深度優先搜尋解決迷宮類問題(遍歷)
- 基於RL(Q-Learning)的迷宮尋路演算法演算法
- 題目4:棋盤尋寶擴充套件套件
- 尋找寫程式碼感覺(三)之使用 Spring Boot 編寫介面Spring Boot
- 構建高效能分散式搜尋引擎(Wcf-示例篇)三薦分散式
- POJ 2251-Dungeon Master(BFS-三維迷宮)AST
- 解密迷宮問題:三種高效演算法Java實現,讓你輕鬆穿越未知迷宮解密演算法Java
- 基於JavaFX圖形介面演示的迷宮建立與路徑尋找Java
- 基於深度強化學習(DQN)的迷宮尋路演算法強化學習演算法
- js版九宮格拼圖與啟發式搜尋(A*演算法)JS演算法
- Oracle面試寶典-程式結構篇Oracle面試
- C語言 DSF (尋求迷宮起點到終點的所有路徑)C語言
- canvas 基礎系列(三)之實現九宮格抽獎Canvas