## Spring 涉及的設計模式:單例模式,簡單工廠模式,代理模式,觀察者模式,反射,註解。。。。。 ### Spring配置文件文件頭 ```xml ``` ### IOC 控制反轉 將創建對象的權力由開發者交 給 Spring(緩解對象和對象之間的耦合度) 在傳統模式下,對象的創建和賦 ...
Spring
涉及的設計模式:單例模式,簡單工廠模式,代理模式,觀察者模式,反射,註解。。。。。
Spring配置文件文件頭
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
IOC 控制反轉 ---- 將創建對象的權力由開發者交 給 Spring(緩解對象和對象之間的耦合度)
在傳統模式下,對象的創建和賦值,都是由開發者自己手動完成,事實情況下,開發者只關心如何獲取賦值好的對象,但是並不希望自己手動進行創建對象和賦值的事情(spring中所有的對象都是從實例工廠中自動創建,涉及到簡單工廠模式)
IOC底層原理
- xml解析(負責讀取配置文件中 Bean 的相關信息)
- 簡單工廠模式(藉助 BeanFactory 完成對象的實例化和返回)
- 反射(不使用 new 創建對象的根本原因)
簡單工廠模式
優點:
- 設計與實現分離(開發者不需要關心對象是如何創建出來的)
- 如果要拓展業務,並不會影響之前的業務,只需要拓展子類即可
IOC容器的兩種實現方式
- BeanFactory:是Spring內部使用的介面,不建議給開發人員使用,該容器載入配置文件時,並不會創建響應對象,當開發者嘗試獲取對象的時候,才會創建對象(類似懶漢模式,具有延遲載入的特性)
- ApplicationContext:BeanFactory的子介面,一般由開發人員使用,該容器在載入配置文件的時候,就會創建對象(類似餓漢模式,不會出現併發安全問題,線程安全)
DI 依賴註入 ---- 在你配置好 bean 的情況下,由 Spring 幫你完成對象的賦值
優點:
- 實現了介面和實現的分離
- 組件化的思想,分離關註點,使用介面時,不再關註實現
Spring 的 bean 管理
⭐Bean的聲明周期
-
常規五步聲明周期
通過構造器創建 bean 實例 => 通過反射調用 setter 方法完成屬性賦值 => 調用 bean 的初始化方法 => 獲取 bean 實例 => 當容器關閉的時候, 調用 bean 的銷毀方法
bean創建(IOC)
-
基於xml的配置方式
結構分析
<bean id="person" class="com.iweb.entity.Person" scope="prototype"/>
id
對象的唯一標識,通過 id 獲取 bean 實例class
對象所屬類的完整路徑,用於提供給 spring 藉助反射完成的對象創建scope
表示單/多實例模式<!-- 屬性註入--> <bean id="dog" class="com.iweb.entity.Dog"> <property name="name" value="dog01"/> <property name="type" value="dogType01"/> </bean> <!-- 構造註入,利用構造函數實現註入 未解決,爆紅!!!!!!!!--> <bean id="dog" class="com.iweb.entity.Dog"> <constructor-arg name="name" value="dog01"/> </bean> <!-- 空值註入,手動註入空值--> <bean id="dog" class="com.iweb.entity.Dog"> <property name="name"><null/></property> </bean> <!-- 特殊符號註入--> <bean id="dog" class="com.iweb.entity.Dog"> <property name="name"> <value><![CDATA[(-.-)]]></value> </property> </bean> <!-- 外部 bean 註入(引用綁定)--> <bean id="dog" class="com.iweb.entity.Dog"> <property name="name" value="dog01" /> <property name="type" value="type01" /> </bean> <bean id="person" class="com.iweb.entity.Person"> <property name="dog" ref="dog" /> </bean> <!-- 內部 bean 註入(只能在某一個 bean 的內部訪問它,其他 bean 無法訪問內部bean)--> <bean id="person" class="com.iweb.entity.Person"> <property name="dog"> <bean class="com.iweb.entity.Dog"> <property name="name" value="dog01" /> <property name="type" value="type01" /> </bean> </property> </bean> <!-- 級聯賦值--> <bean id="person" class="com.iweb.entity.Person"> <property name="dog" ref="dog" /> <property name="dog.type" value="type01" /> <property name="dog.name" value="dog01" /> </bean> <bean id="dog" class="com.iweb.entity.Dog" /> <!-- 集合註入 => 數組, list, map, set--> <bean id="person" class="com.iweb.entity.Person"> <!-- 數組註入--> <property name="hobbiesArray"> <array> <value>games</value> <value>coding</value> </array> </property> <!-- list集合註入--> <property name="hobbiesList"> <list> <value>games</value> <value>coding</value> </list> </property> <!-- set集合註入--> <property name="hobbiesSet"> <set> <value>games</value> <value>coding</value> </set> </property> <!-- map集合註入--> <property name="hobbiesMap"> <map> <entry key="games" value="游戲" /> <entry key="coding" value="編碼" /> </map> </property> </bean> <!-- Spring中管理了兩種Bean 1. 普通Bean 在配置文件中定義的類型,與返回類型保持一致 2. FactoryBean 在配置文件中定義的類型和返回的類型可以不一致 錶面上是 factoryBeanDemo 類, 實際上是該類下的 dog 類 原理類似於 @Configuration 和 @Bean 註解 --> <bean id="factoryBeanDemo" class="com.iweb.entity.FactoryBeanDemo" />
-
基於註解方式