javascript
Spring入门图解(体系结构-IOC-DI-AOP)
0. 什么是Spring?
一句話:Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC-Inversion of Control)和面向切面(AOP-Aspect Oriented Programming)的容器(框架)。
1. 體系結(jié)構(gòu)
1.1 體系結(jié)構(gòu)圖
Spring 是模塊化的,允許你挑選和選擇適用于你的模塊,不必要把剩余部分也引入。下面的部分對(duì)在 Spring 框架中所有可用的模塊給出了詳細(xì)的介紹。
Spring 總共大約有 20 個(gè)模塊, 由 1300 多個(gè)不同的文件構(gòu)成。 而這些組件被分別整合在
- 核心容器(Core Container)
- AOP(Aspect Oriented Programming)
- Aspects
- 設(shè)備支持(Instrmentation)
- 消息(Messaging)
- 數(shù)據(jù)訪問與集成(Data Access/Integeration)
- Web
- Test
8 個(gè)大模塊中。 以下是 Spring 5 的模塊結(jié)構(gòu)圖:
1.2 核心容器(Core Container)
核心容器由 spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring 表達(dá)式語言,Spring Expression Language)等模塊組成,它們的細(xì)節(jié)如下:
- spring-core 模塊提供了框架的基本組成部分,包括 IoC 和依賴注入功能。
- spring-beans 模塊提供 BeanFactory,工廠模式的微妙實(shí)現(xiàn),它移除了編碼式單例的需要,并且可以把配置和依賴從實(shí)際編碼邏輯中解耦。
- context 模塊建立在由 core和 beans 模塊的基礎(chǔ)上建立起來的,它以一種類似于 JNDI 注冊(cè)的方式訪問對(duì)象。Context 模塊繼承自 Bean 模塊,并且添加了國(guó)際化(比如,使用資源束)、事件傳播、資源加載和透明地創(chuàng)建上下文(比如,通過 Servelet 容器)等功能。Context 模塊也支持 Java EE 的功能,比如 EJB、JMX 和遠(yuǎn)程調(diào)用等。ApplicationContext 接口是 Context 模塊的焦點(diǎn)。spring-context-support 提供了對(duì)第三方集成到 Spring 上下文的支持,比如緩存(EhCache, Guava, JCache)、郵件(JavaMail)、調(diào)度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。
- spring-expression 模塊提供了強(qiáng)大的表達(dá)式語言,用于在運(yùn)行時(shí)查詢和操作對(duì)象圖。它是 JSP2.1 規(guī)范中定義的統(tǒng)一表達(dá)式語言的擴(kuò)展,支持 set 和 get 屬性值、屬性賦值、方法調(diào)用、訪問數(shù)組集合及索引的內(nèi)容、邏輯算術(shù)運(yùn)算、命名變量、通過名字從 Spring IoC 容器檢索對(duì)象,還支持列表的投影、選擇以及聚合等。
它們的完整依賴關(guān)系如下圖所示:
1.3 數(shù)據(jù)訪問/集成 (Data Access/Integeration)
數(shù)據(jù)訪問/集成層包括 JDBC,ORM,OXM,JMS 和事務(wù)處理模塊,它們的細(xì)節(jié)如下:
(注:JDBC=Java Data Base Connectivity,ORM=Object Relational Mapping,OXM=Object XML Mapping,JMS=Java Message Service)
- JDBC 模塊提供了 JDBC 抽象層,它消除了冗長(zhǎng)的 JDBC 編碼和對(duì)數(shù)據(jù)庫供應(yīng)商特定錯(cuò)誤代碼的解析。
- ORM 模塊提供了對(duì)流行的對(duì)象關(guān)系映射 API 的集成,包括 JPA、JDO 、 Hibernate、Mybatis 等。通過此模塊可以讓這些 ORM 框架和 spring的其它功能整合,比如前面提及的事務(wù)管理。
- OXM 模塊提供了對(duì) OXM 實(shí)現(xiàn)的支持,比如 JAXB、Castor、XML Beans、JiBX、XStream 等。
- JMS 模塊包含生產(chǎn)(produce)和消費(fèi)(consume)消息的功能。從 Spring 4.1 開始,集成了 spring-messaging 模塊。
- 事務(wù)模塊為實(shí)現(xiàn)特殊接口類及所有的 POJO 支持編程式和聲明式事務(wù)管理。(注:編程式事務(wù)需要自己寫 beginTransaction()、commit()、rollback() 等事務(wù)管理方法,聲明式事務(wù)是通過注解或配置由 spring 自動(dòng)處理,編程式事務(wù)力度更細(xì))
1.4 Web
Web 層由 Web,Servlet,Web-Socket 和 Web-Portlet 組成,它們的細(xì)節(jié)如下:
- Web 模塊提供面向 web 的基本功能和面向 web 的應(yīng)用上下文,比如多部分(multipart)文件上傳功能、使用 Servlet 監(jiān)聽器初始化 IoC 容器等。它還包括 HTTP 客戶端以及 Spring 遠(yuǎn)程調(diào)用中與 web 相關(guān)的部分。
- Servlet 模塊為 web 應(yīng)用提供了模型視圖控制(MVC)和 REST Web服務(wù)的實(shí)現(xiàn)。Spring 的 MVC 框架可以使領(lǐng)域模型代碼和 web 表單完全地分離,且可以與 Spring 框架的其它所有功能進(jìn)行集成。
- Web-Socket 模塊為 WebSocket-based 提供了支持,而且在 web 應(yīng)用程序中提供了客戶端和服務(wù)器端之間通信的兩種方式。
- Web-Portlet 模塊提供了用于 Portlet 環(huán)境的 MVC 實(shí)現(xiàn),并反映了 spring-webmvc 模塊的功能。
1.5 AOP
- AOP 模塊提供了面向方面(切面)的編程實(shí)現(xiàn),允許你定義方法攔截器和切入點(diǎn)對(duì)代碼進(jìn)行干凈地解耦,從而使實(shí)現(xiàn)功能的代碼徹底的解耦出來。能夠?qū)⒛切┡c業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任(例如事務(wù)處理、日志管理、權(quán)限控制等)封裝起來,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可拓展性和可維護(hù)性。
1.6 Aspects
- Aspects 模塊提供了與 AspectJ 的集成,這是一個(gè)功能強(qiáng)大且成熟的面向切面編程(AOP)框架。
1.7 Instrumentation
- Instrumentation 模塊在一定的應(yīng)用服務(wù)器中提供了類 instrumentation 的支持和類加載器的實(shí)現(xiàn)。
1.8 Messaging
- Messaging 模塊為 STOMP 提供了支持作為在應(yīng)用程序中 WebSocket 子協(xié)議的使用。它也支持一個(gè)注解編程模型,它是為了選路和處理來自 WebSocket 客戶端的 STOMP 信息。
1.9 Test
- 測(cè)試模塊支持對(duì)具有 JUnit 或 TestNG 框架的 Spring 組件的測(cè)試。
既然我們已經(jīng)知道了Spring框架是什么,然后大致了解Spring框架的體系結(jié)構(gòu),那么接下來重點(diǎn)關(guān)注Spring最重要的兩個(gè)思想:IOC和AOP
2. 控制反轉(zhuǎn)和依賴注入(IOC-DI)
控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC),是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)原則,可以用來減低計(jì)算機(jī)代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡(jiǎn)稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。
依賴注入(DI),是指程序運(yùn)行過程中,如果需要調(diào)用另一個(gè)對(duì)象協(xié)助時(shí),無須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部的注入。Spring的依賴注入對(duì)調(diào)用者和被調(diào)用者幾乎沒有任何要求,完全支持對(duì)POJO之間依賴關(guān)系的管理。
- 依賴 : 指Bean對(duì)象的創(chuàng)建依賴于Spring容器
- 注入 : 指Bean對(duì)象的屬性(例如pojo類對(duì)象屬性、其它需要依賴的Bean對(duì)象) , 由容器來設(shè)置和裝配.
傳統(tǒng)Java SE程序設(shè)計(jì),我們直接在對(duì)象內(nèi)部通過new進(jìn)行創(chuàng)建對(duì)象,是程序主動(dòng)去創(chuàng)建依賴對(duì)象;
IOC是由專門一個(gè)容器來創(chuàng)建這些對(duì)象,即由Ioc容器來控制對(duì)象的創(chuàng)建,程序被動(dòng)接受對(duì)象,這就叫控制反轉(zhuǎn);
在Spring中,我們可以把IOC容器與Spring容器等同于一個(gè)東西,及IOC容器=Spring容器,我們也可以把Spring容器看做配置文件xxx.xml來簡(jiǎn)單記憶
以下是一個(gè)使用xml配置文件實(shí)現(xiàn)IOC的圖例:
3. 切面編程 (AOP)
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期間動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。
利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,將日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等相同代碼從業(yè)務(wù)邏輯代碼中劃分出來,通過對(duì)這些行為的分離,可以將它們獨(dú)立到非指導(dǎo)業(yè)務(wù)邏輯的方法中,進(jìn)而改變這些行為的時(shí)候不影響業(yè)務(wù)邏輯的代碼。提高程序的可重用性,同時(shí)提高了開發(fā)的效率。
4. 通過Spring案例進(jìn)一步理解IOC與DI
4.1 文件目錄結(jié)構(gòu)
4.2 案例UML架構(gòu)圖
4.3 pom.xml
<dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.1</version></dependency> </dependencies>4.4 dao
package cn.bithachi.dao;public interface UserDao {void getUser(); }/*-------------------------------------*/ package cn.bithachi.dao; public class UserDaoImpl implements UserDao {@Overridepublic void getUser() {System.out.println("獲取用戶數(shù)據(jù)");} } /*-------------------------------------*/ package cn.bithachi.dao;public class UserDaoMySqlImpl implements UserDao {@Overridepublic void getUser() {System.out.println("MySql獲取用戶數(shù)據(jù)");} }4.5 service
package cn.bithachi.service;public interface UserService {void getUser(); } /*-------------------------------------*/ package cn.bithachi.service;import cn.bithachi.dao.UserDao;public class UserServiceImpl implements UserService {private UserDao userDao;// 利用set實(shí)現(xiàn)依賴注入public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void getUser() {userDao.getUser();} }4.6 pojo
package cn.bithachi.pojo;public class Hello {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void show(){System.out.println("Hello,"+ name );} }4.7 beans.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean就是java對(duì)象 , 由Spring創(chuàng)建和管理, id為對(duì)象的引用變量名--><bean id="hello" class="cn.bithachi.pojo.Hello"><property name="name" value="Spring"/></bean><bean id="OriginImpl" class="cn.bithachi.dao.UserDaoImpl"/><bean id="MysqlImpl" class="cn.bithachi.dao.UserDaoMySqlImpl"/><!--依賴注入,采用setUserDao方法--><bean id="ServiceImpl" class="cn.bithachi.service.UserServiceImpl"><property name="userDao" ref="OriginImpl"/></bean> </beans>4.8 Test
import cn.bithachi.pojo.Hello; import cn.bithachi.service.UserServiceImpl; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {@Testpublic void test(){//解析beans.xml文件 , 生成管理相應(yīng)的Bean對(duì)象,創(chuàng)建容器對(duì)象ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");//getBean : 參數(shù)即為spring配置文件中bean的id .Hello hello = (Hello) context.getBean("hello");hello.show();}@Testpublic void test2(){//獲取spring容器對(duì)象ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");//從容器中取出Bean對(duì)象的引用UserServiceImpl serviceImpl = (UserServiceImpl) context.getBean("ServiceImpl");//調(diào)用Bean對(duì)象的方法serviceImpl.getUser();} }參考:
- https://blog.csdn.net/sggtgfs/article/details/85338011
- https://learnku.com/laravel/t/3845/the-two-picture-lets-you-understand-ioc-inversion-of-control
- https://www.w3cschool.cn/wkspring/dcu91icn.html
- https://mp.weixin.qq.com/s?__biz=Mzg2NTAzMTExNg==&mid=2247484096&idx=1&sn=c599734d2bc16a9a9c27a10731255bc9&scene=19#wechat_redirect
總結(jié)
以上是生活随笔為你收集整理的Spring入门图解(体系结构-IOC-DI-AOP)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EL_JSTL
- 下一篇: 3.1.1 存储器的分类(半导体-磁芯-