1、Spring概述
簡介
2002年,Rod Jahnson首次推出了Spring框架雛形interface21框架,
2004年3月24日,Spring框架以interface21框架為基礎,經過重新設計,發布了1.0正式版,
Spring理念 : 使現有技術更加實用 . 本身就是一個大雜燴 , 整合現有的框架技術
官網 : http://spring.io/
官方下載地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/
GitHub : https://github.com/spring-projects
優點
1、Spring是一個開源免費的框架 , 容器 .
2、Spring是一個輕量級的框架 , 非侵入式的 .
3、控制反轉 IoC , 面向切面 Aop
4、對事物的支持 , 對框架的支持
一句話概括:
Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器(框架),
組成
Spring 框架是一個分層架構,由 7 個定義良好的模塊組成,Spring 模塊構建在核心容器之上,核心容器定義了創建、配置和管理 bean 的方式 .
組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實作,每個模塊的功能如下:
-
核心容器:核心容器提供 Spring 框架的基本功能,核心容器的主要組件是BeanFactory,它是工廠模式的實作,BeanFactory 使用控制反轉(IOC) 模式將應用程式的配置和依賴性規范與實際的應用程式代碼分開,
-
Spring 背景關系:Spring 背景關系是一個組態檔,向 Spring 框架提供背景關系資訊,Spring 背景關系包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能,
-
Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向切面的編程功能 , 集成到了 Spring 框架中,所以,可以很容易地使 Spring 框架管理任何支持 AOP的物件,Spring AOP 模塊為基于 Spring 的應用程式中的物件提供了事務管理服務,通過使用 Spring AOP,不用依賴組件,就可以將宣告性事務管理集成到應用程式中,
-
Spring DAO:JDBC DAO 抽象層提供了有意義的例外層次結構,可用該結構來管理例外處理和不同資料庫供應商拋出的錯誤訊息,例外層次結構簡化了錯誤處理,并且極大地降低了需要撰寫的例外代碼數量(例如打開和關閉連接),Spring DAO 的面向 JDBC 的例外遵從通用的 DAO 例外層次結構,
-
Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的物件關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map,所有這些都遵從 Spring 的通用事務和 DAO 例外層次結構,
-
Spring Web 模塊:Web 背景關系模塊建立在應用程式背景關系模塊之上,為基于 Web 的應用程式提供了背景關系,所以,Spring 框架支持與 Jakarta Struts 的集成,Web 模塊還簡化了處理多部分請求以及將請求引數系結到域物件的作業,
-
Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程式的 MVC 實作,通過策略介面,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI,
2、IOC理論推導
IoC基礎
新建一個空白的maven專案
分析實作
我們先用我們原來的方式寫一段代碼 .
1、先寫一個UserDao介面
public interface UserDao {
public void getUser();
}
2、再去寫Dao的實作類
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("獲取用戶資料");
}
}
3、然后去寫UserService的介面
public interface UserService {
public void getUser();
}
4、最后寫Service的實作類
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
?
@Override
public void getUser() {
userDao.getUser();
}
}
5、測驗
@Test
public void test(){
UserService service = new UserServiceImpl();
service.getUser();
}
這是我們原來的方式 , 開始大家也都是這么去寫的對吧 . 那我們現在修改一下 .
把Userdao的實作類增加一個 .
public class UserDaoMySqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println("MySql獲取用戶資料");
}
}
緊接著我們要去使用MySql的話 , 我們就需要去service實作類里面修改對應的實作
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoMySqlImpl();
?
@Override
public void getUser() {
userDao.getUser();
}
}
在假設, 增加一個Userdao的實作類 .
public class UserDaoOracleImpl implements UserDao {
@Override
public void getUser() {
System.out.println("Oracle獲取用戶資料");
}
}
那么我們要使用Oracle , 又需要去service實作類里面修改對應的實作 . 假設我們的這種需求非常大 , 這種方式就根本不適用了, 甚至反人類 , 每次變動 , 都需要修改大量代碼 . 這種設計的耦合性太高了, 牽一發而動全身 .
那我們如何去解決呢 ?
我們可以在需要用到他的地方 , 不去實作它 , 而是留出一個介面 , 利用set , 我們去代碼里修改下 .
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 利用set實作
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
?
@Override
public void getUser() {
userDao.getUser();
}
}
現在去測驗類里 , 進行測驗 ;
@Test
public void test(){
UserServiceImpl service = new UserServiceImpl();
service.setUserDao( new UserDaoMySqlImpl() );
service.getUser();
//那我們現在又想用Oracle去實作呢
service.setUserDao( new UserDaoOracleImpl() );
service.getUser();
}
大家發現了區別沒有 ? 可能很多人說沒啥區別 . 但是同學們 , 他們已經發生了根本性的變化 , 很多地方都不一樣了 . 仔細去思考一下 , 以前所有東西都是由程式去進行控制創建 , 而現在是由我們自行控制創建物件 , 把主動權交給了呼叫者 . 程式不用去管怎么創建,怎么實作了 . 它只負責提供一個介面 .
這種思想 , 從本質上解決了問題 , 我們程式員不再去管理物件的創建了 , 更多的去關注業務的實作 . 耦合性大大降低 . 這也就是IOC的原型 !
IOC本質
控制反轉IoC(Inversion of Control),是一種設計思想,DI(依賴注入)是實作IoC的一種方法,沒有IoC的程式中 , 我們使用面向物件編程 , 物件的創建與物件間的依賴關系完全硬編碼在程式中,物件的創建由程式自己控制,控制反轉后將物件的創建轉移給第三方,個人認為所謂控制反轉就是:獲得依賴物件的方式反轉了,
IoC是Spring框架的核心內容,使用多種方式完美的實作了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置實作IoC,
Spring容器在初始化時先讀取組態檔,根據組態檔或元資料創建與組織物件存入容器中,程式使用時再從Ioc容器中取出需要的物件,
采用XML方式配置Bean的時候,Bean的定義資訊是和實作分離的,而采用注解的方式可以把兩者合為一體,Bean的定義資訊直接以注解的形式定義在實作類中,從而達到了零配置的目的,
控制反轉是一種通過描述(XML或注解)并通過第三方去生產或獲取特定物件的方式,在Spring中實作控制反轉的是IoC容器,其實作方法是依賴注入(Dependency Injection,DI),
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/230521.html
標籤:其他
上一篇:存在可能替代C語言的其他語言嗎?
