面試還是被Spring血虐梯码?9102年我的Spring面試總結(jié);從入門到放棄你只差這篇文章

一. 一般問(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)的能力方面有所不同湖雹。

傳送門

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咏闪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摔吏,更是在濱河造成了極大的恐慌鸽嫂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件征讲,死亡現(xiàn)場(chǎng)離奇詭異据某,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)诗箍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門癣籽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人滤祖,你說(shuō)我怎么就攤上這事筷狼。” “怎么了匠童?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵埂材,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我汤求,道長(zhǎng)俏险,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任扬绪,我火速辦了婚禮竖独,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挤牛。我一直安慰自己莹痢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著格二,像睡著了一般劈彪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顶猜,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天沧奴,我揣著相機(jī)與錄音,去河邊找鬼长窄。 笑死滔吠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挠日。 我是一名探鬼主播疮绷,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嚣潜!你這毒婦竟也來(lái)了冬骚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懂算,失蹤者是張志新(化名)和其女友劉穎只冻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體计技,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喜德,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垮媒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舍悯。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖睡雇,靈堂內(nèi)的尸體忽然破棺而出萌衬,到底是詐尸還是另有隱情,我是刑警寧澤入桂,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布奄薇,位于F島的核電站,受9級(jí)特大地震影響抗愁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呵晚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一蜘腌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饵隙,春花似錦撮珠、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勺届。三九已至,卻和暖如春娶耍,著一層夾襖步出監(jiān)牢的瞬間免姿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工榕酒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胚膊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓想鹰,卻偏偏與公主長(zhǎng)得像紊婉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辑舷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 收藏一些關(guān)于Spring框架的面試題何缓,一方面是為了準(zhǔn)備找工作的時(shí)候看面試題肢础,另一方面,通過(guò)面試題的方式加深一些自己...
    雅倩蘭爸爸閱讀 495評(píng)論 0 2
  • 概述 Spring是什么歌殃? Spring是一個(gè)開(kāi)源框架乔妈,為了解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性而創(chuàng)建的,但是現(xiàn)在已經(jīng)不止于企...
    瑯筑閱讀 1,168評(píng)論 2 8
  • 一句話叫做“佛靠金裝氓皱,人靠衣裝”路召。合適的衣著,可以展現(xiàn)出個(gè)人獨(dú)特的氣質(zhì)波材。 我一直穿得比較偏休閑股淡,或者偶爾正式起來(lái)很...
    清溪草閱讀 74評(píng)論 0 1
  • 佤族有一個(gè)傳說(shuō)唯灵,說(shuō)人在百年之后,都會(huì)到一個(gè)地方隙轻。那是一個(gè)幽靜的山谷埠帕,有溪水潺潺,有樹(shù)影斑駁玖绿,初見(jiàn)它并不會(huì)把它和恐懼...
    吳此人z閱讀 498評(píng)論 0 0
  • 特別簡(jiǎn)單 為此我還專門錄制了全套的視頻
    子龍花卉折紙閱讀 404評(píng)論 3 6