Spring框架是一個爲Java應用程序的開發提供了綜合、普遍的基礎性支持的Java平臺。Spring幫助開發者解決了開發中基礎性的問題,使得開發人員能夠專一於應用程序的開發。Spring框架自己亦是按照設計模式精心打造,這使得咱們能夠在開發環境中安心的集成Spring框架,沒必要擔憂Spring是如何在後臺進行工做的。 Spring框架至今已集成了20多個模塊。這些模塊主要被分以下圖所示的核心容器、數據訪問/集成,、Web、AOP(面向切面編程)、工具、消息和測試模塊。 java
核心模塊 | 說明 |
---|---|
Spring Core | 核心容器:核心容器提供Spring框架的基本功能。Spring以bean的方式組織和管理Java應用中的各個組件及其關係。Spring使用BeanFactory來產生和管理Bean,它是工廠模式的實現。BeanFactory使用控制反轉(IoC)模式將應用的配置和依賴性規範與實際的應用程序代碼分開 |
Spring Context | 應用上下文: 是一個配置文件,向Spring框架提供上下文信息。Spring上下文包括企業服務,如JNDI、EJB、電子郵件、國際化、校驗和調度功能 |
Spring AOP | 面向切面編程: 是面向對象編程的有效補充和完善,Spring的AOP是基於動態代理實現的,實現的方式有兩種分別是Schema和AspectJ這兩種方式 |
Spring Dao | JDBC和Dao模塊: JDBC、DAO的抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理,和不一樣數據庫供應商所拋出的錯誤信息。異常層次結構簡化了錯誤處理,而且極大的下降了須要編寫的代碼數量,好比打開和關閉連接 |
Spring ORM | 對象實體映射: Spring框架插入了若干個ORM框架,從而提供了ORM對象的關係工具,其中包括了Hibernate、JDO和 IBatis SQL Map等,全部這些都聽從Spring的通用事物和DAO異常層次結構。 |
Spring Web | Web模塊: Web上下文模塊創建在應用程序上下文模塊之上,爲基於web的應用程序提供了上下文。因此Spring框架支持與Struts集成,web模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工做 |
Spring Web MVC | **MVC模塊:**MVC框架是一個全功能的構建Web應用程序的MVC實現。經過策略接口,MVC框架變成爲高度可配置的。MVC容納了大量視圖技術,其中包括JSP、POI等,模型由JavaBean構成,存放於m當中,而視圖是一個接口,負責實現模型,控制器表示邏輯代碼,由c的事情。Spring框架的功能能夠用在任何J2EE服務器當中,大多數功能也適用於不受管理的環境。Spring的核心要點就是支持不綁定到特定J2EE服務的可重用業務和數據的訪問的對象,毫無疑問這樣的對象能夠在不一樣的J2EE環境,獨立應用程序和測試環境之間重用。 |
序號 | 好處 | 說明 |
---|---|---|
1 | 輕量 | Spring 是輕量的,基本的版本大約2MB。 |
2 | 控制反轉 | Spring經過控制反轉實現了鬆散耦合,對象們給出它們的依賴,而不是建立或查找依賴的對象們。 |
3 | 面向切面編程(AOP) | Spring支持面向切面的編程,而且把應用業務邏輯和系統服務分開。 |
4 | 容器 | Spring 包含並管理應用中對象的生命週期和配置。 |
5 | MVC框架 | Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。 |
6 | 事務管理 | Spring 提供一個持續的事務管理接口,能夠擴展到上至本地事務下至全局事務(JTA)。 |
7 | 異常處理 | Spring 提供方便的API把具體技術相關的異常(好比由JDBC,Hibernate or JDO拋出的)轉化爲一致的unchecked 異常。 |
8 | 最重要的 | 用的人多!!! |
在類圖關係上BeanFactory是ApplicationContext接口的父接口 web
是spring中比較原始的Factory。如XMLBeanFactory就是一種典型的BeanFactory。原始的BeanFactory沒法支持spring的許多插件,如AOP功能、Web應用等。面試
ApplicationContext接口是由BeanFactory接口派生而來,於是具備BeanFactory全部的功能。ApplicationContext以一種更向面向框架的方式工做以及對上下文進行分層和實現繼承,ApplicationContext包還提供瞭如下的功能spring
序號 | 配置方式 |
---|---|
1 | 基於XML的配置 |
2 | 基於註解的配置 |
3 | 基於Java的配置 |
在項目資源目錄下建立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">
</beans>
複製代碼
若是是web項目的話,在web.xml文件添加以下配置:編程
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
複製代碼
若是是java項目能夠經過BeanFactory或ApplicationContext來直接加載Spring容器設計模式
BeanFactory bf =
new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 或者
ApplicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
複製代碼
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
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-4.3.xsd">
<!-- 開啓註解 配置掃描路徑 -->
<context:component-scan base-package="com.dpb.javabean"/>
<!-- 若是有多個路徑 ,號隔開
<context:component-scan base-package="com.dpb.javabean,com.dpb.factory"/>
-->
</beans>
複製代碼
若是是web項目的話,在web.xml文件添加以下配置:安全
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
複製代碼
若是是java項目能夠經過BeanFactory或ApplicationContext來直接加載Spring容器bash
BeanFactory bf =
new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 或者
ApplicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
複製代碼
Spring對Java配置的支持是由@Configuration註解和@Bean註解來實現的。服務器
註解 | 說明 |
---|---|
@Bean | 由@Bean註解的方法將會實例化、配置和初始化一個新對象,這個對象將由Spring的IoC容器來管理 ,@Bean聲明所起到的做用與 元素相似 |
@Configuration | 表示該類是一個配置類。用來定義bean資源 |
@Configuration
public class AppConfig
{
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
複製代碼
若是是web項目的話,在web.xml文件添加以下配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
複製代碼
若是是java項目能夠經過ApplicationContext來加載
public static void main(String[] args) {
ApplicationContext ctx =
new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = ctx.getBean(MyService.class);
myService.doStuff();
}
複製代碼
實現方式 | 說明 |
---|---|
FileSystemXmlApplicationContext | 此容器從一個XML文件中加載beans的定義,XML Bean 配置文件的全路徑名必須提供給它的構造函數 |
ClassPathXmlApplicationContext | 此容器也從一個XML文件中加載beans的定義,這裏,你須要正確設置classpath由於這個容器將在classpath裏找bean配置 |
WebXmlApplicationContext | 此容器加載一個XML文件,此文件定義了一個WEB應用的全部bean |
Spring容器中的bean能夠分爲5個範圍。:
做用域 | 說明 |
---|---|
singleton | 這種bean範圍是默認的,這種範圍確保無論接受到多少個請求,每一個容器中只有一個bean的實例,單例的模式由bean factory自身來維護 |
prototype | 原型範圍與單例範圍相反,爲每個bean請求提供一個實例,原型模式 |
request | 在請求bean範圍內會每個來自客戶端的網絡請求建立一個實例,在請求完成之後,bean會失效並被垃圾回收器回收 |
Session | 與請求範圍相似,確保每一個session中有一個bean的實例,在session過時後,bean會隨之失效 |
global-session | global-session和Portlet應用相關。當你的應用部署在Portlet容器中工做時,它包含不少portlet。若是你想要聲明讓全部的portlet共用全局的存儲變量的話,那麼這全局變量須要存儲在global-session中。全局做用域與Servlet中的session做用域效果相同。 |
確定不是線程安全的,當多用戶同時請求一個服務時,容器會給每個請求分配一個線程,這是多個線程會併發執行該請求多對應的業務邏輯(成員方法),此時就要注意了,若是該處理邏輯中有對該單列狀態的修改(體現爲該單列的成員屬性),則必須考慮線程同步問題.
當一個bean僅被用做另外一個bean的屬性時,它能被聲明爲一個內部bean,爲了定義inner bean,在Spring 的 基於XML的 配置元數據中,能夠在 或\ 元素內使用 元素,內部bean一般是匿名的,它們的Scope通常是prototype。
<?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">
<bean id="CustomerBean" class="com.dpb.common.Customer">
<property name="person" ref="PersonBean"/>
</bean>
<bean id="PersonBean" class="com.dpb.common.Person">
<property name="name" value="波波烤鴨"/>
<property name="address" value="深圳"/>
<property name="age" value="17"/>
</bean>
</beans>
複製代碼
改成內部bean的方式
<?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">
<bean id="CustomerBean" class="com.dpb.common.Customer">
<property name="person">
<bean class="com.dpb.common.Person">
<property name="name" value="波波烤鴨"/>
<property name="address" value="湖南"/>
<property name="age" value="17"/>
</bean>
</property>
</bean>
</beans>
複製代碼
內部 bean 也支持構造器注入
<?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">
<bean id="CustomerBean" class="com.dpb.common.Customer">
<constructor-arg >
<bean class="com.dpb.common.Person">
<property name="name" value="波波烤鴨"/>
<property name="address" value="湖南"/>
<property name="age" value="17"/>
</bean>
</constructor-arg>
</bean>
</beans>
複製代碼
id 或 name 值在bean類是沒有必要以一個內部 bean 呈現
Spring提供如下幾種集合的配置元素:
元素 | 說明 |
---|---|
list | 類型用於注入一列值,容許有相同的值。 |
set | 類型用於注入一組值,不容許有相同的值。 |
map | 類型用於注入一組鍵值對,鍵和值均可覺得任意類型。 |
props | 類型用於注入一組鍵值對,鍵和值都只能爲String類型。 |
<!-- 配置 student對象 -->
<bean class="com.dpb.javabean.Student">
<property name="id" value="10"/>
<property name="name" value="波波烤鴨"/>
<!-- 對象注入 -->
<property name="cat" ref="catId"></property>
<!-- List集合注入 -->
<property name="games">
<list>
<value>LOL</value>
<value>DNF</value>
<value>CS</value>
</list>
</property>
<property name="score">
<map>
<entry key="數學" value="99"/>
<entry key="英語" value="78"/>
<entry key="化學" value="84"/>
</map>
</property>
<property name="props">
<props>
<prop key="userName">admin</prop>
<prop key="password">123</prop>
</props>
</property>
複製代碼
有五種自動裝配的方式,能夠用來指導Spring容器用自動裝配方式來進行依賴注入。
裝配類型 | 說明 |
---|---|
no | 默認的方式是不進行自動裝配,經過顯式設置ref 屬性來進行裝配 |
byName | 經過參數名 自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byname,以後容器試圖匹配、裝配和該bean的屬性具備相同名字的bean。 |
byType | 經過參數類型自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byType,以後容器試圖匹配、裝配和該bean的屬性具備相同類型的bean。若是有多個bean符合條件,則拋出錯誤。 |
constructor | 這個方式相似於byType, 可是要提供給構造器參數,若是沒有肯定的帶參數的構造器參數類型,將會拋出異常。 |
autodetect | 首先嚐試使用constructor來自動裝配,若是沒法工做,則使用byType方式。 |
emsp;經過類型來實現自動注入bean。和@Qualifier註解配合使用能夠實現根據name注入bean。
emsp;和@Autowired一塊使用,在同一類型的bean有多個的狀況下能夠實現根據name注入的需求
emsp;默認是根據name注入bean的,能夠經過設置類型來實現經過類型來注入
Spring支持兩種類型的事務管理:
編程式事務管理:這意味你經過編程的方式管理事務,給你帶來極大的靈活性,可是難維護。 聲明式事務管理:這意味着你能夠將業務代碼和事務管理分離,你只需用註解和XML配置來管理事務。
它爲不一樣的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式。 它爲編程式事務管理提供了一套簡單的API而不是一些複雜的事務API如它爲編程式事務管理提供了一套簡單的API而不是一些複雜的事務API如 它支持聲明式事務管理。它支持聲明式事務管理。 它和Spring各類數據訪問抽象層很好得集成。它和Spring各類數據訪問抽象層很好得集成。
大多數Spring框架的用戶選擇聲明式事務管理,由於它對應用代碼的影響最小,所以更符合一個無侵入的輕量級容器的思想。聲明式事務管理要優於編程式事務管理,雖然比編程式事務管理(這種方式容許你經過代碼控制事務)少了一點靈活性。
Spring容器 從XML 文件中讀取bean的定義,並實例化bean。 Spring根據bean的定義填充全部的屬性。Spring根據bean的定義填充全部的屬性。若是bean實現了BeanNameAware 接口,Spring 傳遞bean 的ID 到 setBeanName方法。 若是Bean 實現了 BeanFactoryAware 接口, Spring傳遞beanfactory 給setBeanFactory 方法。 若是有任何與bean相關聯的BeanPostProcessors,Spring會在postProcesserBeforeInitialization()方法內調用它們。 若是bean實現IntializingBean了,調用它的afterPropertySet方法,若是bean聲明瞭初始化方法,調用此初始化方法。 若是有BeanPostProcessors 和bean 關聯,這些bean的postProcessAfterInitialization() 方法將被調用。 若是bean實現了 DisposableBean,它將調用destroy()方法。