什麼是Spring
Spring是分層的Java SE/Java EE應用的full-stack輕量級開源框架,以IoC(Inverse Of Control 反轉控制)和AOP(Aspect Oriented Programing 面向切面編程)爲內核,提供了表現層(View)Spring MVC和持久層Spring JDBC以及業務層事務管理的衆多的企業級應用技術,還能整合開源世界衆多知名的第三方框架和類庫,逐漸成爲是哎喲個最多的Java EE企業應用的開源框架。官網
Spring框架結構
Spring優勢
-
降低耦合,簡化開發。
- 通過Spring提供IoC容器可以講對象之間的依賴關係交給Spring控制,避免硬編碼造成的過度的程序耦合。程序員不必在位單例模式類、屬性文件解析等這些底層的需求編寫代碼,可以更專注與上層應用。
-
AOP編程的支持
- 通過Spring的AOP功能,方便進行面向切面的編程,許多不容易用傳統OOP實現的功能可以通過AOP輕鬆應對。
-
聲明式事務的支持
- 通過聲明(配置)的方式靈活的進行事務的管理,提高開發效率和質量
-
方便程序的測試
- 可以用非容器依賴的編程方式進行幾乎所有的測試工作,測試編的簡單容易
-
方便集成各種優秀的框架
- Spring可以降低各種框架的使用難度,提供了對各種優秀框架(Struts、Hibernate、Hessian、Quartz……)的直接支持
-
降低Java EE API的使用難度
- Spring對Java EE API(如 JDBC、JavaMail、RPC等)進行了封裝,使這些API的使用難度大大降低
使用Spring
基於xml的IoC環境搭建
- 新建maven工程,在pom.xml中導入spring依賴,依賴關係可直接在maven倉庫官網中去複製 maven倉庫
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
下載成功後,如下:
圖中的spring-jcl 包是apache的日誌框架
打開maven中依賴關係視圖查看當前項目的依賴結構如下:
- 創建serverce類和serverceImpl類
server類:
public interface IUserServerce {
public void updateUser();
}
實現類:
public class UserServerceImpl implements IUserServerce {
public void updateUser() {
System.out.println("用戶信息更新成功");
}
}
- 創建測試類
public class IoCTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
IUserServerce userSvc = (IUserServerce) applicationContext.getBean(IUserServerce.class.getName());
userSvc.updateUser();
}
}
執行測試程序結果如下:
分析
ApplicationContext類
光標停留在ApplicationContext類上,右鍵,選擇Diagrams命令、Show Diagrm查看依賴關係的UML圖
-
可以看到,ApplicationContext是實現了BeanFactory的,那麼這兩個核心Core(容器)接口有什麼區別?
-
ApplicationContex:在構建容器時,採用即時加載的策略創建對象,在讀取完配置文件後,立刻就創建了配置的所有對象。適用於單例模式
-
BeanFactory:在構建容器時,採用延時加載策略創建對象,在獲取對象時,才創建對象。適用多例模式,按需加載
-
-
ApplicationContex的實現類
在UML圖中右鍵ApplicationContext,選擇Show Implementions
在測試程序用是實現類ClassPathXmlApplicationContext,從圖中看到類似的實現類還有
- 那麼這3個實現類有什麼區別?
- ClassPathXmlApplicationContext:加載類路徑下的配置文件,如果配置文件不存在於類路徑下,加載失敗
- FileSystemXmlApplicationContext:加載磁盤中的配置文件(必須要有訪問權限),但是項目部署後,不能保證每臺機器(服務器)都有指定的磁盤,因此侷限性太大
- AnnotationConfigApplicationContext:用於讀取註解創建容器
創建bean的三種方式
- 使用默認構造函數創建,配置如下:
<bean id="serverce.IUserServerce" class="serverImpl.UserServerceImpl"></bean>
實現類如下:
public class UserServerceImpl implements IUserServerce {
public void updateUser() {
System.out.println("用戶信息更新成功");
}
}
執行結果如下:
問題:實現類中並沒有寫構造函數,那怎麼執行成功的?
答:java中默認無參構造,當不重載構造函數時,默認調用無參構造,且午餐構造可省略不寫。當重寫了構造函數後,必須手動添加無參構造,否則此方式創建bean,會拋出異常
添加了無參構造後,執行成功:
問題: 當使用某個jar包中的類,它沒有構造函數,又不能修改,此時怎麼創建bean?代碼如下:
/**
* 模擬使用jar包中的類
*/
public class NewJar {
public IUserServerce getUserSvc(){
return new UserServerceImpl();
}
}
該怎麼獲取到IUserServerce的對象?直接new一個NewJar,然後獲取?注意我們需要的是IUserServerce的對象,並不需要NewJar的對象,但是卻創建了一個我們不需要的對象。方式2解決這個問題。
- 使用普通工廠方式創建
<!-- 方式2. 使用普通工廠方式創建-->
<bean id="factory.NewJar" class="factory.NewJar"></bean>
<bean id="serverce.IUserServerce" factory-bean="factory.NewJar" factory-method="getUserSvc"></bean>
執行結果如下:
有了第二種方式,引發出第三種方式。
- 使用工廠的靜態方法創建
<bean id="serverce.IUserServerce" class="factory.NewJar" factory-method="getUserSvc"></bean>
執行結果如下: