起因:重新學(xué)習(xí)spring丸升,雖然每天都在用铆农,但卻并不是很了解他,甚至說是不怎么了解狡耻,只是用一些基本的東西顿涣,在遇到問題的時候波闹,按照常規(guī)思路去解決,或者去百度涛碑,
這當(dāng)然是一個方法精堕,但終究不是 長久之道,重新學(xué)一下spring蒲障,對面試歹篓,對自己都是很好的。
spring概述
面對spring學(xué)習(xí)揉阎,最簡單庄撮,最直接地方法就是面向問題學(xué)習(xí),首先毙籽,拋出以下幾個問題:
- 什么是spring?
- Spring框架的設(shè)計(jì)目標(biāo)洞斯,設(shè)計(jì)理念,和核心是什么
- Spring的優(yōu)缺點(diǎn)是什么坑赡?
- Spring有哪些應(yīng)用場景
- Spring由哪些模塊組成烙如?
- Spring 框架中都用到了哪些設(shè)計(jì)模式?
- 詳細(xì)講解一下核心容器(spring context應(yīng)用上下文) 模塊
- Spring框架中有哪些不同類型的事件
- Spring 應(yīng)用程序有哪些不同組件毅否?
- 使用 Spring 有哪些方式亚铁?
接下來對其進(jìn)行一個個的解析:
1.什么是spring?
- 是什么?
Spring是一個輕量級Java開發(fā)框架螟加,目的是為了解決企業(yè)級應(yīng)用開發(fā)的業(yè)務(wù)邏輯層和其他各層的耦合問題徘溢。
它是一個分層的JavaSE/JavaEE full-stack(一站式)輕量級開源框架,為開發(fā)Java應(yīng)用程序提供全面的基礎(chǔ)架構(gòu)支持捆探。
Spring負(fù)責(zé)基礎(chǔ)架構(gòu)然爆,因此Java開發(fā)者可以專注于應(yīng)用程序的開發(fā)。
- 解決了什么問題?
Spring最根本的使命是解決企業(yè)級應(yīng)用開發(fā)的復(fù)雜性黍图,即簡化Java開發(fā)施蜜。
Spring可以做很多事情,它為企業(yè)級開發(fā)提供給了豐富的功能雌隅,但是這些功能的底層都依賴于它的兩個核心特性,也就是依賴注入(dependency injection缸沃,DI)和面向切面編程(aspect-oriented programming恰起,AOP)。
- 如何解決的這些問題?
為了降低Java開發(fā)的復(fù)雜性趾牧,Spring采取了以下4種關(guān)鍵策略
- 基于POJO的輕量級和最小侵入性編程检盼;
- 通過依賴注入和面向接口實(shí)現(xiàn)松耦合;
- 基于切面和慣例進(jìn)行聲明式編程翘单;
- 通過切面和模板減少樣板式代碼吨枉。
總結(jié)
2.Spring框架的設(shè)計(jì)目標(biāo)蹦渣,設(shè)計(jì)理念,和核心是什么貌亭?
- Spring設(shè)計(jì)目標(biāo):
Spring為開發(fā)者提供一個一站式輕量級應(yīng)用開發(fā)平臺柬唯;
- Spring設(shè)計(jì)理念:
在JavaEE開發(fā)中,支持POJO和JavaBean開發(fā)方式圃庭,使應(yīng)用面向接口開發(fā)锄奢,充分支持OO(面向?qū)ο螅┰O(shè)計(jì)方法;Spring通過IoC容器實(shí)現(xiàn)對象耦合關(guān)系的管理剧腻,并實(shí)現(xiàn)依賴反轉(zhuǎn)拘央,將對象之間的依賴關(guān)系交給IoC容器,實(shí)現(xiàn)解耦书在;
POJO和JavaBean的區(qū)別:POJO其實(shí)是比javabean更純凈的簡單類或接口灰伟。POJO嚴(yán)格地遵守簡單對象的概念,而一些JavaBean中往往會封裝一些簡單邏輯儒旬。
- Spring框架的核心:
IoC容器和AOP模塊栏账。通過IoC容器管理POJO對象以及他們之間的耦合關(guān)系;通過AOP以動態(tài)非侵入的方式增強(qiáng)服務(wù)义矛。
總結(jié)
IoC讓相互協(xié)作的組件保持松散的耦合发笔,而AOP編程允許你把遍布于應(yīng)用各層的功能分離出來形成可重用的功能組件。
3.Spring的優(yōu)缺點(diǎn)是什么凉翻?
優(yōu)點(diǎn)
- 方便解耦了讨,簡化開發(fā)
Spring就是一個大工廠,可以將所有對象的創(chuàng)建和依賴關(guān)系的維護(hù)制轰,交給Spring管理前计。
- AOP編程的支持
Spring提供面向切面編程,可以方便地實(shí)現(xiàn)對程序進(jìn)行權(quán)限攔截垃杖、運(yùn)行監(jiān)控等功能男杈。
- 聲明式事務(wù)的支持
只需要通過配置就可以完成對事務(wù)的管理,而無需手動編程调俘。
- 方便程序的測試
Spring對Junit4支持伶棒,可以通過注解方便的測試Spring程序。
- 方便集成各種優(yōu)秀框架
Spring不排斥各種優(yōu)秀的開源框架彩库,其內(nèi)部提供了對各種優(yōu)秀框架的直接支持(如:Struts肤无、Hibernate、MyBatis等)骇钦。
- 降低JavaEE API的使用難度
Spring對JavaEE開發(fā)中非常難用的一些API(JDBC宛渐、JavaMail、遠(yuǎn)程調(diào)用等),都提供了封裝窥翩,使這些API應(yīng)用難度大大降低业岁。
缺點(diǎn)
- Spring明明一個很輕量級的框架,卻給人感覺大而全
- Spring依賴反射寇蚊,反射影響性能
- 使用門檻升高笔时,入門Spring需要較長時間
4.Spring有哪些應(yīng)用場景?
應(yīng)用場景:JavaEE企業(yè)應(yīng)用開發(fā)幔荒,包括SSH糊闽、SSM等
Spring價(jià)值:
- Spring是非侵入式的框架,目標(biāo)是使應(yīng)用程序代碼對框架依賴最小化爹梁;
- Spring提供一個一致的編程模型右犹,使應(yīng)用直接使用POJO開發(fā),與運(yùn)行環(huán)境隔離開來姚垃;
- Spring推動應(yīng)用設(shè)計(jì)風(fēng)格向面向?qū)ο蠛兔嫦蚪涌陂_發(fā)轉(zhuǎn)變念链,提高了代碼的重用性和可測試性;
5.Spring由哪些模塊組成积糯?
Spring 總共大約有 20 個模塊掂墓, 由 1300 多個不同的文件構(gòu)成。 而這些組件被分別整合在核心容器(Core Container) 看成、 AOP(Aspect Oriented Programming)和設(shè)備支持(Instrmentation) 君编、數(shù)據(jù)訪問與集成(Data Access/Integeration) 、 Web川慌、 消息(Messaging) 吃嘿、 Test等 6 個模塊中。
以下是 Spring 5 的模塊結(jié)構(gòu)圖:
- spring core:提供了框架的基本組成部分梦重,包括控制反轉(zhuǎn)(Inversion of Control兑燥,IOC)和依賴注入(Dependency Injection,DI)功能琴拧。
- spring beans:提供了BeanFactory降瞳,是工廠模式的一個經(jīng)典實(shí)現(xiàn),Spring將管理對象稱為Bean蚓胸。
- spring context:構(gòu)建于 core 封裝包基礎(chǔ)上的 context 封裝包挣饥,提供了一種框架式的對象訪問方法。
- spring jdbc:提供了一個JDBC的抽象層沛膳,消除了煩瑣的JDBC編碼和數(shù)據(jù)庫廠商特有的錯誤代碼解析扔枫, 用于簡化JDBC。
- spring aop:提供了面向切面的編程實(shí)現(xiàn)于置,讓你可以自定義攔截器、切點(diǎn)等。
- spring Web:提供了針對 Web 開發(fā)的集成特性八毯,例如文件上傳搓侄,利用 servlet listeners 進(jìn)行 ioc 容器初始化和針對 Web 的 ApplicationContext。
- spring test:主要為測試提供支持的话速,支持使用JUnit或TestNG對Spring組件進(jìn)行單元測試和集成測試讶踪。
6.Spring 框架中都用到了哪些設(shè)計(jì)模式?
- 工廠模式:BeanFactory就是簡單工廠模式的體現(xiàn)泊交,用來創(chuàng)建對象的實(shí)例乳讥;
- 單例模式:Bean默認(rèn)為單例模式。
- 代理模式:Spring的AOP功能用到了JDK的動態(tài)代理和CGLIB字節(jié)碼生成技術(shù)廓俭;
- 模板方法:用來解決代碼重復(fù)的問題云石。比如. RestTemplate, JmsTemplate, JpaTemplate。
- 觀察者模式:定義對象鍵一種一對多的依賴關(guān)系研乒,當(dāng)一個對象的狀態(tài)發(fā)生改變時汹忠,所有依賴于它的對象都會得到通知被制動更新,如Spring中l(wèi)istener的實(shí)現(xiàn)–ApplicationListener雹熬。
7.詳細(xì)講解一下核心容器(spring context應(yīng)用上下文) 模塊?
這是基本的Spring模塊,提供spring 框架的基礎(chǔ)功能智亮,BeanFactory 是 任何以spring為基礎(chǔ)的應(yīng)用的核心溉委。Spring 框架建立在此模塊之上,它使Spring成為一個容器烈菌。
Bean 工廠是工廠模式的一個實(shí)現(xiàn)阵幸,提供了控制反轉(zhuǎn)功能,用來把應(yīng)用的配置和依賴從真正的應(yīng)用代碼中分離僧界。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory 侨嘀,它根據(jù)XML文件中的定義加載beans。該容器從XML 文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個完全配置的系統(tǒng)或應(yīng)用捂襟。
8.Spring框架中有哪些不同類型的事件咬腕?
Spring 提供了以下5種標(biāo)準(zhǔn)的事件:
上下文更新事件(ContextRefreshedEvent):在調(diào)用ConfigurableApplicationContext 接口中的refresh()方法時被觸發(fā)。
上下文開始事件(ContextStartedEvent):當(dāng)容器調(diào)用ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發(fā)該事件葬荷。
上下文停止事件(ContextStoppedEvent):當(dāng)容器調(diào)用ConfigurableApplicationContext的Stop()方法停止容器時觸發(fā)該事件涨共。
上下文關(guān)閉事件(ContextClosedEvent):當(dāng)ApplicationContext被關(guān)閉時觸發(fā)該事件。容器被關(guān)閉時宠漩,其管理的所有單例Bean都被銷毀举反。
請求處理事件(RequestHandledEvent):在Web應(yīng)用中,當(dāng)一個http請求(request)結(jié)束觸發(fā)該事件扒吁。如果一個bean實(shí)現(xiàn)了ApplicationListener接口火鼻,當(dāng)一個ApplicationEvent 被發(fā)布以后,bean會自動被通知。
9.Spring 應(yīng)用程序有哪些不同組件魁索?
Spring 應(yīng)用一般有以下組件:
- 接口 - 定義功能融撞。
- Bean 類 - 它包含屬性,setter 和 getter 方法粗蔚,函數(shù)等尝偎。
- Bean 配置文件 - 包含類的信息以及如何配置它們。
- Spring 面向切面編程(AOP) - 提供面向切面編程的功能鹏控。
- 用戶程序 - 它使用接口致扯。
10.使用 Spring 有哪些方式?
使用 Spring 有以下方式:
- 作為一個成熟的 Spring Web 應(yīng)用程序当辐。
- 作為第三方 Web 框架抖僵,使用 Spring Frameworks 中間層。
- 作為企業(yè)級 Java Bean瀑构,它可以包裝現(xiàn)有的 POJO(Plain Old Java Objects)裆针。
- 用于遠(yuǎn)程使用。
不要以為每天把功能完成了就行了寺晌,這種思想是要不得的世吨,互勉~!