框架,即framework。是對特定應用領域中的應用系統的部分設計和實現的總體結構。就至關於讓別人幫你完成一些基礎工做,它能夠處理系統不少細節問題,並且框架通常是成熟,穩健的。java
Spring是一個IOC(DI)和AOP容器框架mysql
Spring的優良特性程序員
① 非侵入式:基於Spring開發的應用中的對象能夠不依賴於Spring的API正則表達式
② 依賴注入:DI——Dependency Injection,反轉控制(IOC)最經典的實現。spring
③ 面向切面編程:Aspect Oriented Programming——AOPsql
④ 容器:Spring是一個容器,由於它包含而且管理應用對象的生命週期編程
⑤ 組件化:Spring實現了使用簡單的組件配置組合成一個複雜的應用。在 Spring 中可使用XML和Java註解組合這些對象。數組
⑥ 一站式:在IOC和AOP的基礎上能夠整合各類企業應用的開源框架和優秀的第三方類庫(實際上Spring 自身也提供了表述層的SpringMVC和持久層的Spring JDBC)。app
Spring模塊框架
IOC(Inversion of Control):反轉控制
反轉了資源的獲取方向——改由容器主動的將資源推送給須要的組件,開發人員不須要知道容器是如何建立資源對象的,只須要提供接收資源的方式便可。這種行爲也稱爲查找的被動形式。
DI(Dependency Injection):依賴注入
即組件以一些預先定義好的方式(例如:setter 方法)接受來自於容器的資源注入。
總結: IOC 就是一種反轉控制的思想, 而DI是對IOC的一種具體實現。
導入Spring框架jar包
建立配置文件,經常使用文件名:applicationContext.xml或beans.xml
1)在經過IOC容器讀取Bean的實例以前,須要先將IOC容器自己實例化。
2)Spring提供了IOC容器的兩種實現方式
① BeanFactory:IOC容器的基本實現,是Spring內部的基礎設施,是面向Spring自己的,不是提供給開發人員使用的。
② ApplicationContext:BeanFactory的子接口,提供了更多高級特性。面向Spring的使用者,幾乎全部場合都使用ApplicationContext而不是底層的BeanFactory。
ClassPathXmlApplicationContext:對應類路徑下的XML格式的配置文件
FileSystemXmlApplicationContext:對應文件系統中的XML格式的配置文件
在初始化時就建立單例的bean,也能夠經過配置的方式指定建立的Bean是多實例的。
是ApplicationContext的子接口,包含一些擴展方法
refresh()和close()讓ApplicationContext具備啓動、關閉和刷新上下文的能力。因此要關閉ApplicationContext須要new此接口的對象調用close()方法
專門爲WEB應用而準備的,它容許從相對於WEB根目錄的路徑中完成初始化工做
從IOC容器中獲取bean,推薦同時指定bean的id值和類型
//經過在XML文件中配置的id及class類型獲取對象 HelloWorld helloWorld = cxt.getBean("helloWorld",HelloWorld.class);
bean標籤:將bean裝配到springIOC容器中
bean標籤中屬性
id:對象惟一標識(能夠不寫,若是書寫必須是惟一值)
class:裝配bean的全類名
bean子標籤
property:爲對象中的屬性賦值
name:屬性名
value:屬性值
constructor-arg:經過構造器賦值
1. 經過bean的setXxx()方法賦值
2. 經過bean的構造器賦值,注意:若是構造器中參數類型兼容,可能出現錯誤賦值狀況。
<bean id="student" class="com.bean.Student01"> <property name="name" value="小明"></property> <constructor-arg name="age" value="18"></constructor-arg> </bean>
3. p名稱空間
<bean id="student" class="com.bean.Student01" p:name="小明" p:age="18"> </bean>
1. 字面量
基本數據類型及其封裝類、String等類型均可以採起字面值注入的方式
若字面值中包含特殊字符,可使用<![CDATA[]]>把字面值包裹起來或轉義字符
2. null值
<property name= "bookName"> <null/> </property>
3. 給bean的級聯屬性賦值
設置級聯屬性後會修改原屬性值,通常不使用
4. 外部已聲明的bean、引用其餘的bean:此時value已經知足不了需求了要用ref屬性
<bean id="school" class="com.bean.School"> <property name="stus" ref="stu"></property> </bean>
5. 內部bean
當bean實例僅僅給一個特定的屬性使用時,能夠將其聲明爲內部bean。內部bean聲明直接包含在<property>或<constructor-arg>元素裏,不須要設置任何id或name屬性
內部bean不能使用在任何其餘地方,即不能在容器中直接獲取內部bean
數組和List:
須要指定<list>標籤,在標籤裏包含一些元素。這些標籤能夠經過<value>指定簡單的常量值,經過<ref>指定對其餘Bean的引用。經過<bean>指定內置bean。經過<null/>指定空元素。甚至能夠內嵌其餘集合。
數組的定義和List同樣,都使用<list>元素。
配置java.util.Set須要使用<set>標籤,定義的方法與List同樣。
<bean id="shop" class="com.spring.bean.Shop" > <property name= "bookList"> <!-- 以bean的引用爲值的List集合 --> <list> <ref bean= "book01"/> <ref bean= "book02"/> </list> </property> </bean >
Map
經過<map>標籤訂義,<map>標籤裏可使用多個<entry>做爲子標籤。每一個條目包含一個鍵和一個值。
必須在<key>標籤裏定義鍵,由於鍵和值的類型沒有限制,因此能夠自由地爲它們指定<value>、<ref>、<bean>或<null/>元素。
<bean id="cup" class="com.spring.bean.Cup"> <property name="bookMap"> <map> <entry key="book" value-ref="bookMap"></entry> <entry> <key> <value>bookKey01</value> </key> <ref bean="book01"/> </entry> </map> </property> </bean>
集合類型的bean
將集合bean的配置提取到外面,可供其餘bean引用,實現重用
<util:list id="schoolList"> <ref bean="stu"></ref> </util:list>
若是須要程序員參與建立bean的過程之中,使用FactoryBean
工廠bean跟普通bean不一樣,其返回的對象不是指定類的一個實例,其返回的是該工廠bean的getObject方法所返回的對象。
工廠bean必須實現org.springframework.beans.factory.FactoryBean接口,並重寫3個方法
<bean id="schoolFactory" class="com.factoryBeanImpl.SchoolFactory"> </bean>
能夠在<bean>元素的scope屬性裏設置bean的做用域,以決定這個bean是單實例的仍是多實例的。
singleton,是全部bean的默認做用域。注意:工廠bean是經過isSingleton()方法設置是否單例的
當bean的做用域爲單例時,Spring會在IOC容器對象建立時就建立bean的對象實例
而當bean的做用域爲prototype時,IOC容器在獲取bean的實例時建立bean的實例對象
在配置bean時,經過init-method和destroy-method 屬性爲bean指定初始化和銷燬方法
Spring IOC容器對bean的生命週期進行管理的過程:
① 經過構造器或工廠方法建立bean實例
② 爲bean的屬性設置值和對其餘bean的引用
③ 調用bean的初始化方法
④ bean可使用了
⑤ 當容器關閉時,調用bean的銷燬方法
<bean id="stu" class="com.bean.Student" init-method="init" destroy-method="destroy"> </bean>
bean的後置處理器
① bean後置處理器容許在調用初始化方法先後對bean進行額外的處理
② bean後置處理器對IOC容器裏的全部bean實例逐一處理,而非單一實例。
③ bean後置處理器須要實現接口:org.springframework.beans.factory.config.BeanPostProcessor。
在初始化方法被調用先後,Spring將把每一個bean實例分別傳遞給上述接口的如下兩個方法:
●postProcessBeforeInitialization(Object bean, String beanId):初始化以前執行
●postProcessAfterInitialization(Object, String):初始化以後執行
注意
參數bean:IOC容器中建立的對象
參數beanId:IOC容器中建立對象的beanId
將一部分信息提取到bean配置文件的外部,以properties格式的屬性文件保存起來,同時在bean的配置文件中引用properties屬性文件中的內容,從而實現一部分屬性值在發生變化時僅修改properties屬性文件便可。
1. 建立properties屬性文件
jdbc.username=root
jdbc.password=12345
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
2. 引入context名稱空間
3.指定properties屬性文件的位置
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
classpath: 引入當前項目中類路徑下的資源文件
classpath*: 引入所項目中類路徑下的資源文件
4.從properties屬性文件中引入屬性值
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" p:username="${jdbc.username}" p:password="${jdbc.password}" p:driverClassName="${jdbc.driverClass}" p:url="${jdbc.url}"> </bean>
手動裝配:在XML配置文件中以value或ref的方式明確指定屬性值都是手動裝配。
自動裝配:根據指定的裝配規則,不須要明確指定,Spring容器會自動將匹配的屬性值注入bean中。
注意:自動裝配屬性的數據類型,只能是[非字面量]值。[字面量]值不能自動裝配。即基本數據類型(包裝類)+String類型都不可自動裝配
基於xml,自動裝配(不推薦)
在bean中添加autowire="byName|byType"
<bean id="student" class="com.springdemo.autowired.Student" autowire="byType"></bean>
byName:經過類中的屬性名與bean中id(IOC容器中的id匹配)。
* 若是數值一致,匹配成功。 若是不一致,裝配失敗(不會報錯,裝配null值)
byType:經過類中的屬性類型與bean中的class匹配
* 若是一致,匹配成功。
* 若是未找到匹配類型,裝配失敗(裝配null值)
* 若是匹配到多個兼容類型(父子關係:裝配失敗,結果會報錯)
基於註解,自動裝配bean
需在XML文檔中先添加掃描組件標籤,指定需被裝配bean的package
<context:component-scan base-package="com.bookStore" use-default-filters="true"></context:component-scan>
base-package:Spring容器會掃描這個基類包及其子包中的全部類。當須要掃描多個包時可使用逗號分隔。
若是僅但願掃描特定的類而非基包下的全部類,可以使用resource-pattern屬性過濾特定的類
use-default-filters="true":默認組件掃描(掃描當前base-package下的包及其子包),false:不掃描...
經過子標籤控制包含與排除
<context:include-filter>包含掃描,掃描指定匹配規則下的包及其子包
注意:經過將use-default-filters屬性設置爲false,禁用默認過濾器,而後掃描的就只是include-filter中的規則指定組件了
<context:exclude-filter>排除掃描,子節點表示要排除在外的目標類
注意:將use-default-filters屬性設置爲true或默認
過濾表達式,指定類型
類別 |
示例 |
說明 |
annotation |
com.XxxAnnotation |
過濾全部標註了XxxAnnotation的類。這個規則根據目標組件是否標註了指定類型的註解進行過濾。 |
assignable |
com.BaseXxx |
過濾全部BaseXxx類的子類。這個規則根據目標組件是不是指定類型的子類的方式進行過濾。 |
aspectj |
com.*Service+ |
全部類名是以Service結束的,或這樣的類的子類。這個規則根據AspectJ表達式進行過濾。 |
regex |
com\.anno\.* |
全部com.anno包下的類。這個規則根據正則表達式匹配到的類名進行過濾。 |
custom |
com.XxxTypeFilter |
使用XxxTypeFilter類經過編碼的方式自定義過濾規則。該類必須實現org.springframework.core.type.filter.TypeFilter接口 |
4個註解:
1) 普通組件:@Component
2) 表述層控制器組件:@Controller
3) 業務邏輯層組件:@Service
4) 持久化層組件:@Repository
組件命名規則
①默認狀況:使用組件的簡單類名首字母小寫做爲bean的id
②使用組件註解的value屬性指定bean的id: @Component(value="指定id名")
實現原理
在指定要掃描的包時,<context:component-scan> 元素會自動註冊一個bean的後置處 理器:AutowiredAnnotationBeanPostProcessor的實例。該後置處理器能夠自動裝配標記 了@Autowired、@Resource或@Inject註解的屬性。
注入方式:既不是set注入,也不是構造注入。本質:是經過反射注入。
自動裝配規則
優先使用byType進行裝配,若是能惟一匹配,則裝配成功。
若是匹配到多個兼容類型的bean,再照byName方式匹配(進行惟一篩選)
若是經過byName惟一肯定bean,則裝配成功,不然裝配失敗。
構造器、普通字段(即便是非public)、一切具備參數的方法均可以使用@Autowired註解
若某一屬性容許不被裝配,能夠設置@Autowired註解的required屬性爲 false
required:默認值是true,必須裝配該bean
required值爲false時,若是IOC容器中存在該bean,則裝配。若是沒有,則不裝配。
@Autowired註解也能夠應用在數組類型的屬性上
@Autowired註解也能夠應用在集合屬性上,此時Spring讀取該集合的類型信息,而後自動裝配全部與之兼容的bean。
@Autowired註解用在java.util.Map上時,若該Map的鍵值爲String,那麼 Spring將自動裝配與值類型兼容的bean做爲值,並以bean的id值做爲鍵。
必要時,能夠組合使用@Qualifier(value="userDaoMyBatisImpl")註解指定beanId名
Spring甚至容許在方法形參上標註@Qualifiter註解以指定注入bean的名稱。