Spring第一天:Spring的概述、SpringIOC入門(XML)、Spring的Bean管理、Spring屬性注入
以前也學習過Spring框架,不過好久沒用,當時學完也沒做什麼總結,都忘的差不多了,今天再從頭開始學習一遍。無論是SSH還是SSM都離不開Spring,所以Spring還是很重要的,對於一個想要從事JavaEE開發的人,一定要好好學習Spring框架。Spring的學習計劃如下:
- 第一天:Spring的概述、SpringIOC入門(XML)、Spring的Bean管理、Spring屬性注入
- 第二天:Spring的IOC的註解方式、Spring的AOP開發(XML)
- 第三天:Spring的AOP的註解開發、Spring的宣告式事務、JdbcTemplate。
- 第四天:SSH的整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用。
目錄
1.Spring的概述
1.1Spring的概述
1.1.1什麼是Spring
Spring是一個開放原始碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向介面的程式設計思想貫穿整個系統應用。Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson建立。簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。
- Spring:JavaSE/EE開發的一站式框架。
- 一站式框架:JavaSE/EE開發的每一層的解決方案。
- WEB層 :SpringMVC
- Service層 :Spring的Bean管理,Spring宣告式事務
- DAO層 :Spring的Jdbc模板,Spring的ORM模組
- 一站式框架:JavaSE/EE開發的每一層的解決方案。
1.1.2為什麼學習Spring
輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR檔案裡釋出。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的物件不依賴於Spring的特定類。
控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了低耦合。當應用了IoC,一個物件依賴的其它物件會通過被動的方式傳遞進來,而不是這個物件自己建立或者查詢依賴物件。你可以認為IoC與JNDI相反——不是物件從容器中查詢依賴,而是容器在物件初始化時不等物件請求就主動將依賴傳遞給它。
面向切面——Spring提供了面向切面程式設計的豐富支援,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用物件只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支援。
容器——Spring包含並管理應用物件的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被建立——基於一個可配置原型(prototype),你的bean可以建立一個單獨的例項或者每次需要時都生成一個新的例項——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。
框架——Spring可以將簡單的元件配置、組合成為複雜的應用。在Spring中,應用物件被宣告式地組合,典型地是在一個XML檔案裡。Spring也提供了很多基礎功能(事務管理、持久化框架整合等等),將應用邏輯的開發留給了你。
MVC——Spring的作用是整合,但不僅僅限於整合,Spring 框架可以被看做是一個企業解決方案級別的框架。客戶端傳送請求,伺服器控制器(由DispatcherServlet實現的)完成請求的轉發,控制器呼叫一個用於對映的類HandlerMapping,該類用於將請求對映到對應的處理器來處理請求。HandlerMapping 將請求對映到對應的處理器Controller(相當於Action)在Spring 當中如果寫一些處理器元件,一般實現Controller 介面,在Controller 中就可以呼叫一些Service 或DAO 來進行資料操作 ModelAndView 用於存放從DAO 中取出的資料,還可以存放響應檢視的一些資料。 如果想將處理結果返回給使用者,那麼在Spring 框架中還提供一個檢視元件ViewResolver,該元件根據Controller 返回的標示,找到對應的檢視,將響應response 返回給使用者。
所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的程式碼。它們也為Spring中的各種模組提供了基礎支援。
1.1.3Spring的版本
Spring3.x和Spring4.x,今天學習Spring4.x
1.2Spring的入門(IOC)
1.2.1什麼IOC
- IOC: Inversion of Control(控制反轉)。
- 控制反轉:將物件的建立權反轉給(交給)Spring。
1.2.2下載Spring的開發包
1.2.3解壓Spring的開發包
- docs :Spring的開發規範和API
- libs :Spring的開發的jar和原始碼
- schema :Spring的配置檔案的約束
1.2.4建立web專案,引入jar包
1.2.5建立介面和類
package com.albertyy.spring.demo1;
/**
* 使用者管理DAO層介面
* @author yxy
*
*/
public interface UserDAO {
public void save();
}
package com.albertyy.spring.demo1;
/**
* 使用者管理DAO層實現類
* @author yxy
*
*/
public class UserDAOImpl implements UserDAO {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("UserDAOImpl執行了..."+name);
}
}
- 問題:
- 如果底層的實現切換了,需要修改原始碼,能不能不修改程式原始碼對程式進行擴充套件呢?
1.2.6將實現類交給Spring管理
在spring的解壓路徑下:spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
在專案src路徑下面新建applicationContext.xml配置檔案:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- Spring的入門的配置==================== -->
<bean name="userDAO" class="com.albertyy.spring.demo1.UserDAOImpl">
<property name="name" value="李慢慢" />
</bean>
</beans>
1.2.7編寫測試類
@Test
/**
* 傳統方式的呼叫
*/
public void demo1(){
UserDAOImpl userDAO = new UserDAOImpl();
userDAO.setName("王婉瑜");
userDAO.save();
}
@Test
/**
* Spring的方式的呼叫
*/
public void demo2(){
// 建立Spring的工廠
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDAO userDAO = (UserDAO) applicationContext.getBean("userDAO");
userDAO.save();
}
1.2.8IOC和DI(*****)
- IOC:控制反轉,將物件的建立權反轉給了Spring。
- DI:依賴注入,前提必須有IOC的環境,Spring管理這個類的時候將類依賴的屬性注入(設定)進來。
- 面向物件的時候類和類的關係
依賴
Class A{
}
Class B{
public void xxx(A a){
}
}
繼承:(is a)
Class A{
}
Class B extends A{
}
聚合:(has a)
2Spring的工廠類
2.1Spring工廠類的結構圖
ApplicationContext繼承BeanFactory。
2.2BeanFactory:老版本的工廠類
BeanFactory:呼叫getBean的時候,才會生成類的例項。
2.3ApplicationContext:新版本的工廠類
- ApplicationContext:載入配置檔案的時候,就會將Spring管理的類都例項化。
- ApplicationContext有兩個實現類
- ClassPathXmlApplicationContext :載入類路徑下的配置檔案
- FileSystemXmlApplicationContext :載入檔案系統下的配置檔案
3Spring的配置
3.1XML的提示配置
3.2Bean的相關的配置
3.2.1<bean>標籤的id和name的配置
- id :使用了約束中的唯一約束,裡面不能出現特殊字元。
- name :沒有使用約束中的唯一約束(理論上可以出現重複的,但是實際開發中是不能出現重複的)。裡面可以出現特殊字元。
- Spring和Struts1框架整合的時候
- <bean name=”/user” class=””/>
3.2.2Bean的生命週期的配置(瞭解)
- init-method :Bean被初始化的時候執行的方法
- destroy-method :Bean被銷燬的時候執行的方法(Bean是單例建立,工廠關閉)
<!-- Spring的sBean的生命週期的配置=========== -->
<bean id="customerDAO" class="com.albertyy.spring.demo2.CustomerDAOImpl" scope="prototype" init-method="setup" destroy-method="destroy"/>
3.2.3Bean的作用範圍的配置(重點)
- scope:Bean的作用範圍
- singleton :預設的,Spring會採用單例模式建立這個物件。
- prototype :多例模式。(Struts2和Spring整合一定會用到)
- request :應用在web專案中,Spring建立這個類以後,將這個類存入到request範圍中。
- session :應用在web專案中,Spring建立這個類以後,將這個類存入到session範圍中。
- globalsession :應用在web專案中,必須在porlet環境下使用。但是如果沒有這種環境,相對於session。
4.Spring的Bean管理(XML方式)
4.1Spring的Bean的例項化方式(瞭解)
Bean已經都交給Spring管理,Spring建立這些類的時候,有幾種方式:
4.1.1無參構造方法的方式(預設)
- 編寫類
package com.albertyy.spring.demo3;
/**
* 無引數構造方法方式
* @author yxy
*
*/
public class Bean1 {
public Bean1() {
super();
System.out.println("Bean1的無引數的構造方法執行了...");
}
}
- 編寫配置
<!-- 無參構造方法 -->
<bean id="bean1" class="com.albertyy.spring.demo3.Bean1"></bean>
4.1.2靜態工廠例項化的方式
- 編寫Bean2的靜態工廠
package com.albertyy.spring.demo3;
/**
* Bean2的靜態工廠
* @author yxy
*
*/
public class Bean2Factory {
public static Bean2 createBean2(){
System.out.println("Bean2Factory中方法執行了...");
return new Bean2();
}
}
- 配置
<!-- 靜態工廠例項化 -->
<bean id="bean2" class="com.albertyy.spring.demo3.Bean2Factory" factory-method="createBean2"></bean>
4.1.3例項工廠例項化的方式
- Bean3的例項工廠
package com.albertyy.spring.demo3;
/**
* Bean3的例項工廠
* @author yxy
*
*/
public class Bean3Factory {
public Bean3 createBean3(){
System.out.println("Bean3的例項工廠執行了...");
return new Bean3();
}
}
- 配置
<!-- 例項工廠例項化 -->
<bean id="bean3Factory" class="com.albertyy.spring.demo3.Bean3Factory" ></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3" ></bean>
4.2Spring的屬性注入
4.2.1構造方法的方式的屬性注入
- 構造方法的屬性注入
<!-- 構造方法的方式 -->
<bean id="car" class="com.albertyy.spring.demo4.Car">
<constructor-arg name="name" value="寶馬"/>
<constructor-arg name="price" value="800000"/>
</bean>
4.2.2Set方法的方式的屬性注入
- Set方法的屬性注入
<!-- set方法的方式 -->
<bean id="car2" class=" com.albertyy.spring.demo4.Car2">
<property name="name" value="賓士"/>
<property name="price" value="1000000"/>
</bean>
- Set方法設定物件型別的屬性
<!-- set方法注入物件型別的屬性 -->
<bean id="employee" class=" com.albertyy.spring.demo4.Employee">
value:設定普通型別的值,ref:設定其他的類的id或name
<property name="name" value="濤哥"/>
<property name="car2" ref="car2"/>
</bean>
4.2.3P名稱空間的屬性注入(Spring2.5以後)
- 通過引入p名稱空間完成屬性的注入:
- 寫法:
- 普通屬性 p:屬性名=”值”
- 物件屬性 p:屬性名-ref=”值”
- 寫法:
- P名稱空間的引入
- 使用p名稱空間
<!-- 改為p名稱空間的方式 -->
<bean id="car2" class=" com.albertyy.spring.demo4.Car2" p:name="奇瑞QQ" p:price="30000"></bean>
<bean id="employee" class=" com.albertyy.spring.demo4.Employee" p:name="王東" p:car2-ref="car2"></bean>
4.2.4SpEL的屬性注入(Spring3.0以後)
- SpEL:Spring Expression Language,Spring的表示式語言。
- 語法:
- #{SpEL}
- 語法:
<!-- SpEL的屬性注入 -->
<bean id="carInfo" class="com.albertyy.spring.demo4.CarInfo">
</bean>
<bean id="car2" class="com.albertyy.spring.demo4.Car2">
<property name="name" value="#{carInfo.name}"></property>
<property name="price" value="#{carInfo.calculatorPrice()}"></property>
</bean>
<bean id="employee" class="com.albertyy.spring.demo4.Employee">
<property name="name" value="#{'趙洪'}"></property>
<property name="car2" value="#{car2}"></property>
</bean>
4.3集合型別屬性注入(瞭解)
<!-- Spring的集合屬性的注入============================ -->
<!-- 注入陣列型別 -->
<bean id="collectionBean" class="com.albertyy.spring.demo5.CollectionBean">
<!-- 陣列型別 -->
<property name="arrs">
<list>
<value>王東</value>
<value>趙洪</value>
<value>李冠希</value>
</list>
</property>
<!-- 注入list集合 -->
<property name="list">
<list>
<value>李兵</value>
<value>趙如何</value>
<value>鄧鳳</value>
</list>
</property>
<!-- 注入set集合 -->
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<!-- 注入Map集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
</bean>
5.Spring的分模組開發的配置
5.1在載入配置檔案的時候,載入多個
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
5.2在一個配置檔案中引入多個配置檔案
<import resource="applicationContext2.xml"/>
原始碼:連結: https://pan.baidu.com/s/1RKJ5Cd1XokL-rRpgIdFjkg 提取碼: 7vv2 複製這段內容後開啟百度網盤手機App,操作更方便哦