天天看點

聊一聊Spring的前世今生Rod Johnson(spring 之父)

Spring 是分層的 Java SE/EE 應用 full-stack 輕量級開源架構,以 IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面程式設計)為核心,提供了展現層 Spring MVC 和持久層 Spring JDBC 以及業務層事務管理等衆多的企業級應用技術,還能整合開源世界衆多著名的第三方架構和類庫,逐漸成為使用最多的 Java EE 企業應用開源架構。

Rod Johnson(spring 之父)

2017 年 9 月份釋出了 spring 的最新版本 spring 5.0 通用版(GA)

spring 的優勢

友善解耦,簡化開發
AOP 程式設計的支援
聲明式事務的支援
友善程式的測試
友善內建各種優秀架構
降低 JavaEE API 的使用難度
Java 源碼是經典學習範例
           

軟體設計中通常用耦合度和内聚度作為衡量子產品獨立程度的标準,劃分子產品的一個準則就是高内聚低耦合

IoC 的概念和作用

控制反轉-Inversion Of Control
我們擷取對象時,同時跟工廠要,有工廠為我們查找或者建立對象。是被動的。這種被動接收的方式擷取對象的思想就是控制反轉,它是 spring 架構的核心之一。

明确 ioc 的作用:
削減計算機程式的耦合(解除我們代碼中的依賴關系)。
           

BeanFactory 和 ApplicationContext 的差別?

BeanFactory 才是 Spring 容器中的頂層接口。
ApplicationContext 是它的子接口。
BeanFactory 和 ApplicationContext 的差別:
建立對象的時間點不一樣。
ApplicationContext:隻要一讀取配置檔案,預設情況下就會建立對象。
BeanFactory:什麼使用什麼時候建立對象。
           

ApplicationContext 接口的實作類

ClassPathXmlApplicationContext:
它是從類的根路徑下加載配置檔案 推薦使用這種
FileSystemXmlApplicationContext:
它是從磁盤路徑上加載配置檔案,配置檔案可以在磁盤的任意位置。
AnnotationConfigApplicationContext:
當我們使用注解配置容器對象時,需要使用此類來建立 spring 容器。它用來讀取注解。
           

執行個體化 Bean 的三種方式

第一種方式:使用預設無參構造函數
<!--在預設情況下:
它會根據預設無參構造函數來建立類對象。如果 bean 中沒有預設無參構造函數,将會建立失敗。
-->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"/>

第二種方式:spring 管理靜态工廠-使用靜态工廠的方法建立對象
/**
* 模拟一個靜态工廠,建立業務層實作類
*/
public class StaticFactory {
public static IAccountService createAccountService(){
return new AccountServiceImpl();
}
}
<!-- 此種方式是:
使用 StaticFactory 類中的靜态方法 createAccountService 建立對象,并存入 spring 容器
id 屬性:指定 bean 的 id,用于從容器中擷取
class 屬性:指定靜态工廠的全限定類名
factory-method 屬性:指定生産對象的靜态方法
-->
<bean id="accountService"
 class="com.itheima.factory.StaticFactory"
 factory-method="createAccountService"></bean>

 第三種方式:spring 管理執行個體工廠-使用執行個體工廠的方法建立對象
/**
* 模拟一個執行個體工廠,建立業務層實作類
* 此工廠建立對象,必須現有工廠執行個體對象,再調用方法
*/
public class InstanceFactory {
public IAccountService createAccountService(){
return new AccountServiceImpl();
}
}
<!-- 此種方式是:
先把工廠的建立交給 spring 來管理。
然後在使用工廠的 bean 來調用裡面的方法
factory-bean 屬性:用于指定執行個體工廠 bean 的 id。
factory-method 屬性:用于指定執行個體工廠中建立對象的方法。
-->
<bean id="instancFactory" class="com.itheima.factory.InstanceFactory"></bean>
<bean id="accountService"
 factory-bean="instancFactory"
 factory-method="createAccountService"></bean>
           

依賴注入:Dependency Injection。它是 spring 架構核心 ioc 的具體實作。

我們的程式在編寫時,通過控制反轉,把對象的建立交給了 spring,但是代碼中不可能出現沒有依賴的情況。
ioc 解耦隻是降低他們的依賴關系,但不會消除。例如:我們的業務層仍會調用持久層的方法。
那這種業務層和持久層的依賴關系,在使用 spring 之後,就讓 spring 來維護了。
簡單的說,就是坐等架構把持久層對象傳入業務層,而不用我們自己去擷取。