一. 一般問(wèn)題
1. 不同版本的 Spring Framework 有哪些主要功能厨疙?
Version | Version |
---|---|
Spring 2.5 | Spring 2.5 |
Spring 2.5 | 發(fā)布于 2009 年洲守。它完全利用了 Java5 中的改進(jìn),并為 JEE6 提供了支持沾凄。 |
Spring 4.0 | 發(fā)布于 2013 年梗醇。這是第一個(gè)完全支持 JAVA8 的版本。 |
2. 什么是 Spring Framework撒蟀?
- Spring 是一個(gè)開(kāi)源應(yīng)用框架叙谨,旨在降低應(yīng)用程序開(kāi)發(fā)的復(fù)雜度。
- 它是輕量級(jí)保屯、松散耦合的唉俗。
- 它具有分層體系結(jié)構(gòu),允許用戶選擇組件配椭,同時(shí)還為 J2EE 應(yīng)用程序開(kāi)發(fā)提供了一個(gè)有凝聚力的框架虫溜。
- 它可以集成其他框架,如 Structs股缸、Hibernate衡楞、EJB 等,所以又稱為框架的框架敦姻。
3. 列舉 Spring Framework 的優(yōu)點(diǎn)瘾境。
- 由于 Spring Frameworks 的分層架構(gòu),用戶可以自由選擇自己需要的組件镰惦。
- Spring Framework 支持 POJO(Plain Old Java Object) 編程迷守,從而具備持續(xù)集成和可測(cè)試性。
- 由于依賴注入和控制反轉(zhuǎn)旺入,JDBC 得以簡(jiǎn)化兑凿。
- 它是開(kāi)源免費(fèi)的。
4. Spring Framework 有哪些不同的功能茵瘾?
- 輕量級(jí) - Spring 在代碼量和透明度方面都很輕便礼华。
- IOC - 控制反轉(zhuǎn)
- AOP - 面向切面編程可以將應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分離,以實(shí)現(xiàn)高內(nèi)聚拗秘。
- 容器 - Spring 負(fù)責(zé)創(chuàng)建和管理對(duì)象(Bean)的生命周期和配置圣絮。
- MVC - 對(duì) web 應(yīng)用提供了高度可配置性,其他框架的集成也十分方便雕旨。
- 事務(wù)管理 - 提供了用于事務(wù)管理的通用抽象層扮匠。Spring 的事務(wù)支持也可用于容器較少的環(huán)境捧请。
- JDBC 異常 - Spring 的 JDBC 抽象層提供了一個(gè)異常層次結(jié)構(gòu),簡(jiǎn)化了錯(cuò)誤處理策略棒搜。
5. Spring Framework 中有多少個(gè)模塊血久,它們分別是什么?
①. Spring 核心容器 – 該層基本上是 Spring Framework 的核心帮非。它包含以下模塊:
- Spring Core
- Spring Bean
- SpEL (Spring Expression Language)
- Spring Context
②. 數(shù)據(jù)訪問(wèn)/集成 – 該層提供與數(shù)據(jù)庫(kù)交互的支持氧吐。它包含以下模塊:
- JDBC (Java DataBase Connectivity)
- ORM (Object Relational Mapping)
- OXM (Object XML Mappers)
- JMS (Java Messaging Service)
- Transaction
③. Web – 該層提供了創(chuàng)建 Web 應(yīng)用程序的支持。它包含以下模塊:
- Web
- Web – Servlet
- Web – Socket
- Web – Portlet
④. AOP – 該層支持面向切面編程
⑤. Instrumentation – 該層為類檢測(cè)和類加載器實(shí)現(xiàn)提供支持末盔。
⑥. Test – 該層為使用 JUnit 和 TestNG 進(jìn)行測(cè)試提供支持筑舅。
⑦. 幾個(gè)雜項(xiàng)模塊:
- Messaging – 該模塊為 STOMP 提供支持。它還支持注解編程模型陨舱,該模型用于從 WebSocket 客戶端路由和處理 STOMP 消息翠拣。
- Aspects – 該模塊為與 AspectJ 的集成提供支持。
6. 什么是 Spring 配置文件游盲?
Spring 配置文件是 XML 文件误墓。該文件主要包含類信息。它描述了這些類是如何配置以及相互引入的益缎。但是谜慌,XML 配置文件冗長(zhǎng)且更加干凈。如果沒(méi)有正確規(guī)劃和編寫莺奔,那么在大項(xiàng)目中管理變得非常困難欣范。
7. Spring 應(yīng)用程序有哪些不同組件?
Spring 應(yīng)用一般有以下組件:
- 接口 - 定義功能令哟。
- Bean 類 - 它包含屬性恼琼,setter 和 getter 方法,函數(shù)等屏富。
- Spring 面向切面編程(AOP) - 提供面向切面編程的功能晴竞。
- Bean 配置文件 - 包含類的信息以及如何配置它們。
- 用戶程序 - 它使用接口狠半。
8. 使用 Spring 有哪些方式噩死?
使用 Spring 有以下方式:
- 作為一個(gè)成熟的 Spring Web 應(yīng)用程序。
- 作為第三方 Web 框架典予,使用 Spring Frameworks 中間層甜滨。
- 用于遠(yuǎn)程使用乐严。
- 作為企業(yè)級(jí) Java Bean瘤袖,它可以包裝現(xiàn)有的 POJO(Plain Old Java Objects)。
二. 依賴注入(Ioc)
1. 什么是 Spring IOC 容器昂验?
Spring 框架的核心是 Spring 容器捂敌。容器創(chuàng)建對(duì)象艾扮,將它們裝配在一起,配置它們并管理它們的完整生命周期占婉。Spring 容器使用依賴注入來(lái)管理組成應(yīng)用程序的組件泡嘴。容器通過(guò)讀取提供的配置元數(shù)據(jù)來(lái)接收對(duì)象進(jìn)行實(shí)例化,配置和組裝的指令逆济。該元數(shù)據(jù)可以通過(guò) XML酌予,Java 注解或 Java 代碼提供。
2. 什么是依賴注入奖慌?
在依賴注入中抛虫,您不必創(chuàng)建對(duì)象,但必須描述如何創(chuàng)建它們简僧。您不是直接在代碼中將組件和服務(wù)連接在一起建椰,而是描述配置文件中哪些組件需要哪些服務(wù)。由 IoC 容器將它們裝配在一起岛马。
3. 可以通過(guò)多少種方式完成依賴注入棉姐?
通常,依賴注入可以通過(guò)三種方式完成啦逆,即:
- 構(gòu)造函數(shù)注入
- setter 注入
- 接口注入
在 Spring Framework 中伞矩,僅使用構(gòu)造函數(shù)和 setter 注入。
4. 區(qū)分構(gòu)造函數(shù)注入和 setter 注入夏志。
構(gòu)造函數(shù)注入 | setter 注入 |
---|---|
沒(méi)有部分注入 | 有部分注入 |
不會(huì)覆蓋 setter 屬性 | 有部分注入 |
任意修改都會(huì)創(chuàng)建一個(gè)新實(shí)例 | 任意修改不會(huì)創(chuàng)建一個(gè)新實(shí)例 |
適用于設(shè)置很多屬性 | 適用于設(shè)置少量屬性 |
5. spring 中有多少種 IOC 容器扭吁?
- BeanFactory - BeanFactory 就像一個(gè)包含 bean 集合的工廠類。它會(huì)在客戶端要求時(shí)實(shí)例化 bean盲镶。
- ApplicationContext - ApplicationContext 接口擴(kuò)展了 BeanFactory 接口侥袜。它在 BeanFactory 基礎(chǔ)上提供了一些額外的功能。
6. 區(qū)分 BeanFactory 和 ApplicationContext溉贿。
BeanFactory | ApplicationContext |
---|---|
它使用懶加載 | 它使用即時(shí)加載 |
它使用語(yǔ)法顯式提供資源對(duì)象 | 它自己創(chuàng)建和管理資源對(duì)象 |
不支持國(guó)際化 | 支持國(guó)際化 |
不支持基于依賴的注解 | 支持基于依賴的注解 |
7. 列舉 IoC 的一些好處枫吧。
IoC 的一些好處是:
- 它將最小化應(yīng)用程序中的代碼量。
- 它將使您的應(yīng)用程序易于測(cè)試宇色,因?yàn)樗恍枰獑卧獪y(cè)試用例中的任何單例或 JNDI 查找機(jī)制九杂。
- 它以最小的影響和最少的侵入機(jī)制促進(jìn)松耦合。
- 它支持即時(shí)的實(shí)例化和延遲加載服務(wù)宣蠕。
8. Spring IoC 的實(shí)現(xiàn)機(jī)制例隆。
Spring 中的 IoC 的實(shí)現(xiàn)原理就是工廠模式加反射機(jī)制。
示例:
interface Fruit {
public abstract void eat();
}
class Apple implements Fruit {
public void eat(){
System.out.println("Apple");
}
}
class Orange implements Fruit {
public void eat(){
System.out.println("Orange");
}
}
class Factory {
public static Fruit getInstance(String ClassName) {
Fruit f=null;
try {
f=(Fruit)Class.forName(ClassName).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return f;
}
}
class Client {
public static void main(String[] a) {
Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
if(f!=null){
f.eat();
}
}
}
三. Beans
1. 什么是 spring bean抢蚀?
- 它們是構(gòu)成用戶應(yīng)用程序主干的對(duì)象镀层。
- Bean 由 Spring IoC 容器管理。
- 它們由 Spring IoC 容器實(shí)例化皿曲,配置唱逢,裝配和管理吴侦。
- Bean 是基于用戶提供給容器的配置元數(shù)據(jù)創(chuàng)建坞古。
2. spring 提供了哪些配置方式?
基于 xml 配置:bean 所需的依賴項(xiàng)和服務(wù)在 XML 格式的配置文件中指定尿瞭。這些配置文件通常包含許多 bean 定義和特定于應(yīng)用程序的配置選項(xiàng)很魂。它們通常以 bean 標(biāo)簽開(kāi)頭幅聘。例如:
<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">
<property name="name" value="Edureka"></property>
</bean>
基于注解配置:您可以通過(guò)在相關(guān)的類延塑,方法或字段聲明上使用注解端朵,將 bean 配置為組件類本身,而不是使用 XML 來(lái)描述 bean 裝配邻薯。默認(rèn)情況下裙戏,Spring 容器中未打開(kāi)注解裝配。因此厕诡,您需要在使用它之前在 Spring 配置文件中啟用它累榜。例如:
<beans>
<context:annotation-config/>
<!-- bean definitions go here -->
</beans>
基于 Java API 配置:Spring 的 Java 配置是通過(guò)使用 @Bean 和 @Configuration 來(lái)實(shí)現(xiàn)。
- @Bean 注解扮演與 <bean /> 元素相同的角色灵嫌。
- @Configuration 類允許通過(guò)簡(jiǎn)單地調(diào)用同一個(gè)類中的其他 @Bean 方法來(lái)定義 bean 間依賴關(guān)系壹罚。
例如:
@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
3. spring 支持集中 bean scope?
Spring bean 支持 5 種 scope:
- Singleton - 每個(gè) Spring IoC 容器僅有一個(gè)單實(shí)例寿羞。
- Prototype - 每次請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的實(shí)例猖凛。
- Request - 每一次 HTTP 請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的實(shí)例,并且該 bean 僅在當(dāng)前 HTTP 請(qǐng)求內(nèi)有效绪穆。
- Session - 每一次 HTTP 請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的 bean辨泳,同時(shí)該 bean 僅在當(dāng)前 HTTP session 內(nèi)有效。
- Global-session - 類似于標(biāo)準(zhǔn)的 HTTP Session 作用域玖院,不過(guò)它僅僅在基于 portlet 的 web 應(yīng)用中才有意義菠红。Portlet 規(guī)范定義了全局 Session 的概念,它被所有構(gòu)成某個(gè) portlet web 應(yīng)用的各種不同的 portlet 所共享难菌。在 global session 作用域中定義的 bean 被限定于全局 portlet Session 的生命周期范圍內(nèi)途乃。如果你在 web 中使用 global session 作用域來(lái)標(biāo)識(shí) bean,那么 web 會(huì)自動(dòng)當(dāng)成 session 類型來(lái)使用扔傅。
僅當(dāng)用戶使用支持 Web 的 ApplicationContext 時(shí)耍共,最后三個(gè)才可用。
4. spring bean 容器的生命周期是什么樣的猎塞?
spring bean 容器的生命周期流程如下:
- Spring 容器根據(jù)配置中的 bean 定義中實(shí)例化 bean试读。
- Spring 使用依賴注入填充所有屬性,如 bean 中所定義的配置荠耽。
- 如果 bean 實(shí)現(xiàn) BeanNameAware 接口钩骇,則工廠通過(guò)傳遞 bean 的 ID 來(lái)調(diào)用 setBeanName()。
- 如果 bean 實(shí)現(xiàn) BeanFactoryAware 接口,工廠通過(guò)傳遞自身的實(shí)例來(lái)調(diào)用 setBeanFactory()倘屹。
- 如果存在與 bean 關(guān)聯(lián)的任何 BeanPostProcessors银亲,則調(diào)用 preProcessBeforeInitialization() 方法。
- 如果為 bean 指定了 init 方法(<bean> 的 init-method 屬性)纽匙,那么將調(diào)用它务蝠。
- 最后,如果存在與 bean 關(guān)聯(lián)的任何 BeanPostProcessors烛缔,則將調(diào)用 postProcessAfterInitialization() 方法馏段。
- 如果 bean 實(shí)現(xiàn) DisposableBean 接口,當(dāng) spring 容器關(guān)閉時(shí)践瓷,會(huì)調(diào)用 destory()院喜。
- 如果為 bean 指定了 destroy 方法(<bean> 的 destroy-method 屬性),那么將調(diào)用它晕翠。
5. 什么是 spring 的內(nèi)部 bean喷舀?
只有將 bean 用作另一個(gè) bean 的屬性時(shí),才能將 bean 聲明為內(nèi)部 bean淋肾。為了定義 bean硫麻,Spring 的基于 XML 的配置元數(shù)據(jù)在<property>
或<constructor-arg>
中提供了<bean>
元素的使用。內(nèi)部bean
總是匿名的巫员,它們總是作為原型庶香。
例如,假設(shè)我們有一個(gè) Student 類简识,其中引用了 Person 類赶掖。這里我們將只創(chuàng)建一個(gè) Person 類實(shí)例并在 Student 中使用它。
Student.java
public class Student {
private Person person;
//Setters and Getters
}
public class Person {
private String name;
private String address;
//Setters and Getters
}
bean.xml
<bean id=“StudentBean" class="com.edureka.Student">
<property name="person">
<!--This is inner bean -->
<bean class="com.edureka.Person">
<property name="name" value=“Scott"></property>
<property name="address" value=“Bangalore"></property>
</bean>
</property>
</bean>
6. 什么是 spring 裝配
當(dāng) bean 在 Spring 容器中組合在一起時(shí)七扰,它被稱為裝配或 bean 裝配奢赂。 Spring 容器需要知道需要什么 bean 以及容器應(yīng)該如何使用依賴注入來(lái)將 bean 綁定在一起,同時(shí)裝配 bean颈走。
7. 自動(dòng)裝配有哪些方式膳灶?
Spring 容器能夠自動(dòng)裝配 bean。也就是說(shuō)立由,可以通過(guò)檢查 BeanFactory 的內(nèi)容讓 Spring 自動(dòng)解析 bean 的協(xié)作者轧钓。
自動(dòng)裝配的不同模式:
- no - 這是默認(rèn)設(shè)置,表示沒(méi)有自動(dòng)裝配锐膜。應(yīng)使用顯式 bean 引用進(jìn)行裝配毕箍。
- byName - 它根據(jù) bean 的名稱注入對(duì)象依賴項(xiàng)。它匹配并裝配其屬性與 XML 文件中由相同名稱定義的 bean道盏。
- byType - 它根據(jù)類型注入對(duì)象依賴項(xiàng)而柑。如果屬性的類型與 XML 文件中的一個(gè) bean 名稱匹配文捶,則匹配并裝配屬性。
- 構(gòu)造函數(shù) - 它通過(guò)調(diào)用類的構(gòu)造函數(shù)來(lái)注入依賴項(xiàng)媒咳。它有大量的參數(shù)粹排。
- autodetect - 首先容器嘗試通過(guò)構(gòu)造函數(shù)使用 autowire 裝配,如果不能涩澡,則嘗試通過(guò) byType 自動(dòng)裝配顽耳。
8. 自動(dòng)裝配有什么局限?
- 覆蓋的可能性 - 您始終可以使用 <constructor-arg> 和 <property> 設(shè)置指定依賴項(xiàng)筏养,這將覆蓋自動(dòng)裝配斧抱。
- 基本元數(shù)據(jù)類型 - 簡(jiǎn)單屬性(如原數(shù)據(jù)類型常拓,字符串和類)無(wú)法自動(dòng)裝配渐溶。
- 令人困惑的性質(zhì) - 總是喜歡使用明確的裝配,因?yàn)樽詣?dòng)裝配不太精確弄抬。
四. 注解
1. 你用過(guò)哪些重要的 Spring 注解茎辐?
- @Controller - 用于 Spring MVC 項(xiàng)目中的控制器類。
- @Service - 用于服務(wù)類掂恕。
- @RequestMapping - 用于在控制器處理程序方法中配置 URI 映射拖陆。
- @ResponseBody - 用于發(fā)送 Object 作為響應(yīng),通常用于發(fā)送 XML 或 JSON 數(shù)據(jù)作為響應(yīng)懊亡。
- @PathVariable - 用于將動(dòng)態(tài)值從 URI 映射到處理程序方法參數(shù)依啰。
- @Autowired - 用于在 spring bean 中自動(dòng)裝配依賴項(xiàng)。
- @Qualifier - 使用 @Autowired 注解店枣,以避免在存在多個(gè) bean 類型實(shí)例時(shí)出現(xiàn)混淆速警。
- @Scope - 用于配置 spring bean 的范圍。
- @Configuration鸯两,@ComponentScan 和 @Bean - 用于基于 java 的配置闷旧。
- @Aspect,@Before钧唐,@After忙灼,@Around,@Pointcut - 用于切面編程(AOP)钝侠。
2. 如何在 spring 中啟動(dòng)注解裝配该园?
默認(rèn)情況下,Spring 容器中未打開(kāi)注解裝配帅韧。因此里初,要使用基于注解裝配,我們必須通過(guò)配置<context:annotation-config />
元素在Spring
配置文件中啟用它弱匪。
3. @Component, @Controller, @Repository, @Service 有何區(qū)別青瀑?
- @Component:這將 java 類標(biāo)記為 bean璧亮。它是任何 Spring 管理組件的通用構(gòu)造型。spring 的組件掃描機(jī)制現(xiàn)在可以將其拾取并將其拉入應(yīng)用程序環(huán)境中斥难。
- @Controller:這將一個(gè)類標(biāo)記為 Spring Web MVC 控制器枝嘶。標(biāo)有它的 Bean 會(huì)自動(dòng)導(dǎo)入到 IoC 容器中。
- @Service:此注解是組件注解的特化哑诊。它不會(huì)對(duì) @Component 注解提供任何其他行為群扶。您可以在服務(wù)層類中使用 @Service 而不是 @Component,因?yàn)樗愿玫姆绞街付艘鈭D镀裤。
- @Repository:這個(gè)注解是具有類似用途和功能的 @Component 注解的特化竞阐。它為 DAO 提供了額外的好處。它將 DAO 導(dǎo)入 IoC 容器暑劝,并使未經(jīng)檢查的異常有資格轉(zhuǎn)換為 Spring DataAccessException骆莹。
4. @Required 注解有什么用?
@Required 應(yīng)用于 bean 屬性 setter 方法担猛。此注解僅指示必須在配置時(shí)使用 bean 定義中的顯式屬性值或使用自動(dòng)裝配填充受影響的 bean 屬性幕垦。如果尚未填充受影響的 bean 屬性,則容器將拋出 BeanInitializationException傅联。
示例:
public class Employee {
private String name;
@Required
public void setName(String name){
this.name=name;
}
public string getName(){
return name;
}
}
5. @Autowired 注解有什么用先改?
@Autowired 可以更準(zhǔn)確地控制應(yīng)該在何處以及如何進(jìn)行自動(dòng)裝配。此注解用于在 setter 方法蒸走,構(gòu)造函數(shù)仇奶,具有任意名稱或多個(gè)參數(shù)的屬性或方法上自動(dòng)裝配 bean。默認(rèn)情況下比驻,它是類型驅(qū)動(dòng)的注入该溯。
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName(){
return name;
}
}
6. @Qualifier 注解有什么用?
當(dāng)您創(chuàng)建多個(gè)相同類型的 bean 并希望僅使用屬性裝配其中一個(gè) bean 時(shí)嫁艇,您可以使用@Qualifier 注解和 @Autowired 通過(guò)指定應(yīng)該裝配哪個(gè)確切的 bean 來(lái)消除歧義朗伶。
例如,這里我們分別有兩個(gè)類步咪,Employee 和 EmpAccount论皆。在 EmpAccount 中,使用@Qualifier 指定了必須裝配 id 為 emp1 的 bean猾漫。
Employee.java
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName() {
return name;
}
}
EmpAccount.java
public class EmpAccount {
private Employee emp;
@Autowired
@Qualifier(emp1)
public void showName() {
System.out.println(“Employee name : ”+emp.getName);
}
}
7. @RequestMapping 注解有什么用点晴?
@RequestMapping 注解用于將特定 HTTP 請(qǐng)求方法映射到將處理相應(yīng)請(qǐng)求的控制器中的特定類/方法。此注解可應(yīng)用于兩個(gè)級(jí)別:
- 類級(jí)別:映射請(qǐng)求的 URL
- 方法級(jí)別:映射 URL 以及 HTTP 請(qǐng)求方法
五. 數(shù)據(jù)訪問(wèn)
1. spring DAO 有什么用悯周?
Spring DAO 使得 JDBC粒督,Hibernate 或 JDO 這樣的數(shù)據(jù)訪問(wèn)技術(shù)更容易以一種統(tǒng)一的方式工作。這使得用戶容易在持久性技術(shù)之間切換禽翼。它還允許您在編寫代碼時(shí)屠橄,無(wú)需考慮捕獲每種技術(shù)不同的異常族跛。
2. 列舉 Spring DAO 拋出的異常。
3. spring JDBC API 中存在哪些類锐墙?
- JdbcTemplate
- SimpleJdbcTemplate
- NamedParameterJdbcTemplate
- SimpleJdbcInsert
- SimpleJdbcCall
4. 使用 Spring 訪問(wèn) Hibernate 的方法有哪些礁哄?
我們可以通過(guò)兩種方式使用 Spring 訪問(wèn) Hibernate:
- 使用 Hibernate 模板和回調(diào)進(jìn)行控制反轉(zhuǎn)
- 擴(kuò)展 HibernateDAOSupport 并應(yīng)用 AOP 攔截器節(jié)點(diǎn)
5. 列舉 spring 支持的事務(wù)管理類型
Spring 支持兩種類型的事務(wù)管理:
- 程序化事務(wù)管理:在此過(guò)程中,在編程的幫助下管理事務(wù)溪北。它為您提供極大的靈活性桐绒,但維護(hù)起來(lái)非常困難。
- 聲明式事務(wù)管理:在此之拨,事務(wù)管理與業(yè)務(wù)代碼分離茉继。僅使用注解或基于 XML 的配置來(lái)管理事務(wù)。
6. spring 支持哪些 ORM 框架
- Hibernate
- iBatis
- JPA
- JDO
- OJB
六. AOP
1. 什么是 AOP蚀乔?
AOP(Aspect-Oriented Programming), 即 面向切面編程, 它與 OOP( Object-Oriented Programming, 面向?qū)ο缶幊? 相輔相成, 提供了與 OOP 不同的抽象軟件結(jié)構(gòu)的視角. 在 OOP 中, 我們以類(class)作為我們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)
2. AOP 中的 Aspect烁竭、Advice、Pointcut乙墙、JointPoint 和 Advice 參數(shù)分別是什么颖变?
- Aspect - Aspect 是一個(gè)實(shí)現(xiàn)交叉問(wèn)題的類生均,例如事務(wù)管理听想。方面可以是配置的普通類,然后在 Spring Bean 配置文件中配置马胧,或者我們可以使用 Spring AspectJ 支持使用 @Aspect 注解將類聲明為 Aspect汉买。
- Advice - Advice 是針對(duì)特定 JoinPoint 采取的操作。在編程方面佩脊,它們是在應(yīng)用程序中達(dá)到具有匹配切入點(diǎn)的特定 JoinPoint 時(shí)執(zhí)行的方法蛙粘。您可以將 Advice 視為 Spring 攔截器(Interceptor)或 Servlet 過(guò)濾器(filter)。
- Advice Arguments - 我們可以在 advice 方法中傳遞參數(shù)威彰。我們可以在切入點(diǎn)中使用 args() 表達(dá)式來(lái)應(yīng)用于與參數(shù)模式匹配的任何方法出牧。如果我們使用它,那么我們需要在確定參數(shù)類型的 advice 方法中使用相同的名稱歇盼。
- Pointcut - Pointcut 是與 JoinPoint 匹配的正則表達(dá)式舔痕,用于確定是否需要執(zhí)行 Advice。 Pointcut 使用與 JoinPoint 匹配的不同類型的表達(dá)式豹缀。Spring 框架使用 AspectJ Pointcut 表達(dá)式語(yǔ)言來(lái)確定將應(yīng)用通知方法的 JoinPoint伯复。
- JoinPoint - JoinPoint 是應(yīng)用程序中的特定點(diǎn),例如方法執(zhí)行邢笙,異常處理啸如,更改對(duì)象變量值等。在 Spring AOP 中氮惯,JoinPoint 始終是方法的執(zhí)行器叮雳。
3. 什么是通知(Advice)想暗?
特定 JoinPoint 處的 Aspect 所采取的動(dòng)作稱為 Advice。Spring AOP 使用一個(gè) Advice 作為攔截器帘不,在 JoinPoint “周圍”維護(hù)一系列的攔截器江滨。
4. 有哪些類型的通知(Advice)?
- Before - 這些類型的 Advice 在 joinpoint 方法之前執(zhí)行厌均,并使用 @Before 注解標(biāo)記進(jìn)行配置唬滑。
- After Returning - 這些類型的 Advice 在連接點(diǎn)方法正常執(zhí)行后執(zhí)行,并使用@AfterReturning 注解標(biāo)記進(jìn)行配置棺弊。
- After Throwing - 這些類型的 Advice 僅在 joinpoint 方法通過(guò)拋出異常退出并使用 @AfterThrowing 注解標(biāo)記配置時(shí)執(zhí)行晶密。
- After (finally) - 這些類型的 Advice 在連接點(diǎn)方法之后執(zhí)行,無(wú)論方法退出是正常還是異常返回模她,并使用 @After 注解標(biāo)記進(jìn)行配置稻艰。
- Around - 這些類型的 Advice 在連接點(diǎn)之前和之后執(zhí)行,并使用 @Around 注解標(biāo)記進(jìn)行配置侈净。
5. 指出在 spring aop 中 concern 和 cross-cutting concern 的不同之處尊勿。
concern 是我們想要在應(yīng)用程序的特定模塊中定義的行為。它可以定義為我們想要實(shí)現(xiàn)的功能畜侦。
cross-cutting concern 是一個(gè)適用于整個(gè)應(yīng)用的行為元扔,這會(huì)影響整個(gè)應(yīng)用程序。例如旋膳,日志記錄澎语,安全性和數(shù)據(jù)傳輸是應(yīng)用程序幾乎每個(gè)模塊都需要關(guān)注的問(wèn)題,因此它們是跨領(lǐng)域的問(wèn)題验懊。
6. AOP 有哪些實(shí)現(xiàn)方式擅羞?
實(shí)現(xiàn) AOP 的技術(shù),主要分為兩大類:
靜態(tài)代理 - 指使用 AOP 框架提供的命令進(jìn)行編譯义图,從而在編譯階段就可生成 AOP 代理類减俏,因此也稱為編譯時(shí)增強(qiáng);
- 編譯時(shí)編織(特殊編譯器實(shí)現(xiàn))
- 類加載時(shí)編織(特殊的類加載器實(shí)現(xiàn))碱工。
動(dòng)態(tài)代理 - 在運(yùn)行時(shí)在內(nèi)存中“臨時(shí)”生成 AOP 動(dòng)態(tài)代理類娃承,因此也被稱為運(yùn)行時(shí)增強(qiáng)。
- JDK 動(dòng)態(tài)代理
- CGLIB
7. Spring AOP and AspectJ AOP 有什么區(qū)別痛垛?
Spring AOP 基于動(dòng)態(tài)代理方式實(shí)現(xiàn)草慧;AspectJ 基于靜態(tài)代理方式實(shí)現(xiàn)。 Spring AOP 僅支持方法級(jí)別的 PointCut匙头;提供了完全的 AOP 支持漫谷,它還支持屬性級(jí)別的 PointCut。
8. 如何理解 Spring 中的代理蹂析?
將 Advice 應(yīng)用于目標(biāo)對(duì)象后創(chuàng)建的對(duì)象稱為代理舔示。在客戶端對(duì)象的情況下碟婆,目標(biāo)對(duì)象和代理對(duì)象是相同的。
Advice + Target Object = Proxy
9. 什么是編織(Weaving)惕稻?
為了創(chuàng)建一個(gè) advice 對(duì)象而鏈接一個(gè) aspect 和其它應(yīng)用類型或?qū)ο笫玻Q為編織(Weaving)。在 Spring AOP 中俺祠,編織在運(yùn)行時(shí)執(zhí)行公给。
七. MVC
1. Spring MVC 框架有什么用?
Spring Web MVC 框架提供 模型-視圖-控制器 架構(gòu)和隨時(shí)可用的組件蜘渣,用于開(kāi)發(fā)靈活且松散耦合的 Web 應(yīng)用程序淌铐。 MVC 模式有助于分離應(yīng)用程序的不同方面,如輸入邏輯蔫缸,業(yè)務(wù)邏輯和 UI 邏輯腿准,同時(shí)在所有這些元素之間提供松散耦合。
2. 描述一下 DispatcherServlet 的工作流程
DispatcherServlet 的工作流程可以用一幅圖來(lái)說(shuō)明:
①. 向服務(wù)器發(fā)送 HTTP 請(qǐng)求拾碌,請(qǐng)求被前端控制器 DispatcherServlet 捕獲吐葱。
②. DispatcherServlet 根據(jù) -servlet.xml 中的配置對(duì)請(qǐng)求的 URL 進(jìn)行解析,得到請(qǐng)求資源標(biāo)識(shí)符(URI)校翔。然后根據(jù)該 URI弟跑,調(diào)用 HandlerMapping 獲得該 Handler 配置的所有相關(guān)的對(duì)象(包括 Handler 對(duì)象以及 Handler 對(duì)象對(duì)應(yīng)的攔截器),最后以HandlerExecutionChain 對(duì)象的形式返回展融。
③. DispatcherServlet 根據(jù)獲得的Handler窖认,選擇一個(gè)合適的 HandlerAdapter。(附注:如果成功獲得HandlerAdapter后告希,此時(shí)將開(kāi)始執(zhí)行攔截器的 preHandler(...)方法)。
④. 提取Request中的模型數(shù)據(jù)烧给,填充Handler入?yún)⒀嗯迹_(kāi)始執(zhí)行Handler(Controller)。 在填充Handler的入?yún)⑦^(guò)程中础嫡,根據(jù)你的配置指么,Spring 將幫你做一些額外的工作:
- HttpMessageConveter: 將請(qǐng)求消息(如 Json、xml 等數(shù)據(jù))轉(zhuǎn)換成一個(gè)對(duì)象榴鼎,將對(duì)象轉(zhuǎn)換為指定的響應(yīng)信息伯诬。
- 數(shù)據(jù)轉(zhuǎn)換:對(duì)請(qǐng)求消息進(jìn)行數(shù)據(jù)轉(zhuǎn)換。如String轉(zhuǎn)換成Integer巫财、Double等盗似。
- 數(shù)據(jù)根式化:對(duì)請(qǐng)求消息進(jìn)行數(shù)據(jù)格式化。 如將字符串轉(zhuǎn)換成格式化數(shù)字或格式化日期等平项。
- 數(shù)據(jù)驗(yàn)證: 驗(yàn)證數(shù)據(jù)的有效性(長(zhǎng)度赫舒、格式等)悍及,驗(yàn)證結(jié)果存儲(chǔ)到BindingResult或Error中。
⑤. Handler(Controller)執(zhí)行完成后接癌,向 DispatcherServlet 返回一個(gè) ModelAndView 對(duì)象心赶;
⑥. 根據(jù)返回的ModelAndView,選擇一個(gè)適合的 ViewResolver(必須是已經(jīng)注冊(cè)到 Spring 容器中的ViewResolver)返回給DispatcherServlet缺猛。
⑦. ViewResolver 結(jié)合Model和View缨叫,來(lái)渲染視圖。
⑧. 視圖負(fù)責(zé)將渲染結(jié)果返回給客戶端荔燎。
3. 介紹一下 WebApplicationContext
WebApplicationContext 是 ApplicationContext 的擴(kuò)展弯汰。它具有 Web 應(yīng)用程序所需的一些額外功能。它與普通的 ApplicationContext 在解析主題和決定與哪個(gè) servlet 關(guān)聯(lián)的能力方面有所不同湖雹。