:notebook: 本文已歸檔到:「blog」前端
Version | Feature |
---|---|
Spring 2.5 | 發佈於 2007 年。這是第一個支持註解的版本。 |
Spring 3.0 | 發佈於 2009 年。它徹底利用了 Java5 中的改進,併爲 JEE6 提供了支持。 |
Spring 4.0 | 發佈於 2013 年。這是第一個徹底支持 JAVA8 的版本。 |
Spring 配置文件是 XML 文件。該文件主要包含類信息。它描述了這些類是如何配置以及相互引入的。可是,XML 配置文件冗長且更加乾淨。若是沒有正確規劃和編寫,那麼在大項目中管理變得很是困難。java
Spring 應用通常有如下組件:git
使用 Spring 有如下方式:github
Spring 框架的核心是 Spring 容器。容器建立對象,將它們裝配在一塊兒,配置它們並管理它們的完整生命週期。Spring 容器使用依賴注入來管理組成應用程序的組件。容器經過讀取提供的配置元數據來接收對象進行實例化,配置和組裝的指令。該元數據能夠經過 XML,Java 註解或 Java 代碼提供。web
在依賴注入中,您沒必要建立對象,但必須描述如何建立它們。您不是直接在代碼中將組件和服務鏈接在一塊兒,而是描述配置文件中哪些組件須要哪些服務。由 IoC 容器將它們裝配在一塊兒。面試
一般,依賴注入能夠經過三種方式完成,即:正則表達式
在 Spring Framework 中,僅使用構造函數和 setter 注入。spring
構造函數注入 | setter 注入 |
---|---|
沒有部分注入 | 有部分注入 |
不會覆蓋 setter 屬性 | 會覆蓋 setter 屬性 |
任意修改都會建立一個新實例 | 任意修改不會建立一個新實例 |
適用於設置不少屬性 | 適用於設置少許屬性 |
BeanFactory | ApplicationContext |
---|---|
它使用懶加載 | 它使用即時加載 |
它使用語法顯式提供資源對象 | 它本身建立和管理資源對象 |
不支持國際化 | 支持國際化 |
不支持基於依賴的註解 | 支持基於依賴的註解 |
IoC 的一些好處是:數據庫
Spring 中的 IoC 的實現原理就是工廠模式加反射機制。編程
示例:
interface Fruit {
public abstract void eat();
}
class Apple implements Fruit {
public void eat(){
System.out.println("Apple");
}
}
class Orange implements Fruit {
public void eat(){
System.out.println("Orange");
}
}
class Factory {
public static Fruit getInstance(String ClassName) {
Fruit f=null;
try {
f=(Fruit)Class.forName(ClassName).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return f;
}
}
class Client {
public static void main(String[] a) {
Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
if(f!=null){
f.eat();
}
}
}
複製代碼
bean 所需的依賴項和服務在 XML 格式的配置文件中指定。這些配置文件一般包含許多 bean 定義和特定於應用程序的配置選項。它們一般以 bean 標籤開頭。例如:
<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">
<property name="name" value="Edureka"></property>
</bean>
複製代碼
您能夠經過在相關的類,方法或字段聲明上使用註解,將 bean 配置爲組件類自己,而不是使用 XML 來描述 bean 裝配。默認狀況下,Spring 容器中未打開註解裝配。所以,您須要在使用它以前在 Spring 配置文件中啓用它。例如:
<beans>
<context:annotation-config/>
<!-- bean definitions go here -->
</beans>
複製代碼
Spring 的 Java 配置是經過使用 @Bean 和 @Configuration 來實現。
<bean />
元素相同的角色。例如:
@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
複製代碼
Spring bean 支持 5 種 scope:
僅當用戶使用支持 Web 的 ApplicationContext 時,最後三個纔可用。
spring bean 容器的生命週期流程以下:
<bean>
的 init-method 屬性),那麼將調用它。<bean>
的 destroy-method 屬性),那麼將調用它。只有將 bean 用做另外一個 bean 的屬性時,才能將 bean 聲明爲內部 bean。爲了定義 bean,Spring 的基於 XML 的配置元數據在 <property>
或 <constructor-arg>
中提供了 <bean>
元素的使用。內部 bean 老是匿名的,它們老是做爲原型。
例如,假設咱們有一個 Student 類,其中引用了 Person 類。這裏咱們將只建立一個 Person 類實例並在 Student 中使用它。
Student.java
public class Student {
private Person person;
//Setters and Getters
}
public class Person {
private String name;
private String address;
//Setters and Getters
}
複製代碼
bean.xml
<bean id=「StudentBean" class="com.edureka.Student">
<property name="person">
<!--This is inner bean -->
<bean class="com.edureka.Person">
<property name="name" value=「Scott"></property>
<property name="address" value=「Bangalore"></property>
</bean>
</property>
</bean>
複製代碼
當 bean 在 Spring 容器中組合在一塊兒時,它被稱爲裝配或 bean 裝配。 Spring 容器須要知道須要什麼 bean 以及容器應該如何使用依賴注入來將 bean 綁定在一塊兒,同時裝配 bean。
Spring 容器可以自動裝配 bean。也就是說,能夠經過檢查 BeanFactory 的內容讓 Spring 自動解析 bean 的協做者。
自動裝配的不一樣模式:
<constructor-arg>
和 <property>
設置指定依賴項,這將覆蓋自動裝配。默認狀況下,Spring 容器中未打開註解裝配。所以,要使用基於註解裝配,咱們必須經過配置<context:annotation-config />
元素在 Spring 配置文件中啓用它。
@Required 應用於 bean 屬性 setter 方法。此註解僅指示必須在配置時使用 bean 定義中的顯式屬性值或使用自動裝配填充受影響的 bean 屬性。若是還沒有填充受影響的 bean 屬性,則容器將拋出 BeanInitializationException。
示例:
public class Employee {
private String name;
@Required
public void setName(String name){
this.name=name;
}
public string getName(){
return name;
}
}
複製代碼
@Autowired 能夠更準確地控制應該在何處以及如何進行自動裝配。此註解用於在 setter 方法,構造函數,具備任意名稱或多個參數的屬性或方法上自動裝配 bean。默認狀況下,它是類型驅動的注入。
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName(){
return name;
}
}
複製代碼
當您建立多個相同類型的 bean 並但願僅使用屬性裝配其中一個 bean 時,您可使用@Qualifier 註解和 @Autowired 經過指定應該裝配哪一個確切的 bean 來消除歧義。
例如,這裏咱們分別有兩個類,Employee 和 EmpAccount。在 EmpAccount 中,使用@Qualifier 指定了必須裝配 id 爲 emp1 的 bean。
Employee.java
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName() {
return name;
}
}
複製代碼
EmpAccount.java
public class EmpAccount {
private Employee emp;
@Autowired
@Qualifier(emp1)
public void showName() {
System.out.println(「Employee name : 」+emp.getName);
}
}
複製代碼
@RequestMapping 註解用於將特定 HTTP 請求方法映射到將處理相應請求的控制器中的特定類/方法。此註解可應用於兩個級別:
Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數據訪問技術更容易以一種統一的方式工做。這使得用戶容易在持久性技術之間切換。它還容許您在編寫代碼時,無需考慮捕獲每種技術不一樣的異常。
咱們能夠經過兩種方式使用 Spring 訪問 Hibernate:
Spring 支持兩種類型的事務管理:
AOP(Aspect-Oriented Programming), 即 面向切面編程, 它與 OOP( Object-Oriented Programming, 面向對象編程) 相輔相成, 提供了與 OOP 不一樣的抽象軟件結構的視角. 在 OOP 中, 咱們以類(class)做爲咱們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)
特定 JoinPoint 處的 Aspect 所採起的動做稱爲 Advice。Spring AOP 使用一個 Advice 做爲攔截器,在 JoinPoint 「周圍」維護一系列的攔截器。
concern 是咱們想要在應用程序的特定模塊中定義的行爲。它能夠定義爲咱們想要實現的功能。
cross-cutting concern 是一個適用於整個應用的行爲,這會影響整個應用程序。例如,日誌記錄,安全性和數據傳輸是應用程序幾乎每一個模塊都須要關注的問題,所以它們是跨領域的問題。
實現 AOP 的技術,主要分爲兩大類:
Spring AOP 基於動態代理方式實現;AspectJ 基於靜態代理方式實現。 Spring AOP 僅支持方法級別的 PointCut;提供了徹底的 AOP 支持,它還支持屬性級別的 PointCut。
將 Advice 應用於目標對象後建立的對象稱爲代理。在客戶端對象的狀況下,目標對象和代理對象是相同的。
Advice + Target Object = Proxy
複製代碼
爲了建立一個 advice 對象而連接一個 aspect 和其它應用類型或對象,稱爲編織(Weaving)。在 Spring AOP 中,編織在運行時執行。請參考下圖:
Spring Web MVC 框架提供 模型-視圖-控制器 架構和隨時可用的組件,用於開發靈活且鬆散耦合的 Web 應用程序。 MVC 模式有助於分離應用程序的不一樣方面,如輸入邏輯,業務邏輯和 UI 邏輯,同時在全部這些元素之間提供鬆散耦合。
DispatcherServlet 的工做流程能夠用一幅圖來講明:
DispatcherServlet
捕獲。DispatcherServlet
根據 -servlet.xml 中的配置對請求的 URL 進行解析,獲得請求資源標識符(URI)。而後根據該 URI,調用 HandlerMapping
得到該 Handler 配置的全部相關的對象(包括 Handler 對象以及 Handler 對象對應的攔截器),最後以HandlerExecutionChain
對象的形式返回。DispatcherServlet
根據得到的Handler
,選擇一個合適的 HandlerAdapter
。(附註:若是成功得到HandlerAdapter
後,此時將開始執行攔截器的 preHandler(...)方法)。Request
中的模型數據,填充Handler
入參,開始執行Handler
(Controller
)。 在填充Handler
的入參過程當中,根據你的配置,Spring 將幫你作一些額外的工做:
String
轉換成Integer
、Double
等。BindingResult
或Error
中。DispatcherServlet
返回一個 ModelAndView
對象;ModelAndView
,選擇一個適合的 ViewResolver
(必須是已經註冊到 Spring 容器中的ViewResolver
)返回給DispatcherServlet
。ViewResolver
結合Model
和View
,來渲染視圖。WebApplicationContext 是 ApplicationContext 的擴展。它具備 Web 應用程序所需的一些額外功能。它與普通的 ApplicationContext 在解析主題和決定與哪一個 servlet 關聯的能力方面有所不一樣。
(完)
:point_right: 想學習更多 Spring 內容能夠訪問個人 Spring 教程:spring-tutorial