1、什么是Spring框架?
- Spring :是一款開源的輕量級 Java 開發(fā)框架,旨在提高開發(fā)人員的開發(fā)效率以及系統(tǒng)的可維護性
2、Spring、SpringMVC和SpringBoot的區(qū)別
- Spring主要指Spring Framework,就是指如上圖所示的各項功能模塊
- SpringMVC主要指一種架構(gòu),MVC分別是Model模型、View視圖、Controller控制器的簡寫,核心思想就是將數(shù)據(jù)、顯示和業(yè)務(wù)邏輯分離來組織代碼。
- SpringBoot旨在簡化Spring開發(fā),減少各種麻煩的配置文件,盡量做到開箱即用
3、Spring IoC
- IoC:(Inversion of Control:控制反轉(zhuǎn)) 是一種設(shè)計思想,而不是一個具體的技術(shù)實現(xiàn)。IoC 的思想就是將原本在程序中手動創(chuàng)建對象的控制權(quán),交由 Spring 框架來管理
- 控制:指的是對象創(chuàng)建(實例化、管理)的權(quán)力
- 反轉(zhuǎn):控制權(quán)交給外部環(huán)境(Spring 框架、IoC 容器)
- 簡單來說,就是將對象的創(chuàng)建、依賴注入等操作交給Spring容器處理,而不是在應(yīng)用程序中手動創(chuàng)建和管理對象。
- 在傳統(tǒng)的應(yīng)用程序中,對象之間的依賴關(guān)系通常是通過手動創(chuàng)建對象、調(diào)用構(gòu)造方法或者工廠類來完成的。這種方式會導致應(yīng)用程序的代碼與具體的實現(xiàn)細節(jié)耦合在一起,難以進行單元測試和維護,而且代碼的可讀性和可復用性也比較差。
- 而使用Spring的IOC容器,可以將對象之間的依賴關(guān)系從應(yīng)用程序代碼中抽離出來,通過XML配置或者注解方式來描述對象之間的關(guān)系,由Spring容器自動創(chuàng)建和管理對象。這樣可以有效地降低應(yīng)用程序的耦合度,提高代碼的可讀性和可維護性,同時也方便單元測試和擴展。
4、Spring Bean
1、簡介
- 簡單來說,Bean 代指的就是那些被 IoC 容器所管理的對象
- 當我們使用Spring框架時,我們需要將Java對象交給Spring容器進行管理,這些對象就被稱為Spring Bean。Spring容器會負責創(chuàng)建、配置和管理這些Bean,以及將它們注入到其他Bean中。
- Bean對象的創(chuàng)建和管理是基于IoC(Inversion of Control,控制反轉(zhuǎn))和DI(Dependency Injection,依賴注入)的思想實現(xiàn)的。
- 我們需要告訴 IoC 容器幫助我們管理哪些對象,這個是通過配置元數(shù)據(jù)來定義的。配置元數(shù)據(jù)可以是 XML 文件、注解或者 Java 配置類
- SpringBean默認下是單例模式
2、將類聲明為Bean的常用注解如下
- @Component :通用的注解,可標注任意類為 Spring 組件
- @Repository : 對應(yīng)持久層即 Dao 層,主要用于數(shù)據(jù)庫相關(guān)操作
- @Service : 對應(yīng)服務(wù)層,主要涉及一些復雜的邏輯,需要用到 Dao 層
- @Controller : 對應(yīng) Spring MVC 控制層,主要用戶接受用戶請求并調(diào)用 Service 層返回數(shù)據(jù)給前端頁面
- @Bean:常和@Configuration注解搭配使用,用于顯式聲明單個bean,而不是讓Spring像上面一樣自動執(zhí)行,可以更精細地自定義配置;一般用來注解方法,但其返回值是對象
3、注入Bean的常用注解如下
- @Autowired:Autowired 屬于 Spring 內(nèi)置的注解,默認的注入方式為byType(根據(jù)類型進行匹配),也就是說會優(yōu)先根據(jù)接口類型去匹配并注入 Bean (接口的實現(xiàn)類)
- @Resource:@Resource屬于 JDK 提供的注解,默認注入方式為 byName。如果無法通過名稱匹配到對應(yīng)的 Bean 的話,注入方式會變?yōu)閎yType
4、Bean的生命周期
- Bean 容器找到配置文件中 Spring Bean 的定義,Bean 容器利用 Java Reflection API 創(chuàng)建一個 Bean 的實例
- 如果涉及到一些屬性值 利用 set()方法設(shè)置一些屬性值
- 如果 Bean 實現(xiàn)了 BeanNameAware 接口,調(diào)用 setBeanName()方法,傳入 Bean 的名字
- 與上面的類似,如果實現(xiàn)了其他 *.Aware接口,就調(diào)用相應(yīng)的方法
- 如果有和加載這個 Bean 的 Spring 容器相關(guān)的 BeanPostProcessor 對象,執(zhí)行postProcessBeforeInitialization() 方法
- 如果 Bean 實現(xiàn)了InitializingBean接口,執(zhí)行afterPropertiesSet()方法
- 如果 Bean 在配置文件中的定義包含 init-method 屬性,執(zhí)行指定的方法
- 如果有和加載這個 Bean 的 Spring 容器相關(guān)的 BeanPostProcessor 對象,執(zhí)行postProcessAfterInitialization() 方法
- 當要銷毀 Bean 的時候,如果 Bean 實現(xiàn)了 DisposableBean 接口,執(zhí)行 destroy() 方法
- 當要銷毀 Bean 的時候,如果 Bean 在配置文件中的定義包含 destroy-method 屬性,執(zhí)行指定的方法
總結(jié)起來,Spring的生命周期其實就是四個過程:實例化、屬性賦值、初始化前后、銷毀前后
- 實例化:第 1 步,實例化一個 bean 對象;
- 屬性賦值:第 2 步,為 bean 設(shè)置相關(guān)屬性和依賴;
- 初始化:第 3~7 步,步驟較多,其中第 5、6 步為初始化操作,第 3、4 步為在初始化前執(zhí)行,第 7 步在初始化后執(zhí)行,該階段結(jié)束,才能被用戶使用;
- 銷毀:第 8~10步,第8步不是真正意義上的銷毀(還沒使用呢),而是先在使用前注冊了銷毀的相關(guān)調(diào)用接口,為了后面第9、10步真正銷毀 bean 時再執(zhí)行相應(yīng)的方法。
5、Spring AOP
1、簡述:AOP(Aspect-Oriented Programming:面向切面編程)能夠?qū)⒛切┡c業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責任(例如事務(wù)處理、日志管理、權(quán)限控制等)封裝起來,便于減少系統(tǒng)的重復代碼,降低模塊間的耦合度,并有利于未來的可拓展性和可維護性,其實現(xiàn)原理就是動態(tài)代理
2、相關(guān)知識點
- 目標(Target):被通知的對象
- 代理(Proxy):向目標對象應(yīng)用通知之后創(chuàng)建的代理對象
- 連接點(JoinPoint):目標對象的所屬類中,定義的所有方法均為連接點
- 切入點(Pointcut):被切面攔截 / 增強的連接點(切入點一定是連接點,連接點不一定是切入點)
- 通知(Advice):增強的邏輯 / 代碼,也即攔截到目標對象的連接點之后要做的事情
- 切面(Aspect):切入點(Pointcut)+通知(Advice),一個切面就是一個代理對象= 要為哪些類生成代理+要添加的額外功能是哪些
- Weaving(織入):將通知應(yīng)用到目標對象,進而生成代理對象的過程動作
6、Spring AOP和AspectJ AOP有什么區(qū)別?
- Spring AOP 屬于運行時增強,而 AspectJ 是編譯時增強
- Spring AOP 基于代理(Proxying),而 AspectJ 基于字節(jié)碼操作(Bytecode Manipulation)
- Spring AOP相對簡單,但AspectJ性能更好
7、AspectJ定義的通知類型
- Before(前置通知):目標對象的方法調(diào)用之前觸發(fā)
- After (后置通知):目標對象的方法調(diào)用之后觸發(fā)
- AfterReturning(返回通知):目標對象的方法調(diào)用完成,在返回結(jié)果值之后觸發(fā)
- AfterThrowing(異常通知) :目標對象的方法運行中拋出 / 觸發(fā)異常后觸發(fā)。AfterReturning 和 AfterThrowing 兩者互斥。如果方法調(diào)用成功無異常,則會有返回值;如果方法拋出了異常,則不會有返回值
- Around (環(huán)繞通知):編程式控制目標對象的方法調(diào)用。環(huán)繞通知是所有通知類型中可操作范圍最大的一種,因為它可以直接拿到目標對象,以及要執(zhí)行的方法,所以環(huán)繞通知可以任意的在目標對象的方法調(diào)用前后搞事,甚至不調(diào)用目標對象的方法
8、控制多個切面的執(zhí)行順序
- 通常使用@Order注解直接定義切面順序
// 值越小優(yōu)先級越高
@Order(3)
@Component
@Aspect
public class LoggingAspect implements Ordered {
- 實現(xiàn)Ordered接口重寫getOrder方法
@Component
@Aspect
public class LoggingAspect implements Ordered {
// ....
@Override
public int getOrder() {
// 返回值越小優(yōu)先級越高
return 1;
}
}
9、Spring事務(wù)
事務(wù)是邏輯上的一組操作,要么都執(zhí)行,要么都不執(zhí)行
1、Spring管理事務(wù)的方式
- 編程式事務(wù) : 在代碼中硬編碼(不推薦使用) : 通過 TransactionTemplate或者 TransactionManager 手動管理事務(wù),實際應(yīng)用中很少使用,但是對于理解 Spring 事務(wù)管理原理有幫助
- 聲明式事務(wù) : 在 XML 配置文件中配置或者直接基于注解(推薦使用) : 實際是通過 AOP 實現(xiàn)(基于@Transactional 的全注解方式使用最多)
2、事務(wù)傳播行為:為了解決業(yè)務(wù)層方法之間互相調(diào)用的事務(wù)問題,@Transactional注解默認使用的值為TransactionDefinition.PROPAGATION_REQUIRED
3、事務(wù)的隔離級別:指的是一個事務(wù)對數(shù)據(jù)的修改與另一個并行的事務(wù)的隔離程度,當多個事務(wù)同時訪問相同數(shù)據(jù)時,如果沒有采取必要的隔離機制,就可能發(fā)生以下問題
- 臟讀:一個事務(wù)讀到另一個事務(wù)未提交的更新數(shù)據(jù)。
- 幻讀:例如第一個事務(wù)對一個表中的數(shù)據(jù)進行了修改,比如這種修改涉及到表中的“全部數(shù)據(jù)行”。同時,第二個事務(wù)也修改這個表中的數(shù)據(jù),這種修改是向表中插入“一行新數(shù)據(jù)”。那么,以后就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還存在沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。
- 不可重復讀:比方說在同一個事務(wù)中先后執(zhí)行兩條一模一樣的select語句,期間在此次事務(wù)中沒有執(zhí)行過任何DDL語句,但先后得到的結(jié)果不一致,這就是不可重復讀
常用的是TransactionDefinition.ISOLATION_DEFAULT,使用后端數(shù)據(jù)庫默認的隔離級別,MySQL 默認采用的 REPEATABLE_READ 隔離級別 Oracle 默認采用的 READ_COMMITTED 隔離級別文章來源:http://www.zghlxwxcb.cn/news/detail-417033.html
4、@Transactional(rollbackFor = Exception.class)注解:如果類或者方法加了這個注解,那么這個類里面的方法拋出異常,就會回滾,數(shù)據(jù)庫里面的數(shù)據(jù)也會回滾文章來源地址http://www.zghlxwxcb.cn/news/detail-417033.html
- 在 @Transactional 注解中如果不配置rollbackFor屬性,那么事務(wù)只會在遇到RuntimeException的時候才會回滾
- 加上 rollbackFor=Exception.class,可以讓事務(wù)在遇到非運行時異常時也回滾
十、實體之間的關(guān)聯(lián)關(guān)系注解
- @OneToOne : 一對一
- @ManyToMany :多對多
- @OneToMany : 一對多
- @ManyToOne :多對一
十一、攔截器和過濾器有什么區(qū)別
- 實現(xiàn)原理不同:過濾器是基于函數(shù)回調(diào)實現(xiàn)的,而攔截器則是基于Java的反射機制(動態(tài)代理)實現(xiàn)的
- 觸發(fā)時機不同:Filter只在Servlet前后起作用,而攔截器能夠深入到方法前后,異常拋出前后等,因此攔截器的使用具有更大的彈性
- 使用范圍不同:Filter是Servlet規(guī)范規(guī)定的,只能用于Web程序中。而攔截器是一個Spring組件,不僅能在Web程序中使用,也可以用于Application、Swing等程序中。
- 使用場景不同:攔截器主要用來實現(xiàn)項目中的業(yè)務(wù)來判斷的,比如:登錄判斷、權(quán)限判斷、日志記錄等業(yè)務(wù);而過濾器通常是用來實現(xiàn)通用功能過濾的,比如:敏感詞過濾、字符集編碼設(shè)置等。
到了這里,關(guān)于Java知識復習(八)Spring基礎(chǔ)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!