Spring快速筆記1
概述:
Spring的概述、SpringIOC入門(XML)、Spring的Bean管理、Spring屬性注入
Spring的IOC的註解方式、Spring的AOP開發(XML)
Spring的AOP的註解開發、Spring的宣告式事務、JdbcTemplate。
SSH的整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用。
1. Spring概述
輕量級的Java開源框架,與2003年興起。Spring是一個分層的Java SE/EE一站式(FullStack)輕量級的開源框架。Spring:SE/EE開發的一站式
-
一站式框架:有EE開發的每一層解決方案。
-
WEB層 :SpringMVC
-
Service層 :Spring的Bean管理,Spring宣告式事務
-
DAO層 :Spring的Jdbc模板,Spring的ORM模組:hibernate,mybatis , jdbcTemplate
–> spring-data
-
-
它是為了解決企業應用開發的複雜性而建立的。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個元件,同時為 J2EE 應用程式開發提供整合的框架。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是控制反轉(IoC)和麵向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。
-
輕量級:與EJB對比,依賴資源少,銷燬的資源少
-
Spring的核心:控制反轉(IoC)和麵向切面程式設計(AOP)
-
Spring的優勢:
-
方便解耦,簡化開發 (高內聚低耦合)
• Spring就是一個大工廠(容器),可以將所有物件建立和依賴關係維護,交給Spring管理
• spring工廠是用於生成bean
-
AOP程式設計的支援
• Spring提供面向切面程式設計,可以方便的實現對程式進行許可權攔截、執行監控等功能
-
宣告式事務的支援
• 只需要通過配置就可以完成對事務的管理,而無需手動程式設計
-
方便程式的測試
• Spring對Junit4支援,可以通過註解方便的測試Spring程式
-
方便整合各種優秀框架
• Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支援
-
降低JavaEE API的使用難度
• Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠端呼叫等),都提供了封裝,使這些API應用難度大大降低
-
-
Spring版本:3.x/4.x/5.x
2. 體系結構
- 下載使用:http://spring.io/
3. IOC:控制反轉
Inversion of Control:將物件的建立權反轉給(交給)Spring,Spring就是一個大的容器、大工廠。
3.1 構建步驟:
建立工程->匯入JAR包(4核心+1個依賴)->配置檔案後原始碼中使用
3.2 工程
-
docs :Spring的開發規範和API——doc下有pdf版本文件:spring開發規範
-
libs :Spring的開發的jar和原始碼
-
schema :Spring的配置檔案的約束
3.3 為什麼使用IOC
與開發中的設計模式有關:從傳統的直接建立物件的模式,到“介面+實現類”的模式,再到簡單工廠模式;主要是在一步步進行程式模組間的解耦問題,而Spring是目前最優秀的解耦方式組織成的框架。Spring就是一個自動化的大工廠。
解耦的主要作用:OCP原則——對原始碼修改的關閉、對擴充套件的開放。尤其在大型專案組織中見效。
3.4 示例
-
使用Spring來進行簡單工廠的代替,通過配置檔案,Spring能夠解析XMl檔案並使用底層的反射機制進行例項的生產。
-
Spring採用Schema形式的xml配置檔案,一般開發中直接在SRC目錄下,慣例命名為
applicationContext.xml
。基本的配置,名稱空間等可以在spring解析目錄下的\docs\spring-framework-reference\html\xsd-configuration.html
找到。<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 --> <bean id="userDao" class="com.leehao.springlearning.spring1.UserDaoImpl"></bean> </beans> -------------------------------------------------------------------------------- public void demo1(){ //解析配置檔案 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //直接獲取bean UserDao userDao = applicationContext.getBean(UserDao.class); userDao.save(); }
3.5 IOC和DI
IOC就是把控制權交給spring,類的例項通過其去構造。而DI則是在IOC的條件前提下,Spring管理當前類時,可以把與之依賴的屬性注入(設定)到當前物件中。
4. Spring的工廠類
Spring的兩個工廠類BeanFactory和ApplicationContext,是兩個不同的版本,ApplicationContext繼承BeanFactory。
-
Bean載入的兩種情形:
-
使用BeanFactory,慢載入過程;在第一次呼叫Bean時才會新建物件
-
使用ApplicationContext,載入完xml檔案後,即刻初始化物件。
-
ApplicationContext有兩個實現類
-
ClassPathXmlApplicationContext :載入類路徑下src的配置檔案
-
FileSystemXmlApplicationContext :載入檔案系統下的配置檔案
-
-
5. Spring 的配置
5.1 Bean配置
-
ID和Name:
-
id :使用了約束中的唯一約束。裡面不能出現特殊字元的。
-
name :沒有使用約束中的唯一約束(理論上可以出現重複的,但是實際開發不能出現的)。裡面可以出現特殊字元。n Spring和Struts1框架整合的時候使用:<bean name="/user" class=""/>
-
-
生命週期:
-
init-method :Bean被初始化的時候執行的方法
-
destroy-method :Bean被銷燬的時候執行的方法(Bean是單例建立的,關閉工廠的例項時會觸發;多例時不會觸發)
-
-
Bean的作用範圍
- scope:Bean的作用範圍,5個取值;
- singleton :預設的,Spring會採用單例模式建立這個物件。
- prototype :多例模式。(Struts2和Spring整合一定會用到)
- request :應用在web專案中,Spring建立這個類以後,將這個類存入到request範圍中
- session :應用在web專案中,Spring建立這個類以後,將這個類存入到session範圍中
- globalsession :應用在web專案中,必須在porlet環境下使用(如百度和百度地圖的子網站等)。但是如果沒有這種環境,相當於session。
- scope:Bean的作用範圍,5個取值;
5.2 屬性注入
-
使用構造方式的注入——xml
-
使用set方法的注入——xml
<bean id="car" class="com.leehao.springlearning.DI.Car" > <property name="name" value="BMW"></property> <property name="price"> <value>100000</value> </property> </bean> <bean id="user" class="com.leehao.springlearning.DI.User"> <constructor-arg name="name" value="真三"></constructor-arg> <constructor-arg name="car" ref="car"></constructor-arg> </bean>
-
使用帶名稱空間的方式注入——xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <!-- 使用名稱空間p --> <bean id="car2" class="com.leehao.springlearning.DI.Car" p:name="QQ" p:price="1000"/>
-
SpEL(Spring Expression Language)的方式注入:去除了value-ref,所有的屬性全都使用name和value兩個標籤決定。在SpEL中,value的值使用
#{SpEl}
的方式複製,可以是常量、表示式、操作、Bean物件和其他物件等。<property name="" value="#{表示式}">-
#{123}、#{‘jack’} : 數字、字串
-
#{beanId} :另一個bean引用
-
#{beanId.propName} :操作資料
-
#{beanId.toString()} :執行方法
-
#{T(類).欄位|方法} :靜態方法或欄位
<!-- SpEL --> <bean id="car3" class="com.leehao.springlearning.DI.Car" > <property name="name" value="#{'TT'}"></property> <property name="price" value="#{200+300}"></property> </bean> <bean id="car4" class="com.leehao.springlearning.DI.Car"> <property name="name" value="#{user.name}"></property> </bean>
-
5.3 集合屬性的注入
-
集合注入:在xml中的property加入子標籤,可以注入set/list/map等集合屬性
- property中普通資料標籤<value>
- 引用資料標籤<ref>
<!-- 集合型別的注入 --> <bean id="collectionBean" class="com.leehao.springlearning.DI.CollectionBean"> <!-- list和陣列一樣 --> <property name="stus"> <list> <value>張三</value> <value>李四</value> </list> </property> <property name="list"> <list> <value>AAAAA</value> <value>BBBBB</value> </list> </property> <property name="mySet"> <set> <value>你好</value> <value>當然</value> </set> </property> <property name="map"> <map> <entry key="aaa" value="888"/> <entry key="bbb" value="999"/> </map> </property> </bean>
5.4 Spring建立Bean的三種方式
-
預設工廠、靜態工廠、例項工廠
-
預設工廠,Spring就是一個大工廠、大容器;預設使用無參的建構函式進行。這種方式,Bean必須含有無參的建構函式
<!-- 配置Bean --> <bean id="userDao" class="com.leehao.springlearning.spring1.UserDaoImpl"/> --------------------------------------------------------------------------- ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.save();
-
靜態工廠,常用與spring整合其他框架(工具)。值得注意的是,一旦在spring中配置了靜態工廠,所有的獲取Bean都會通過靜態工廠的工廠方法去建立,沒有則返回null。
<!-- 靜態工廠 --> <bean id="userDao2" class="com.leehao.springlearning.factory.StaticFactory" factory-method="createUserDao"/> --------------------------------------------------------------------------- public class StaticFactory { public static UserDao createUserDao() { System.out.println("Static Factory..."); return new UserDaoImpl(); } }
-
例項工廠,必須先有工廠例項物件,通過例項物件建立物件。提供所有的方法都是“非靜態”的。
public class InstanceFactory { /** * 例項工廠,不再是static的方法建立新物件 */ public UserDao createUserDao() { System.out.println("instance ...."); return new UserDaoImpl(); } } -------------------------------------------------------------------- <!-- 例項工廠 --> <bean id="myfac" class="com.leehao.springlearning.factory.InstanceFactory" /> <bean id="userDao3" factory-bean="myfac" factory-method="createUserDao" />
-
實驗中發現,其實使用ClassXMLPathApplicationContext進行初始化的時候,無論是靜態工廠、還是例項工廠,都會被解析完然後去實現。在解析完xml檔案後,能夠看到已經建立了各種工廠方法已經被執行了。
-
-
Bean的種類:普通、FactoryBean和BeanFactory
- 普通:<id= ,calss=A>,spring直接給建立A的例項,並返回
- BeanFactory生產任意的bean,是一個工廠類
- FactoryBean是一個特定的Bean,只生產某一特定的物件例項。Bean必須實現Factorybean介面,提供Getobject方法返回特定的bean. <id, class=FB> 建立FB例項,呼叫getObject,返回方法返回值。例如ProxyFactoryBean
5.5 Spring的分模組開發
和struts等框架一樣,Spring也可以分模組各自開發,具有不同的xml檔案,在總的applicationContext.xml檔案中引入各個模組即可。
-
方式一:使用時,可以使用ApplicationContext工廠,載入多個xml檔案進行初始化
-
方式二:多個檔案引用到一個最終載入的檔案中,使用import:
<import resource="com/application2.xml"/>