10-Spring(131題)

1、不同版本的 Spring Framework 有哪些主要功能?

2、什么是 Spring Framework?

Spring 是一個(gè)開(kāi)源應(yīng)用框架,旨在降低應(yīng)用程序開(kāi)發(fā)的復(fù)雜度。它是輕量級(jí)、松散耦合的。它具有分層 體系結(jié)構(gòu),允許用戶(hù)選擇組件,同時(shí)還為 J2EE 應(yīng)用程序開(kāi)發(fā)提供了一個(gè)有凝聚力的框架。它可以集成 其他框架,如 Structs、Hibernate、EJB 等,所以又稱(chēng)為框架的框架。

3、列舉 Spring Framework 的優(yōu)點(diǎn)。

由于 Spring Frameworks 的分層架構(gòu),用戶(hù)可以自由選擇自己需要的組件。Spring Framework 支持 POJO(Plain Old Java Object) 編程,從而具備持續(xù)集成和可測(cè)試性。由于依賴(lài)注入和控制反轉(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è)模塊,它們分別是什么?

pring 核心容器 – 該層基本上是 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
該層為類(lèi)檢測(cè)和類(lèi)加載器實(shí)現(xiàn)提供支持。
Test
該層為使用 JUnit 和 TestNG 進(jìn)行測(cè)試提供支持。
幾個(gè)雜項(xiàng)模塊:
Messaging – 該模塊為 STOMP 提供支持。它還支持注解編程模型,該模型用于從 WebSocket 客戶(hù)端 路由和處理 STOMP 消息。Aspects – 該模塊為與 AspectJ 的集成提供支持。

6、什么是 Spring 配置文件?

Spring 配置文件是 XML 文件。該文件主要包含類(lèi)信息。它描述了這些類(lèi)是如何配置以及相互引入的。 但是,XML 配置文件冗長(zhǎng)且更加干凈。如果沒(méi)有正確規(guī)劃和編寫(xiě),那么在大項(xiàng)目中管理變得非常困難

7、Spring 應(yīng)用程序有哪些不同組件?

Spring 應(yīng)用一般有以下組件:
接口 - 定義功能。
Bean 類(lèi) - 它包含屬性,setter 和 getter 方法,函數(shù)等。
Spring 面向切面編程(AOP) - 提供面向切面編程的功能。
Bean 配置文件 - 包含類(lèi)的信息以及如何配置它們。
用戶(hù)程序 - 它使用接口。

8、使用 Spring 有哪些方式?

使用 Spring 有以下方式:
作為一個(gè)成熟的 Spring Web 應(yīng)用程序。
作為第三方 Web 框架,使用 Spring Frameworks 中間層。
用于遠(yuǎn)程使用。
作為企業(yè)級(jí) Java Bean,它可以包裝現(xiàn)有的 POJO(Plain Old Java Objects)。

9、什么是 Spring IOC 容器?

Spring 框架的核心是 Spring 容器。容器創(chuàng)建對(duì)象,將它們裝配在一起,配置它們并管理它們的完整生 命周期。Spring 容器使用依賴(lài)注入來(lái)管理組成應(yīng)用程序的組件。容器通過(guò)讀取提供的配置元數(shù)據(jù)來(lái)接收 對(duì)象進(jìn)行實(shí)例化,配置和組裝的指令。該元數(shù)據(jù)可以通過(guò) XML,Java 注解或 Java 代碼提供。

10、什么是依賴(lài)注入?

在依賴(lài)注入中,您不必創(chuàng)建對(duì)象,但必須描述如何創(chuàng)建它們。您不是直接在代碼中將組件和服務(wù)連接在 一起,而是描述配置文件中哪些組件需要哪些服務(wù)。由 IoC容器將它們裝配在一起。

11、可以通過(guò)多少種方式完成依賴(lài)注入?

通常,依賴(lài)注入可以通過(guò)三種方式完成,即:
構(gòu)造函數(shù)注入
setter 注入
接口注入
在 Spring Framework 中,僅使用構(gòu)造函數(shù)和 setter 注入。

12、區(qū)分構(gòu)造函數(shù)注入和 setter 注入

13、spring 中有多少種 IOC 容器?

BeanFactory - BeanFactory 就像一個(gè)包含 bean 集合的工廠類(lèi)。它會(huì)在客戶(hù)端要求時(shí)實(shí)例化 bean。 ApplicationContext - ApplicationContext 接口擴(kuò)展了 BeanFactory 接口。它在 BeanFactory 基礎(chǔ)上 提供了一些額外的功能。

14、區(qū)分 BeanFactory 和 ApplicationContext。

15、列舉 IoC 的一些好處。

IoC 的一些好處是:
它將最小化應(yīng)用程序中的代碼量。
它將使您的應(yīng)用程序易于測(cè)試,因?yàn)樗恍枰獑卧獪y(cè)試用例中的任何單例或 JNDI 查找機(jī)制。
它以最小的影響和最少的侵入機(jī)制促進(jìn)松耦合。
它支持即時(shí)的實(shí)例化和延遲加載服務(wù)。

16、Spring IoC 的實(shí)現(xiàn)機(jī)制。
Spring 中的 IoC 的實(shí)現(xiàn)原理就是工廠模式加反射機(jī)制。
實(shí)例:

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();
        }
    }
}

17、什么是 spring bean?

它們是構(gòu)成用戶(hù)應(yīng)用程序主干的對(duì)象。
Bean 由 Spring IoC 容器管理。
它們由 Spring IoC 容器實(shí)例化,配置,裝配和管理。
Bean 是基于用戶(hù)提供給容器的配置元數(shù)據(jù)創(chuàng)建。

18、spring 提供了哪些配置方式?
基于 xml 配置
bean 所需的依賴(lài)項(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)的類(lèi),方法或字段聲明上使用注解,將 bean 配置為組件類(lèi)本身,而不是使用 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 和 @Con?guration 來(lái)實(shí)現(xiàn)。
1、 @Bean 注解扮演與 元素相同的角色。
2、 @Con?guration 類(lèi)允許通過(guò)簡(jiǎn)單地調(diào)用同一個(gè)類(lèi)中的其他 @Bean 方法來(lái)定義 bean 間依賴(lài)關(guān)系。
例如:

@Configuration public class StudentConfig {
    @Bean
    public StudentBean myStudent() {
        return new StudentBean();
    }
}

19、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 - 類(lèi)似于標(biāo)準(zhǔn)的 HTTP Session 作用域,不過(guò)它僅僅在基于portlet 的 web 應(yīng)用中才有意 義。Portlet 規(guī)范定義了全局 Session 的概念,
它被所有構(gòu)成某個(gè) portlet web 應(yīng)用的各種不同的 portlet 所共享。在 globalsession 作用域中定義的 bean 被限定于全局 portlet Session 的生命周期范圍內(nèi)。如果你在 web 中使用 global session 作用域 來(lái)標(biāo)識(shí) bean,那么 web會(huì)自動(dòng)當(dāng)成 session 類(lèi)型來(lái)使用。

僅當(dāng)用戶(hù)使用支持 Web 的 ApplicationContext 時(shí),最后三個(gè)才可用。

20、spring bean 容器的生命周期是什么樣的?

spring bean 容器的生命周期流程如下:
1、Spring 容器根據(jù)配置中的 bean 定義中實(shí)例化 bean。
2、Spring 使用依賴(lài)注入填充所有屬性,如 bean 中所定義的配置。
3、如果 bean 實(shí)現(xiàn)BeanNameAware 接口,則工廠通過(guò)傳遞 bean 的 ID 來(lái)調(diào)用setBeanName()。 4、如果 bean 實(shí)現(xiàn) BeanFactoryAware 接口,工廠通過(guò)傳遞自身的實(shí)例來(lái)調(diào)用 setBeanFactory()。 5、如果存在與 bean 關(guān)聯(lián)的任何BeanPostProcessors,則調(diào)用 preProcessBeforeInitialization() 方 法。
6、如果為 bean 指定了 init 方法( 的 init-method 屬性),那么將調(diào)用它。
7、最后,如果存在與 bean 關(guān)聯(lián)的任何 BeanPostProcessors,則將調(diào)用 postProcessAfterInitialization() 方法。8、如果 bean 實(shí)現(xiàn)DisposableBean 接口,當(dāng) spring 容器關(guān)閉 時(shí),會(huì)調(diào)用 destory()。
9、如果為bean 指定了 destroy 方法( 的 destroy-method 屬性),那么將調(diào)用它。

21、什么是 spring 的內(nèi)部 bean?
只有將 bean 用作另一個(gè) bean 的屬性時(shí),才能將 bean 聲明為內(nèi)部 bean。為了定義 bean,Spring 的 基于 XML 的配置元數(shù)據(jù)在 或 中提供了 元素的使用。內(nèi)部 bean 總是匿名
的,它們總是作為原型。
例如,假設(shè)我們有一個(gè) Student 類(lèi),其中引用了 Person 類(lèi)。這里我們將只創(chuàng)建一個(gè) Person 類(lèi)實(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>

22、什么是 spring 裝配

當(dāng) bean 在 Spring 容器中組合在一起時(shí),它被稱(chēng)為裝配或 bean 裝配。Spring容器需要知道需要什么 bean 以及容器應(yīng)該如何使用依賴(lài)注入來(lái)將 bean 綁定在一起,同時(shí)裝配 bean。

23、自動(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 的 名稱(chēng)注入對(duì)象依賴(lài)項(xiàng)。它匹配并裝配其屬性與 XML文件中由相同名稱(chēng)定義的 bean。byType - 它根據(jù)類(lèi) 型注入對(duì)象依賴(lài)項(xiàng)。如果屬性的類(lèi)型與 XML 文件中的一個(gè) bean 名稱(chēng)匹配,則匹配并裝配屬性。構(gòu)造 函數(shù)- 它通過(guò)調(diào)用類(lèi)的構(gòu)造函數(shù)來(lái)注入依賴(lài)項(xiàng)。它有大量的參數(shù)。autodetect - 首先容器嘗試通過(guò)構(gòu)造 函數(shù)使用 autowire 裝配,如果不能,則嘗試通過(guò) byType 自動(dòng)裝配

24、自動(dòng)裝配有什么局限?

覆蓋的可能性 - 您始終可以使用 和 設(shè)置指定依賴(lài)項(xiàng),這將覆蓋自動(dòng)裝配?;驹獢?shù)據(jù)類(lèi)型 - 簡(jiǎn)單屬性 (如原數(shù)據(jù)類(lèi)型,字符串和類(lèi))無(wú)法自動(dòng)裝配。令人困惑的性質(zhì) - 總是喜歡使用明確的裝配,因?yàn)樽詣?dòng) 裝配不太精確。

25、什么是基于注解的容器配置

不使用 XML 來(lái)描述 bean 裝配,開(kāi)發(fā)人員通過(guò)在相關(guān)的類(lèi),方法或字段聲明上使用注解將配置移動(dòng)到 組件類(lèi)本身。它可以作為 XML 設(shè)置的替代方案。例如:Spring 的 Java 配置是通過(guò)使用 @Bean 和
@Con?guration 來(lái)實(shí)現(xiàn)。 @Bean 注解扮演與 元素相同的角色。 @Con?guration 類(lèi)允許通過(guò)簡(jiǎn)單地 調(diào)
用同一個(gè)類(lèi)中的其他 @Bean 方法來(lái)定義 bean 間依賴(lài)關(guān)系。
例如

@Configuration public class StudentConfig {
    @Bean
    public StudentBean myStudent() {
        return new StudentBean();
    }
}

26、如何在 spring 中啟動(dòng)注解裝配?

默認(rèn)情況下,Spring 容器中未打開(kāi)注解裝配。因此,要使用基于注解裝配,我們必須通過(guò)配置 <context:annotation-con?g/> 元素在 Spring 配置文件中啟用它。

27、@Component, @Controller, @Repository

@Service 有何區(qū)別?
@Component :這將 java 類(lèi)標(biāo)記為 bean。它是任何 Spring 管理組件的通用構(gòu)造型。spring 的組件 掃描機(jī)制現(xiàn)在可以將其拾取并將其拉入應(yīng)用程序環(huán)境中。
@Controller :這將一個(gè)類(lèi)標(biāo)記為 Spring Web MVC 控制器。標(biāo)有它的Bean 會(huì)自動(dòng)導(dǎo)入到 IoC 容器 中。
@Service :此注解是組件注解的特化。它不會(huì)對(duì) @Component 注解提供任何其他行為。您可以在服 務(wù)層類(lèi)中使用@Service 而不是 @Component,因?yàn)樗愿玫姆绞街付艘鈭D。
@Repository :這個(gè)注解是具有類(lèi)似用途和功能的 @Component 注解的特化。它為 DAO 提供了額外 的好處。它將 DAO 導(dǎo)入 IoC 容器,并使未經(jīng)檢查的異常有資格轉(zhuǎn)換為 Spring DataAccessException。

28、@Required 注解有什么用?

@Required 應(yīng)用于 bean 屬性 setter 方法。此注解僅指示必須在配置時(shí)使用bean 定義中的顯式屬性值 或使用自動(dòng)裝配填充受影響的 bean 屬性。如果尚未填充受影響的 bean 屬性,則容器將拋出 eanInitializationException。
示例:

public class Employee {
    private String name;
    @Required
    public void setName(String name){
        this.name=name;
    } 
    public string getName(){
        return name;
    }
}

29、@Autowired 注解有什么用?

@Autowired 可以更準(zhǔn)確地控制應(yīng)該在何處以及如何進(jìn)行自動(dòng)裝配。此注解用于在 setter 方法,構(gòu)造函 數(shù),具有任意名稱(chēng)或多個(gè)參數(shù)的屬性或方法上自動(dòng)裝配bean。默認(rèn)情況下,它是類(lèi)型驅(qū)動(dòng)的注入。

public class Employee {
    private String name;
    @Autowired
    public void setName(String name) {
        this.name=name;
    } 
    public string getName(){
        return name;
    }
}

30、@Quali?er 注解有什么用?

當(dāng)您創(chuàng)建多個(gè)相同類(lèi)型的 bean 并希望僅使用屬性裝配其中一個(gè) bean 時(shí),您可以使用@Quali?er 注解 和 @Autowired 通過(guò)指定應(yīng)該裝配哪個(gè)確切的 bean
來(lái)消除歧義。
例如,這里我們分別有兩個(gè)類(lèi),Employee 和 EmpAccount。在 EmpAccount中,使用@Quali?er 指定 了必須裝配 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);
    }
}

31、@RequestMapping 注解有什么用?

@RequestMapping 注解用于將特定 HTTP 請(qǐng)求方法映射到將處理相應(yīng)請(qǐng)求的 控制器中的特定類(lèi)/方法。此注釋可應(yīng)用于兩個(gè)級(jí)別:
類(lèi)級(jí)別:映射請(qǐng)求的 URL
方法級(jí)別:映射 URL 以及 HTTP 請(qǐng)求方法

32、spring DAO 有什么用?

Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數(shù)據(jù)訪問(wèn)技術(shù)更容易以一種統(tǒng)一的方式工作。這使 得用戶(hù)容易在持久性技術(shù)之間切換。它還允許您在編寫(xiě)代碼時(shí),無(wú)需考慮捕獲每種技術(shù)不同的異常。

33、列舉 Spring DAO 拋出的異常。

34、spring JDBC API 中存在哪些類(lèi)?

JdbcTemplate
SimpleJdbcTemplate
NamedParameterJdbcTemplate
SimpleJdbcInsert
SimpleJdbcCall

35、使用 Spring 訪問(wèn) Hibernate 的方法有哪些?

我們可以通過(guò)兩種方式使用 Spring 訪問(wèn) Hibernate:
1、 使用 Hibernate 模板和回調(diào)進(jìn)行控制反轉(zhuǎn)
2、 擴(kuò)展 HibernateDAOSupport 并應(yīng)用 AOP 攔截器節(jié)點(diǎn)

36、列舉 spring 支持的事務(wù)管理類(lèi)型

Spring 支持兩種類(lèi)型的事務(wù)管理:
1、 程序化事務(wù)管理:在此過(guò)程中,在編程的幫助下管理事務(wù)。它為您提供極大的靈活性,但維護(hù)起來(lái) 非常困難。
2、 聲明式事務(wù)管理:在此,事務(wù)管理與業(yè)務(wù)代碼分離。僅使用注解或基于 XML的配置來(lái)管理事務(wù)。

37、spring 支持哪些 ORM 框架

Hibernate
iBatis
JPA
JDO
OJB

38、什么是 AOP?

AOP(Aspect-Oriented Programming), 即 面向切面編程, 它與OOP( Object-Oriented Programming, 面向?qū)ο缶幊? 相輔相成, 提供了與OOP 不同的抽象軟件結(jié)構(gòu)的視角. 在 OOP 中, 我們以類(lèi)(class)作為我 們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)

39、什么是 Aspect?

aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接點(diǎn)的定義. Spring AOP 就是負(fù)責(zé)實(shí)施切面的框架, 它將切面所定義的橫切邏輯編織到切面所指定的連接點(diǎn)中. AOP 的工作重心在 于如何將增強(qiáng)編織目標(biāo)對(duì)象的連接點(diǎn)上, 這里包含兩個(gè)工作:
1、如何通過(guò) pointcut 和 advice 定位到特定的 joinpoint 上
2、如何在advice 中編寫(xiě)切面代碼.


以簡(jiǎn)單地認(rèn)為, 使用 @Aspect 注解的類(lèi)就是切面.

40、什么是切點(diǎn)(JoinPoint)

程序運(yùn)行中的一些時(shí)間點(diǎn), 例如一個(gè)方法的執(zhí)行, 或者是一個(gè)異常的處理.在 Spring AOP 中, join point 總 是方法的執(zhí)行點(diǎn)。

41、什么是通知(Advice)?

特定 JoinPoint 處的 Aspect 所采取的動(dòng)作稱(chēng)為 Advice。Spring AOP 使用一個(gè) Advice 作為攔截器,在 JoinPoint “周?chē)本S護(hù)一系列的攔截器。

42、有哪些類(lèi)型的通知(Advice)?

Before - 這些類(lèi)型的 Advice 在 joinpoint 方法之前執(zhí)行,并使用@Before 注解標(biāo)記進(jìn)行配置。
After Returning - 這些類(lèi)型的 Advice 在連接點(diǎn)方法正常執(zhí)行后執(zhí)行,并使用@AfterReturning 注解 標(biāo)記進(jìn)行配置。
After Throwing - 這些類(lèi)型的 Advice 僅在 joinpoint 方法通過(guò)拋出異常退出并使用 @AfterThrowing 注解標(biāo)記配置時(shí)執(zhí)行。
After (?nally) - 這些類(lèi)型的 Advice 在連接點(diǎn)方法之后執(zhí)行,無(wú)論方法退出是正常還是異常返回,并 使用 @After 注解標(biāo)記進(jìn)行配置。
Around - 這些類(lèi)型的 Advice 在連接點(diǎn)之前和之后執(zhí)行,并使用@Around 注解標(biāo)記進(jìn)行配置。

43、指出在 spring aop 中 concern 和 cross-cuttingconcern 的 不同之處。

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)題

44、AOP 有哪些實(shí)現(xiàn)方式?

實(shí) 現(xiàn) AOP 的 技 術(shù) , 主 要 分 為 兩 大 類(lèi) :
靜態(tài)代理
指使用 AOP 框架提供的命令進(jìn)行編譯,從而在編譯階段就可生成 AOP 代理類(lèi),因此也稱(chēng)為編譯時(shí)增 強(qiáng);
編譯時(shí)編織(特殊編譯器實(shí)現(xiàn))
類(lèi)加載時(shí)編織(特殊的類(lèi)加載器實(shí)現(xiàn))。
動(dòng)態(tài)代理
在運(yùn)行時(shí)在內(nèi)存中“臨時(shí)”生成 AOP 動(dòng)態(tài)代理類(lèi),因此也被稱(chēng)為運(yùn)行時(shí)增強(qiáng)。
JDK 動(dòng)態(tài)代理
CGLIB

45、Spring AOP and AspectJ AOP 有什么區(qū)別?

Spring AOP 基于動(dòng)態(tài)代理方式實(shí)現(xiàn);AspectJ 基于靜態(tài)代理方式實(shí)現(xiàn)。SpringAOP 僅支持方法級(jí)別的 PointCut;提供了完全的 AOP 支持,它還支持屬性級(jí)別的 PointCut。

46、如何理解 Spring 中的代理?

將 Advice 應(yīng)用于目標(biāo)對(duì)象后創(chuàng)建的對(duì)象稱(chēng)為代理。在客戶(hù)端對(duì)象的情況下,目標(biāo)對(duì)象和代理對(duì)象是相 同的。

Advice + Target Object = Proxy

47、什么是編織(Weaving)?

為了創(chuàng)建一個(gè) advice 對(duì)象而鏈接一個(gè) aspect 和其它應(yīng)用類(lèi)型或?qū)ο螅Q(chēng)為編織(Weaving)。在 Spring AOP 中,編織在運(yùn)行時(shí)執(zhí)行。請(qǐng)參考下圖:

48、Spring MVC 框架有什么用?

Spring Web MVC 框架提供 模型-視圖-控制器 架構(gòu)和隨時(shí)可用的組件,用于開(kāi)發(fā)靈活且松散耦合的 Web 應(yīng)用程序。MVC 模式有助于分離應(yīng)用程序的不同方面,如輸入邏輯,業(yè)務(wù)邏輯和 UI 邏輯,同時(shí)在 所有這些元素之間提供松散耦合。

49、描述一下 DispatcherServlet 的工作流程

DispatcherServlet 的工作流程可以用一幅圖來(lái)說(shuō)明:


1、向服務(wù)器發(fā)送 HTTP 請(qǐng)求,請(qǐng)求被前端控制器 DispatcherServlet 捕獲。
2、 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ì)象的形式返回。
3、 DispatcherServlet 根據(jù)獲得的 Handler,選擇一個(gè)合適的HandlerAdapter。(附注:如果成功獲
得 HandlerAdapter 后,此時(shí)將開(kāi)始執(zhí)行攔截器的 preHandler(...)方法)。
4、提取 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 中。
5、Handler(Controller)執(zhí)行完成后,向 DispatcherServlet 返回一個(gè)ModelAndView 對(duì)象;
6、根據(jù)返回的 ModelAndView,選擇一個(gè)適合的 ViewResolver(必須是已經(jīng)注冊(cè)到 Spring 容器中的 ViewResolver)返回給 DispatcherServlet。
7、 ViewResolver 結(jié)合 Model 和 View,來(lái)渲染視圖。
8、視圖負(fù)責(zé)將渲染結(jié)果返回給客戶(hù)端。

50、介紹一下 WebApplicationContext

WebApplicationContext 是 ApplicationContext 的擴(kuò)展。它具有 Web 應(yīng)用程序所需的一些額外功能。 它與普通的 ApplicationContext 在解析主題和決定與哪個(gè) servlet 關(guān)聯(lián)的能力方面有所不同。
英文原文鏈接:
https://www.edureka.co/blog/interview-questions/spring-interview-questions/

51、什么是 spring?

Spring 是個(gè) java 企業(yè)級(jí)應(yīng)用的開(kāi)源開(kāi)發(fā)框架。Spring 主要用來(lái)開(kāi)發(fā) Java 應(yīng)用,但是有些擴(kuò)展是針對(duì)構(gòu) 建 J2EE 平臺(tái)的 web 應(yīng)用。Spring 框架目標(biāo)是簡(jiǎn)化 Java企業(yè)級(jí)應(yīng)用開(kāi)發(fā),并通過(guò) POJO 為基礎(chǔ)的編程模 型促進(jìn)良好的編程習(xí)慣。

52、使用 Spring 框架的好處是什么?

輕量:Spring 是輕量的,基本的版本大約 2MB。
** 控制反轉(zhuǎn):**Spring 通過(guò)控制反轉(zhuǎn)實(shí)現(xiàn)了松散耦合,對(duì)象們給出它們的依賴(lài),而不是創(chuàng)建或查找依賴(lài)的 對(duì)象們。
面向切面的編程(AOP):Spring 支持面向切面的編程,并且把應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開(kāi)。
容器:Spring 包含并管理應(yīng)用中對(duì)象的生命周期和配置。
MVC 框架:Spring 的 WEB 框架是個(gè)精心設(shè)計(jì)的框架,是 Web 框架的一個(gè)很好的替代品。
事務(wù)管理:Spring 提供一個(gè)持續(xù)的事務(wù)管理接口,可以擴(kuò)展到上至本地事務(wù)下至全局事務(wù)(JTA)。
異常處理:Spring 提供方便的API把具體技術(shù)相關(guān)的異常(比如由JDBC,Hibernate or JDO 拋出的) 轉(zhuǎn)化為一致的 unchecked 異常。

53、Spring 由哪些模塊組成?

以下是 Spring 框架的基本模塊:
Core module
Bean module
Context module
Expression Language module
JDBC module
ORM module
OXM module
Java Messaging Service(JMS) module
Transaction module
Web module
Web-Servlet module
Web-Struts module
Web-Portlet module

54、Spring的IOC和AOP機(jī)制

我們是在使用Spring框架的過(guò)程中,其實(shí)就是為了使用IOC,依賴(lài)注入,和AOP,面向切面編程,這兩 個(gè)是Spring的靈魂。
主要用到的設(shè)計(jì)模式有工廠模式和代理模式。
IOC就是典型的工廠模式,通過(guò)sessionfactory去注入實(shí)例。
AOP就是典型的代理模式的體現(xiàn)。
代理模式是常用的java設(shè)計(jì)模式,他的特征是代理類(lèi)與委托類(lèi)有同樣的接口,代理類(lèi)主要負(fù)責(zé)為委托類(lèi) 預(yù)處理消息、過(guò)濾消息、把消息轉(zhuǎn)發(fā)給委托類(lèi),以及事后處理消息等。代理類(lèi)與委托類(lèi)之間通常會(huì)存在 關(guān)聯(lián)關(guān)系,一個(gè)代理類(lèi)的對(duì)象與一個(gè)委托類(lèi)的對(duì)象關(guān)聯(lián),代理類(lèi)的對(duì)象本身并不真正實(shí)現(xiàn)服務(wù),而是通 過(guò)調(diào)用委托類(lèi)的對(duì)象的相關(guān)方法,來(lái)提供特定的服務(wù)

spring的IoC容器是spring的核心,spring AOP是spring框架的重要組成部分。

在傳統(tǒng)的程序設(shè)計(jì)中,當(dāng)調(diào)用者需要被調(diào)用者的協(xié)助時(shí),通常由調(diào)用者來(lái)創(chuàng)建被調(diào)用者的實(shí)例。但在 spring里創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來(lái)完成,因此控制反轉(zhuǎn)(IoC);創(chuàng)建被調(diào)用者實(shí)例的工作 通常由spring容器來(lái)完成,然后注入調(diào)用者,因此也被稱(chēng)為依賴(lài)注入(DI),依賴(lài)注入和控制反轉(zhuǎn)是同 一個(gè)概念。

面向方面編程(AOP)是以另一個(gè)角度來(lái)考慮程序結(jié)構(gòu),通過(guò)分析程序結(jié)構(gòu)的關(guān)注點(diǎn)來(lái)完善面向?qū)ο缶幊?(OOP)。OOP將應(yīng)用程序分解成各個(gè)層次的對(duì)象,而AOP將程序分解成多個(gè)切面。spring AOP 只實(shí) 現(xiàn)了方法級(jí)別的連接點(diǎn),在J2EE應(yīng)用中,AOP攔截到方法級(jí)別的操作就已經(jīng)足夠。在spring中,未來(lái)使 IoC方便地使用健壯、靈活的企業(yè)服務(wù),需要利用spring AOP實(shí)現(xiàn)為IoC和企業(yè)服務(wù)之間建立聯(lián)系。

IOC:控制反轉(zhuǎn)也叫依賴(lài)注入。利用了工廠模式

將對(duì)象交給容器管理,你只需要在spring配置文件總配置相應(yīng)的bean,以及設(shè)置相關(guān)的屬性,讓spring 容器來(lái)生成類(lèi)的實(shí)例對(duì)象以及管理對(duì)象。在spring容器啟動(dòng)的時(shí)候,spring會(huì)把你在配置文件中配置的 bean都初始化好,然后在你需要調(diào)用的時(shí)候,就把它已經(jīng)初始化好的那些bean分配給你需要調(diào)用這些 bean的類(lèi)(假設(shè)這個(gè)類(lèi)名是A),分配的方法就是調(diào)用A的setter方法來(lái)注入,而不需要你在A里面new 這些bean了。
注意:面試的時(shí)候,如果有條件,畫(huà)圖,這樣更加顯得你懂了

AOP:面向切面編程。(Aspect-Oriented Programming)

AOP可以說(shuō)是對(duì)OOP的補(bǔ)充和完善。OOP引入封裝、繼承和多態(tài)性等概念來(lái)建立一種對(duì)象層次結(jié)構(gòu), 用以模擬公共行為的一個(gè)集合。當(dāng)我們需要為分散的對(duì)象引入公共行為的時(shí)候,OOP則顯得無(wú)能為力。 也就是說(shuō),OOP允許你定義從上到下的關(guān)系,但并不適合定義從左到右的關(guān)系。例如日志功能。日志代 碼往往水平地散布在所有對(duì)象層次中,而與它所散布到的對(duì)象的核心功能毫無(wú)關(guān)系。在OOP設(shè)計(jì)中,它 導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。將程序中的交叉業(yè)務(wù)邏輯(比如安全,日志,事務(wù) 等),封裝成一個(gè)切面,然后注入到目標(biāo)對(duì)象(具體
業(yè)務(wù)邏輯)中去。

實(shí)現(xiàn)AOP的技術(shù),主要分為兩大類(lèi):一是采用動(dòng)態(tài)代理技術(shù),利用截取消息的方式,對(duì)該消息進(jìn)行裝 飾,以取代原有對(duì)象行為的執(zhí)行;二是采用靜態(tài)織入的方式,引入特定的語(yǔ)法創(chuàng)建“方面”,從而使得編 譯器可以在編譯期間織入有關(guān)“方面”的代碼.

簡(jiǎn)單點(diǎn)解釋?zhuān)确秸f(shuō)你想在你的biz層所有類(lèi)中都加上一個(gè)打印‘你好’的功能,這時(shí)就可以用aop思想來(lái)做. 你先寫(xiě)個(gè)類(lèi)寫(xiě)個(gè)類(lèi)方法,方法經(jīng)實(shí)現(xiàn)打印‘你好’,然后Ioc這個(gè)類(lèi) ref=“biz.*”讓每個(gè)類(lèi)都注入即可實(shí)現(xiàn)

55、Spring中Autowired和Resource關(guān)鍵字的區(qū)別

@Resource和@Autowired都是做bean的注入時(shí)使用,其實(shí)@Resource并不是Spring的注解,它的包 是javax.annotation.Resource,需要導(dǎo)入,但是Spring支持該注解的注入。
1、共同點(diǎn)
兩者都可以寫(xiě)在字段和setter方法上。兩者如果都寫(xiě)在字段上,那么就不需要再寫(xiě)setter方法。
2、不同點(diǎn)
(1)@Autowired
@Autowired為Spring提供的注解,需要導(dǎo)入包
org.springframework.beans.factory.annotation.Autowired;只按照byType注入

public class TestServiceImpl {
    // 下面兩種@Autowired只要使用一種即可
    @Autowired
    private UserDao userDao; // 用于字段上
    @Autowired
    public void setUserDao(UserDao userDao) { // 用于屬性的方法上
        this.userDao = userDao;
    }
}

@Autowired注解是按照類(lèi)型(byType)裝配依賴(lài)對(duì)象,默認(rèn)情況下它要求依賴(lài)對(duì)象必須存在,如果允 許null值,可以設(shè)置它的required屬性為false。如果我們想使用按照名稱(chēng)(byName)來(lái)裝配,可以結(jié) 合@Quali?er注解一起使用。如下:

public class TestServiceImpl {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao; 
}

(2)@Resource
@Resource默認(rèn)按照ByName自動(dòng)注入,由J2EE提供,需要導(dǎo)入包javax.annotation.Resource。
@Resource有兩個(gè)重要的屬性:name和type,而Spring將@Resource注解的name屬性解析為bean的 名字,而type屬性則解析為bean的類(lèi)型。所以,如果使用name屬性,則使用byName的自動(dòng)注入策 略,而使用type屬性時(shí)則使用byType自動(dòng)注入策略。如果既不制定name也不制定type屬性,這時(shí)將通 過(guò)反射機(jī)制使用byName自動(dòng)注入策略

public class TestServiceImpl {
    // 下面兩種@Resource只要使用一種即可
    @Resource(name="userDao")
    private UserDao userDao; // 用于字段上
    @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用于屬性的setter方法上
        this.userDao = userDao;
    }
}

注:最好是將@Resource放在setter方法上,因?yàn)檫@樣更符合面向?qū)ο蟮乃枷?,通過(guò)set、get去 操作屬
性,而不是直接去操作屬性。

@Resource裝配順序:
①如果同時(shí)指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異 常。
②如果指定了name,則從上下文中查找名稱(chēng)(id)匹配的bean進(jìn)行裝配,找不到則拋出異常。
③如果指定了type,則從上下文中找到類(lèi)似匹配的唯一bean進(jìn)行裝配,找不到或是找到多個(gè),都會(huì)拋 出異常
④如果既沒(méi)有指定name,又沒(méi)有指定type,則自動(dòng)按照byName方式進(jìn)行裝配;如果沒(méi)有匹配,則回 退為一個(gè)原始類(lèi)型進(jìn)行匹配,如果匹配則自動(dòng)裝配。@Resource的作用相當(dāng)于@Autowired,只不過(guò) @Autowired按照byType自動(dòng)注入

56、依賴(lài)注入的方式有幾種,各是什么?

一、構(gòu)造器注入
將被依賴(lài)對(duì)象通過(guò)構(gòu)造函數(shù)的參數(shù)注入給依賴(lài)對(duì)象,并且在初始化對(duì)象的時(shí)候注入。
優(yōu)點(diǎn):
對(duì)象初始化完成后便可獲得可使用的對(duì)象。
缺點(diǎn):
當(dāng)需要注入的對(duì)象很多時(shí),構(gòu)造器參數(shù)列表將會(huì)很長(zhǎng);不夠靈活。若有多種注入方式,每種方式只需注 入指定幾個(gè)依賴(lài),那么就需要提供多個(gè)重載的構(gòu)造函數(shù),麻煩。
二、setter方法注入
IoC Service Provider通過(guò)調(diào)用成員變量提供的setter函數(shù)將被依賴(lài)對(duì)象注入給依賴(lài)類(lèi)。
優(yōu)點(diǎn):
靈活。可以選擇性地注入需要的對(duì)象。
缺點(diǎn):
依賴(lài)對(duì)象初始化完成后由于尚未注入被依賴(lài)對(duì)象,因此還不能使用。
三、接口注入
依賴(lài)類(lèi)必須要實(shí)現(xiàn)指定的接口,然后實(shí)現(xiàn)該接口中的一個(gè)函數(shù),該函數(shù)就是用于依賴(lài)注入。該函數(shù)的參 數(shù)就是要注入的對(duì)象
優(yōu)點(diǎn)
接口注入中,接口的名字、函數(shù)的名字都不重要,只要保證函數(shù)的參數(shù)是要注入的對(duì)象類(lèi)型即可。
缺點(diǎn):
侵入行太強(qiáng),不建議使用。
PS:什么是侵入行?
如果類(lèi)A要使用別人提供的一個(gè)功能,若為了使用這功能,需要在自己的類(lèi)中增加額外的代碼,這就是侵入性

57、講一下什么是Spring

Spring是一個(gè)輕量級(jí)的IoC和AOP容器框架。是為Java應(yīng)用程序提供基礎(chǔ)性服務(wù)的一套框架,目的是用 于簡(jiǎn)化企業(yè)應(yīng)用程序的開(kāi)發(fā),它使得開(kāi)發(fā)者只需要關(guān)心業(yè)務(wù)需求。常見(jiàn)的配置方式有三種:基于XML的 配置、基于注解的配置、基于Java的配置。
主要由以下幾個(gè)模塊組成:
Spring Core:核心類(lèi)庫(kù),提供IOC服務(wù);
Spring Context:提供框架式的Bean訪問(wèn)方式,以及企業(yè)級(jí)功能(JNDI、定時(shí)任務(wù)等);
Spring AOP:AOP服務(wù);
Spring DAO:對(duì)JDBC的抽象,簡(jiǎn)化了數(shù)據(jù)訪問(wèn)異常的處理
Spring ORM:對(duì)現(xiàn)有的ORM框架的支持;
Spring Web:提供了基本的面向Web的綜合特性,例如多方文件上傳; Spring MVC:提供面向Web應(yīng)用的Model-View-Controller實(shí)現(xiàn)。

58、Spring MVC流程

1、 用戶(hù)發(fā)送請(qǐng)求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到請(qǐng)求調(diào)用HandlerMapping處理器映射器。
3、 處理器映射器找到具體的處理器(可以根據(jù)xml配置、注解進(jìn)行查找),生成處理器對(duì)象及處理器攔截 器(如果有則生成)一并返回給DispatcherServlet。
4、 DispatcherServlet調(diào)用HandlerAdapter處理器適配器。
5、 HandlerAdapter經(jīng)過(guò)適配調(diào)用具體的處理器(Controller,也叫后端控制器)。
6、 Controller執(zhí)行完成返回ModelAndView。
7、 HandlerAdapter將controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet。 8、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
9、 ViewReslover解析后返回具體View。
10、DispatcherServlet根據(jù)View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)。
11、 DispatcherServlet響應(yīng)用戶(hù)

組件說(shuō)明:
以下組件通常使用框架提供實(shí)現(xiàn):

DispatcherServlet:作為前端控制器,整個(gè)流程控制的中心,控制其它組件執(zhí)行,統(tǒng)一調(diào)度,降低組件 之間的耦合性,提高每個(gè)組件的擴(kuò)展性
HandlerMapping:通過(guò)擴(kuò)展處理器映射器實(shí)現(xiàn)不同的映射方式,例如:配置文件方式,實(shí)現(xiàn)接口方 式,注解方式等。
HandlAdapter:通過(guò)擴(kuò)展處理器適配器,支持更多類(lèi)型的處理器。
ViewResolver:通過(guò)擴(kuò)展視圖解析器,支持更多類(lèi)型的視圖解析,例如:jsp、freemarker、pdf、 excel等。

組件:

1、前端控制器DispatcherServlet(不需要工程師開(kāi)發(fā)),由框架提供
作用:接收請(qǐng)求,響應(yīng)結(jié)果,相當(dāng)于轉(zhuǎn)發(fā)器,中央處理器。有了dispatcherServlet減少了其它組件之間 的耦合度。
用戶(hù)請(qǐng)求到達(dá)前端控制器,它就相當(dāng)于mvc模式中的c,dispatcherServlet是整個(gè)流程控制的中心,由 它調(diào)用其它組件處理用戶(hù)的請(qǐng)求,dispatcherServlet的存在降低了組件之間的耦合性。
2、處理器映射器HandlerMapping(不需要工程師開(kāi)發(fā)),由框架提供
作用:根據(jù)請(qǐng)求的url查找Handler
HandlerMapping負(fù)責(zé)根據(jù)用戶(hù)請(qǐng)求找到Handler即處理器,springmvc提供了不同的映射器實(shí)現(xiàn)不同 的映射方式,例如:配置文件方式,實(shí)現(xiàn)接口方式,注解方式等。
3、處理器適配器HandlerAdapter
作用:按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler
通過(guò)HandlerAdapter對(duì)處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用,通過(guò)擴(kuò)展適配器可以對(duì)更多類(lèi)型的 處理器進(jìn)行執(zhí)行。
4、處理器Handler(需要工程師開(kāi)發(fā))
注意:編寫(xiě)Handler時(shí)按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler Handler 是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對(duì)具 體的用戶(hù)請(qǐng)求進(jìn)行處理。
由于Handler涉及到具體的用戶(hù)業(yè)務(wù)請(qǐng)求,所以一般情況需要工程師根據(jù)業(yè)務(wù)需求開(kāi)發(fā)Handler。
5、視圖解析器View resolver(不需要工程師開(kāi)發(fā)),由框架提供
作用:進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view)
View Resolver負(fù)責(zé)將處理結(jié)果生成View視圖,View Resolver首先根據(jù)邏輯視圖名解析成物理視圖名即 具體的頁(yè)面地址,再生成View視圖對(duì)象,最后對(duì)View進(jìn)行渲染將處理結(jié)果通過(guò)頁(yè)面展示給用戶(hù)。 springmvc框架提供了很多的View視圖類(lèi)型,包括:jstlView、freemarkerView、pdfView等。一般情 況下需要通過(guò)頁(yè)面標(biāo)簽或頁(yè)面模版技術(shù)將模型數(shù)據(jù)通過(guò)頁(yè)面展示給用戶(hù),需要由工程師根據(jù)業(yè)務(wù)需求開(kāi) 發(fā)具體的頁(yè)面。
6、視圖View(需要工程師開(kāi)發(fā)jsp...)
View是一個(gè)接口,實(shí)現(xiàn)類(lèi)支持不同的View類(lèi)型(jsp、freemarker、pdf...)核心架構(gòu)的具體流程步驟如 下:
1、首先用戶(hù)發(fā)送請(qǐng)求——>DispatcherServlet,前端控制器收到請(qǐng)求后自己不進(jìn)行處理,而是委托給 其他的解析器進(jìn)行處理,作為統(tǒng)一訪問(wèn)點(diǎn),進(jìn)行全局的流程控制;
2、DispatcherServlet——>HandlerMapping, HandlerMapping 將會(huì)把請(qǐng)求映射為 HandlerExecutionChain 對(duì)象(包含一個(gè)Handler 處理器(頁(yè)面控制器)對(duì)象、多個(gè) HandlerInterceptor 攔截器)對(duì)象,通過(guò)這種策略模式,很容易添加新的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 將會(huì)把處理器包裝為適配器,從而支 持多種類(lèi)型的處理器,即適配器設(shè)計(jì)模式的應(yīng)用,從而很容易支持很多類(lèi)型的處理器;
4、HandlerAdapter——>處理器功能處理方法的調(diào)用,HandlerAdapter 將會(huì)根據(jù)適配的結(jié)果調(diào)用真 正的處理器的功能處理方法,完成功能處理;并返回一個(gè)ModelAndView 對(duì)象(包含模型數(shù)據(jù)、邏輯視 圖名);
5、ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver 將把邏輯視圖名解析為具體的 View,通過(guò)這種策略模式,很容易更換其他視圖技術(shù);
6、View——>渲染,View會(huì)根據(jù)傳進(jìn)來(lái)的Model模型數(shù)據(jù)進(jìn)行渲染,此處的Model實(shí)際是一個(gè)Map數(shù) 據(jù)結(jié)構(gòu),因此很容易支持其他視圖技術(shù);
7、返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶(hù),到此一個(gè)流程結(jié)束。下邊 兩個(gè)組件通常情況下需要開(kāi)發(fā):
Handler:處理器,即后端控制器用controller表示。
View:視圖,即展示給用戶(hù)的界面,視圖中通常需要標(biāo)簽語(yǔ)言展示模型數(shù)據(jù)。

59、springMVC是什么

springMVC是一個(gè)MVC的開(kāi)源框架,springMVC=struts2+spring,springMVC就相當(dāng)于是Struts2加上 sring的整合,但是這里有一個(gè)疑惑就是,springMVC和spring是什么樣的關(guān)系呢?這個(gè)在百度百科上有 一個(gè)很好的解釋?zhuān)阂馑际钦f(shuō),springMVC是spring的一個(gè)后續(xù)產(chǎn)品,其實(shí)就是spring在原有基礎(chǔ)上,又 提供了web應(yīng)用的MVC模塊,可以簡(jiǎn)單的把springMVC理解為是spring的一個(gè)模塊(類(lèi)似AOP,IOC這 樣的模塊),網(wǎng)絡(luò)上經(jīng)常會(huì)說(shuō)springMVC和spring無(wú)縫集成,其實(shí)springMVC就是spring的一個(gè)子模塊,所以根本不需要同spring進(jìn)行整合

60、SpringMVC怎么樣設(shè)定重定向和轉(zhuǎn)發(fā)的?

(1)轉(zhuǎn)發(fā):在返回值前面加"forward:",譬如"forward:user.do?name=method4
(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"

61、SpringMVC常用的注解有哪些

@RequestMapping:用于處理請(qǐng)求 url 映射的注解,可用于類(lèi)或方法上。用于類(lèi)上,則表示類(lèi)中的所 有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑。
@RequestBody:注解實(shí)現(xiàn)接收http請(qǐng)求的json數(shù)據(jù),將json轉(zhuǎn)換為java對(duì)象。
@ResponseBody:注解實(shí)現(xiàn)將conreoller方法返回對(duì)象轉(zhuǎn)化為json對(duì)象響應(yīng)給客戶(hù)

62、Spring的AOP理解

OOP面向?qū)ο螅试S開(kāi)發(fā)者定義縱向的關(guān)系,但并適用于定義橫向的關(guān)系,導(dǎo)致了大量代碼的重復(fù),而 不利于各個(gè)模塊的重用。
AOP,一般稱(chēng)為面向切面,作為面向?qū)ο蟮囊环N補(bǔ)充,用于將那些與業(yè)務(wù)無(wú)關(guān),但卻對(duì)多個(gè)對(duì)象產(chǎn)生影 響的公共行為和邏輯,抽取并封裝為一個(gè)可重用的模塊,這個(gè)模塊被命名為“切面”(Aspect),減少系 統(tǒng)中的重復(fù)代碼,降低了模塊間的耦合度,同時(shí)提高了系統(tǒng)的可維護(hù)性??捎糜跈?quán)限認(rèn)證、日志、事務(wù)處理。

AOP實(shí)現(xiàn)的關(guān)鍵在于代理模式,AOP代理主要分為靜態(tài)代理和動(dòng)態(tài)代理。靜態(tài)代理的代表為AspectJ; 動(dòng)態(tài)代理則以Spring AOP為代表。
(1)AspectJ是靜態(tài)代理的增強(qiáng),所謂靜態(tài)代理,就是AOP框架會(huì)在編譯階段生成AOP代理類(lèi),因此也 稱(chēng)為編譯時(shí)增強(qiáng),他會(huì)在編譯階段將AspectJ(切面)織入到Java字節(jié)碼中,運(yùn)行的時(shí)候就是增強(qiáng)之后的 AOP對(duì)象。
(2)Spring AOP使用的動(dòng)態(tài)代理,所謂的動(dòng)態(tài)代理就是說(shuō)AOP框架不會(huì)去修改字節(jié)碼,而是每次運(yùn)行 時(shí)在內(nèi)存中臨時(shí)為方法生成一個(gè)AOP對(duì)象,這個(gè)AOP對(duì)象包含了目標(biāo)對(duì)象的全部方法,并且在特定的切 點(diǎn)做了增強(qiáng)處理,并回調(diào)原對(duì)象的方法。
Spring AOP中的動(dòng)態(tài)代理主要有兩種方式,JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理 :
①JDK動(dòng)態(tài)代理只提供接口的代理,不支持類(lèi)的代理。核心InvocationHandler接口和Proxy類(lèi), InvocationHandler 通過(guò)invoke()方法反射來(lái)調(diào)用目標(biāo)類(lèi)中的代碼,動(dòng)態(tài)地將橫切邏輯和業(yè)務(wù)編織在一 起;接著,Proxy利用 InvocationHandler動(dòng)態(tài)創(chuàng)建一個(gè)符合某一接口的的實(shí)例, 生成目標(biāo)類(lèi)的代理對(duì)
象。
②如果代理類(lèi)沒(méi)有實(shí)現(xiàn) InvocationHandler 接口,那么Spring AOP會(huì)選擇使用CGLIB來(lái)動(dòng)態(tài)代理目標(biāo) 類(lèi)。CGLIB(Code Generation Library),是一個(gè)代碼生成的類(lèi)庫(kù),可以在運(yùn)行時(shí)動(dòng)態(tài)的生成指定類(lèi)的 一個(gè)子類(lèi)對(duì)象,并覆蓋其中特定方法并添加增強(qiáng)代碼,從而實(shí)現(xiàn)AOP。CGLIB是通過(guò)繼承的方式做的動(dòng) 態(tài)代理,因此如果某個(gè)類(lèi)被標(biāo)記為?nal,那么它是無(wú)法使用CGLIB做動(dòng)態(tài)代理的
3)靜態(tài)代理與動(dòng)態(tài)代理區(qū)別在于生成AOP代理對(duì)象的時(shí)機(jī)不同,相對(duì)來(lái)說(shuō)AspectJ的靜態(tài)代理方式具 有更好的性能,但是AspectJ需要特定的編譯器進(jìn)行處理,而Spring AOP則無(wú)需特定的編譯器處理。

63、Spring的IOC理解

(1)IOC就是控制反轉(zhuǎn),是指創(chuàng)建對(duì)象的控制權(quán)的轉(zhuǎn)移,以前創(chuàng)建對(duì)象的主動(dòng)權(quán)和時(shí)機(jī)是由自己把控的, 而現(xiàn)在這種權(quán)力轉(zhuǎn)移到Spring容器中,并由容器根據(jù)配置文件去創(chuàng)建實(shí)例和管理各個(gè)實(shí)例之間的依賴(lài)關(guān) 系,對(duì)象與對(duì)象之間松散耦合,也利于功能的復(fù)用。DI依賴(lài)注入,和控制反轉(zhuǎn)是同一個(gè)概念的不同角度 的描述,即 應(yīng)用程序在運(yùn)行時(shí)依賴(lài)IoC容器來(lái)動(dòng)態(tài)注入對(duì)象需要的外部資源。
(2)最直觀的表達(dá)就是,IOC讓對(duì)象的創(chuàng)建不用去new了,可以由spring自動(dòng)生產(chǎn),使用java的反射機(jī) 制,根據(jù)配置文件在運(yùn)行時(shí)動(dòng)態(tài)的去創(chuàng)建對(duì)象以及管理對(duì)象,并調(diào)用對(duì)象的方法的。
(3)Spring的IOC有三種注入方式 :構(gòu)造器注入、setter方法注入、根據(jù)注解注入。
IoC讓相互協(xié)作的組件保持松散的耦合,而AOP編程允許你把遍布于應(yīng)用各層的功能分離出來(lái)形成 可重用的功能組件

64、解釋一下spring bean的生命周期

首先說(shuō)一下Servlet的生命周期:實(shí)例化,初始init,接收請(qǐng)求service,銷(xiāo)毀destroy;Spring上下文中 的Bean生命周期也類(lèi)似,如下:
(1)實(shí)例化Bean:
對(duì)于BeanFactory容器,當(dāng)客戶(hù)向容器請(qǐng)求一個(gè)尚未初始化的bean時(shí),或初始化bean的時(shí)候需要注入 另一個(gè)尚未初始化的依賴(lài)時(shí),容器就會(huì)調(diào)用createBean進(jìn)行實(shí)例化。對(duì)于ApplicationContext容器,當(dāng) 容器啟動(dòng)結(jié)束后,通過(guò)獲取BeanDe?nition對(duì)象中的信息,實(shí)例化所有的bean。
(2)設(shè)置對(duì)象屬性(依賴(lài)注入):
實(shí)例化后的對(duì)象被封裝在BeanWrapper對(duì)象中,緊接著,Spring根據(jù)BeanDe?nition中的信息 以及 通 過(guò)BeanWrapper提供的設(shè)置屬性的接口完成依賴(lài)注入。
(3)處理Aware接口:
接著,Spring會(huì)檢測(cè)該對(duì)象是否實(shí)現(xiàn)了xxxAware接口,并將相關(guān)的xxxAware實(shí)例注入給Bean:
①如果這個(gè)Bean已經(jīng)實(shí)現(xiàn)了BeanNameAware接口,會(huì)調(diào)用它實(shí)現(xiàn)的setBeanName(String beanId)方 法,此處傳遞的就是Spring配置文件中Bean的id值;
②如果這個(gè)Bean已經(jīng)實(shí)現(xiàn)了BeanFactoryAware接口,會(huì)調(diào)用它實(shí)現(xiàn)的setBeanFactory()方法,傳遞的 是Spring工廠自身。
③如果這個(gè)Bean已經(jīng)實(shí)現(xiàn)了ApplicationContextAware接口,會(huì)調(diào)用
setApplicationContext(ApplicationContext)方法,傳入Spring上下文;
(4)BeanPostProcessor:
如果想對(duì)Bean進(jìn)行一些自定義的處理,那么可以讓Bean實(shí)現(xiàn)了BeanPostProcessor接口,那將會(huì)調(diào)用 postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean 與 init-method:
如果Bean在Spring配置文件中配置了 init-method 屬性,則會(huì)自動(dòng)調(diào)用其配置的初始化方法。
(6)如果這個(gè)Bean實(shí)現(xiàn)了BeanPostProcessor接口,將會(huì)調(diào)用postProcessAfterInitialization(Object obj, String s)方法;由于這個(gè)方法是在Bean初始化結(jié)束時(shí)調(diào)用的,所以可以被應(yīng)用于內(nèi)存或緩存技術(shù)
以上幾個(gè)步驟完成后,Bean就已經(jīng)被正確創(chuàng)建了,之后就可以使用這個(gè)Bean了
7)DisposableBean:
當(dāng)Bean不再需要時(shí),會(huì)經(jīng)過(guò)清理階段,如果Bean實(shí)現(xiàn)了DisposableBean這個(gè)接口,會(huì)調(diào)用其實(shí)現(xiàn)的 destroy()方法;
(8)destroy-method:
最后,如果這個(gè)Bean的Spring配置中配置了destroy-method屬性,會(huì)自動(dòng)調(diào)用其配置的銷(xiāo)毀方法

65、解釋Spring支持的幾種bean的作用域。

Spring容器中的bean可以分為5個(gè)范圍:
(1)singleton:默認(rèn),每個(gè)容器中只有一個(gè)bean的實(shí)例,單例的模式由BeanFactory自身來(lái)維護(hù)。 (2)prototype:為每一個(gè)bean請(qǐng)求提供一個(gè)實(shí)例。
(3)request:為每一個(gè)網(wǎng)絡(luò)請(qǐng)求創(chuàng)建一個(gè)實(shí)例,在請(qǐng)求完成以后,bean會(huì)失效并被垃圾回收器回
收。
(4)session:與request范圍類(lèi)似,確保每個(gè)session中有一個(gè)bean的實(shí)例,在session過(guò)期后,bean 會(huì)隨之失效。
(5)global-session:全局作用域,global-session和Portlet應(yīng)用相關(guān)。當(dāng)你的應(yīng)用部署在Portlet容器 中工作時(shí),它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲(chǔ)變量的話,那么這全局 變量需要存儲(chǔ)在global-session中。全局作用域與Servlet中的session作用域效果相同

66、Spring基于xml注入bean的幾種方式

(1)Set方法注入;
(2)構(gòu)造器注入:①通過(guò)index設(shè)置參數(shù)的位置;②通過(guò)type設(shè)置參數(shù)類(lèi)型; (3)靜態(tài)工廠注入;
(4)實(shí)例工廠;
詳細(xì)內(nèi)容可以閱讀:https://blog.csdn.net/a745233700/article/details/89307518

67、Spring框架中都用到了哪些設(shè)計(jì)模式

(1)工廠模式:BeanFactory就是簡(jiǎn)單工廠模式的體現(xiàn),用來(lái)創(chuàng)建對(duì)象的實(shí)例;
(2)單例模式:Bean默認(rèn)為單例模式。
(3)代理模式:Spring的AOP功能用到了JDK的動(dòng)態(tài)代理和CGLIB字節(jié)碼生成技術(shù);
(4)模板方法:用來(lái)解決代碼重復(fù)的問(wèn)題。比如. RestTemplate, JmsTemplate, JpaTemplate。 (5)觀察者模式:定義對(duì)象鍵一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它 的對(duì)象都會(huì)得到通知被制動(dòng)更新,如Spring中l(wèi)istener的實(shí)現(xiàn)--ApplicationListener

68、核心容器(應(yīng)用上下文) 模塊

這是基本的 Spring 模塊,提供 spring 框架的基礎(chǔ)功能,BeanFactory 是 任何以 spring 為基礎(chǔ)的應(yīng)用 的核心。Spring 框架建立在此模塊之上,它使 Spring 成為一個(gè)容器。

69、BeanFactory – BeanFactory 實(shí)現(xiàn)舉例。

Bean 工廠是工廠模式的一個(gè)實(shí)現(xiàn),提供了控制反轉(zhuǎn)功能,用來(lái)把應(yīng)用的配置和依賴(lài)從正真的應(yīng)用代碼 中分離。
最常用的 BeanFactory 實(shí)現(xiàn)是 XmlBeanFactory 類(lèi)。

70、XMLBeanFactory

最常用的就是 org.springframework.beans.factory.xml.XmlBeanFactory ,它根據(jù) XML 文件中的定義 加載 beans。該容器從 XML 文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個(gè)完全配置的系統(tǒng)或應(yīng)用。

71、解釋 AOP 模塊

AOP 模塊用于發(fā)給我們的 Spring 應(yīng)用做面向切面的開(kāi)發(fā), 很多支持由 AOP 聯(lián)盟提供,這樣就確保了 Spring 和其他 AOP 框架的共通性。這個(gè)模塊將元數(shù)據(jù)編程引入 Spring。

72、解釋 JDBC 抽象和 DAO 模塊。

通過(guò)使用 JDBC 抽象和 DAO 模塊,保證數(shù)據(jù)庫(kù)代碼的簡(jiǎn)潔,并能避免數(shù)據(jù)庫(kù)資源錯(cuò)誤關(guān)閉導(dǎo)致的問(wèn)
題,它在各種不同的數(shù)據(jù)庫(kù)的錯(cuò)誤信息之上,提供了一個(gè)統(tǒng)一的異常訪問(wèn)層。它還利用 Spring 的 AOP 模塊給 Spring 應(yīng)用中的對(duì)象提供事務(wù)管理服務(wù)。

72、解釋對(duì)象/關(guān)系映射集成模塊。

Spring 通過(guò)提供 ORM 模塊,支持我們?cè)谥苯?JDBC 之上使用一個(gè)對(duì)象/關(guān)系映射映射(ORM)工具,
Spring 支持集成主流的 ORM 框架,如 Hiberate,JDO 和 iBATISSQL Maps。
Spring 的事務(wù)管理同樣支 持以上所有 ORM 框架及 JDBC。

73、解釋 WEB 模塊。

Spring 的 WEB 模塊是構(gòu)建在 application context 模塊基礎(chǔ)之上,提供一個(gè)適合 web 應(yīng)用的上下文。 這個(gè)模塊也包括支持多種面向 web 的任務(wù),如透明地處理多個(gè)文件上傳請(qǐng)求和程序級(jí)請(qǐng)求參數(shù)的綁定 到你的業(yè)務(wù)對(duì)象。它也有對(duì) Jakarta Struts 的支持。

74、Spring 配置文件

Spring 配置文件是個(gè) XML 文件,這個(gè)文件包含了類(lèi)信息,描述了如何配置它們,以及如何相互調(diào)用

75、什么是 Spring IOC 容器?

Spring IOC 負(fù)責(zé)創(chuàng)建對(duì)象,管理對(duì)象(通過(guò)依賴(lài)注入(DI),裝配對(duì)象,配置對(duì)象,并且管理這些對(duì)象 的整個(gè)生命周期。

76、IOC 的優(yōu)點(diǎn)是什么?

IOC 或 依賴(lài)注入把應(yīng)用的代碼量降到最低。它使應(yīng)用容易測(cè)試,單元測(cè)試不再需要單例和 JNDI 查找機(jī) 制。最小的代價(jià)和最小的侵入性使松散耦合得以實(shí)現(xiàn)。IOC容器支持加載服務(wù)時(shí)的餓漢式初始化和懶加 載。

77、ApplicationContext 通常的實(shí)現(xiàn)是什么?

FileSystemXmlApplicationContext :此容器從一個(gè) XML 文件中加載 beans 的定義,XML Bean 配 置文件的全路徑名必須提供給它的構(gòu)造函數(shù)。
ClassPathXmlApplicationContext:此容器也從一個(gè) XML 文件中加載 beans 的定義,這里,你需要 正確設(shè)置 classpath 因?yàn)檫@個(gè)容器將在 classpath里找 bean 配置。
WebXmlApplicationContext:此容器加載一個(gè) XML 文件,此文件定義了一個(gè) WEB 應(yīng)用的所有 bean。

78、Bean 工廠和 Application contexts 有什么區(qū)別?

Application contexts 提供一種方法處理文本消息,一個(gè)通常的做法是加載文件資源(比如鏡像),它 們可以向注冊(cè)為監(jiān)聽(tīng)器的 bean 發(fā)布事件。另外,在容器或容器內(nèi)的對(duì)象上執(zhí)行的那些不得不由 bean 工廠以程序化方式處理的操作,可以在Application contexts 中以聲明的方式處理。Application contexts 實(shí)現(xiàn)了MessageSource 接口,該接口的實(shí)現(xiàn)以可插拔的方式提供獲取本地化消息的方法。

79、一個(gè) Spring 的應(yīng)用看起來(lái)象什么?

一個(gè)定義了一些功能的接口。
這實(shí)現(xiàn)包括屬性,它的 Setter , getter 方法和函數(shù)等。
Spring AOP。
Spring 的 XML 配置文件。
使用以上功能的客戶(hù)端程序。

80、什么是 Spring 的依賴(lài)注入?

依賴(lài)注入,是 IOC 的一個(gè)方面,是個(gè)通常的概念,它有多種解釋。這概念是說(shuō)你不用創(chuàng)建對(duì)象,而只需 要描述它如何被創(chuàng)建。你不在代碼里直接組裝你的組件和服務(wù),但是要在配置文件里描述哪些組件需要 哪些服務(wù),之后一個(gè)容器(IOC 容器)負(fù)責(zé)把他們組裝起來(lái)。

81、有哪些不同類(lèi)型的 IOC(依賴(lài)注入)方式?

構(gòu)造器依賴(lài)注入:構(gòu)造器依賴(lài)注入通過(guò)容器觸發(fā)一個(gè)類(lèi)的構(gòu)造器來(lái)實(shí)現(xiàn)的,該類(lèi)有一系列參數(shù),每個(gè) 參數(shù)代表一個(gè)對(duì)其他類(lèi)的依賴(lài)。
Setter 方法注入:Setter 方法注入是容器通過(guò)調(diào)用無(wú)參構(gòu)造器或無(wú)參static 工廠 方法實(shí)例化 bean 之 后,調(diào)用該 bean 的 setter 方法,即實(shí)現(xiàn)了基于 setter 的依賴(lài)注入。

82、哪種依賴(lài)注入方式你建議使用,構(gòu)造器注入,還是 Setter方法 注入?

你兩種依賴(lài)方式都可以使用,構(gòu)造器注入和 Setter 方法注入。最好的解決方案是用構(gòu)造器參數(shù)實(shí)現(xiàn)強(qiáng)制依賴(lài),setter 方法實(shí)現(xiàn)可選依賴(lài)

83、什么是 Spring beans?

Spring beans 是那些形成 Spring 應(yīng)用的主干的 java 對(duì)象。它們被 Spring IOC容器初始化,裝配,和 管理。這些 beans 通過(guò)容器中配置的元數(shù)據(jù)創(chuàng)建。比如,以 XML 文件中 的形式定義。
Spring 框架定義的 beans 都是單件 beans。在 bean tag 中有個(gè)屬性”singleton”,如果它被賦為 TRUE,bean 就是單件,否則就是一個(gè) prototype bean。默認(rèn)是 TRUE,所以所有在 Spring 框架中的 beans 缺省都是單件。

84、一個(gè) Spring Bean 定義 包含什么?

一個(gè) Spring Bean 的定義包含容器必知的所有配置元數(shù)據(jù),包括如何創(chuàng)建一個(gè)bean,它的生命周期詳 情及它的依賴(lài)。

85、如何給 Spring 容器提供配置元數(shù)據(jù)?

這里有三種重要的方法給 Spring 容器提供配置元數(shù)據(jù)。 XML 配置文件。
基于注解的配置。
基于 java 的配置。

86、你怎樣定義類(lèi)的作用域?

當(dāng)定義一個(gè) 在 Spring 里,我們還能給這個(gè) bean 聲明一個(gè)作用域。它可以通過(guò)bean 定義中的 scope 屬性來(lái)定義。如,當(dāng) Spring 要在需要的時(shí)候每次生產(chǎn)一個(gè)新的 bean 實(shí)例,bean 的 scope 屬性被指定 為 prototype。另一方面,一個(gè) bean 每次使用的時(shí)候必須返回同一個(gè)實(shí)例,這個(gè) bean 的 scope 屬性 必須設(shè)為singleton

87、解釋 Spring 支持的幾種 bean 的作用域。

Spring 框架支持以下五種 bean 的作用域:
singleton : bean 在每個(gè) Spring ioc 容器中只有一個(gè)實(shí)例。
prototype:一個(gè) bean 的定義可以有多個(gè)實(shí)例。
request:每次 http 請(qǐng)求都會(huì)創(chuàng)建一個(gè) bean,該作用域僅在基于 web的 Spring ApplicationContext 情形下有效。
session:在一個(gè) HTTP Session 中,一個(gè) bean 定義對(duì)應(yīng)一個(gè)實(shí)例。該作用域僅在基于 web 的 Spring ApplicationContext 情形下有效。
global-session:在一個(gè)全局的 HTTP Session 中,一個(gè) bean 定義對(duì)應(yīng)一個(gè)實(shí)例。該作用域僅在基于 web 的 Spring ApplicationContext 情形下有效。缺省的 Spring bean 的作用域是 Singleton.

88、Spring 框架中的單例 bean 是線程安全的嗎?

不,Spring 框架中的單例 bean 不是線程安全的。

89、解釋 Spring 框架中 bean 的生命周期。

Spring 容器 從 XML 文件中讀取 bean 的定義,并實(shí)例化 bean。
Spring 根據(jù) bean 的定義填充所有的屬性。
如果 bean 實(shí)現(xiàn)了 BeanNameAware 接口,Spring 傳遞 bean 的 ID 到setBeanName 方法。
如果 Bean 實(shí)現(xiàn)了 BeanFactoryAware 接口, Spring 傳遞beanfactory 給 setBeanFactory 方法。
如果有任何與 bean 相關(guān)聯(lián)的 BeanPostProcessors,Spring 會(huì)在 postProcesserBeforeInitialization()方法內(nèi)調(diào)用它們。
如果 bean 實(shí)現(xiàn) IntializingBean 了,調(diào)用它的 afterPropertySet 方法,如果 bean 聲明了初始化方 法,調(diào)用此初始化方法。
如果有 BeanPostProcessors 和 bean 關(guān)聯(lián),這些 bean 的postProcessAfterInitialization() 方法將被 調(diào)用。
如果 bean 實(shí)現(xiàn)了 DisposableBean,它將調(diào)用 destroy()方法

90、哪些是重要的 bean 生命周期方法?你能重載它們嗎?

有兩個(gè)重要的 bean 生命周期方法,第一個(gè)是 setup , 它是在容器加載 bean的時(shí)候被調(diào)用。第二個(gè)方 法是 teardown 它是在容器卸載類(lèi)的時(shí)候被調(diào)用。The bean 標(biāo)簽有兩個(gè)重要的屬性(init-method 和 destroy-method)。用它們你可以自己定制初始化和注銷(xiāo)方法。它們也有相應(yīng)的注解(@PostConstruct 和 @PreDestroy)。

91、什么是 Spring 的內(nèi)部 bean?

當(dāng)一個(gè) bean 僅被用作另一個(gè) bean 的屬性時(shí),它能被聲明為一個(gè)內(nèi)部 bean,為了定義 inner bean, 在 Spring 的 基于 XML 的 配置元數(shù)據(jù)中,可以在 或 元素內(nèi)使用 元素,內(nèi)部 bean 通常是匿名的,它們的 Scope 一般是 prototype。

92、在 Spring 中如何注入一個(gè) java 集合?

Spring 提供以下幾種集合的配置元素:
類(lèi)型用于注入一列值,允許有相同的值。
類(lèi)型用于注入一組值,不允許有相同的值。
類(lèi)型用于注入一組鍵值對(duì),鍵和值都可以為任意類(lèi)型。
類(lèi)型用于注入一組鍵值對(duì),鍵和值都只能為 String 類(lèi)型。

93、什么是 bean 裝配?

裝配,或 bean 裝配是指在 Spring 容器中把 bean 組裝到一起,前提是容器需要知道 bean 的依賴(lài)關(guān)系,如何通過(guò)依賴(lài)注入來(lái)把它們裝配到一起。

94、什么是 bean 的自動(dòng)裝配?

Spring 容器能夠自動(dòng)裝配相互合作的 bean,這意味著容器不需要和配置,能通過(guò) Bean 工廠自動(dòng)處理 bean 之間的協(xié)作。

95、解釋不同方式的自動(dòng)裝配 。

有五種自動(dòng)裝配的方式,可以用來(lái)指導(dǎo) Spring 容器用自動(dòng)裝配方式來(lái)進(jìn)行依賴(lài)注入。
no:默認(rèn)的方式是不進(jìn)行自動(dòng)裝配,通過(guò)顯式設(shè)置 ref 屬性來(lái)進(jìn)行裝配。
byName:通過(guò)參數(shù)名 自動(dòng)裝配,Spring 容器在配置文件中發(fā)現(xiàn) bean的 autowire 屬性被設(shè)置成 byname,之后容器試圖匹配、裝配和該 bean 的屬性具有相同名字的 bean。
byType::通過(guò)參數(shù)類(lèi)型自動(dòng)裝配,Spring 容器在配置文件中發(fā)現(xiàn) bean的 autowire 屬性被設(shè)置成 byType,之后容器試圖匹配、裝配和該 bean 的屬性具有相同類(lèi)型的 bean。如果有多個(gè) bean 符合條 件,則拋出錯(cuò)誤。
constructor:這個(gè)方式類(lèi)似于 byType, 但是要提供給構(gòu)造器參數(shù),如果沒(méi)有確定的帶參數(shù)的構(gòu)造器 參數(shù)類(lèi)型,將會(huì)拋出異常。
autodetect:首先嘗試使用 constructor 來(lái)自動(dòng)裝配,如果無(wú)法工作,則使用 byType 方式。

96、自動(dòng)裝配有哪些局限性

自動(dòng)裝配的局限性是:
重寫(xiě):你仍需用 和 配置來(lái)定義依賴(lài),意味著總要重寫(xiě)自動(dòng)裝配。
基本數(shù)據(jù)類(lèi)型:你不能自動(dòng)裝配簡(jiǎn)單的屬性,如基本數(shù)據(jù)類(lèi)型,String字符串,和類(lèi)。
模糊特性:自動(dòng)裝配不如顯式裝配精確,如果有可能,建議使用顯式裝配。

97、你可以在 Spring 中注入一個(gè) null 和一個(gè)空字符串嗎?

可以

98、什么是基于 Java 的 Spring 注解配置? 給一些注解的例子.

基于 Java 的配置,允許你在少量的 Java 注解的幫助下,進(jìn)行你的大部分 Spring配置而非通過(guò) XML 文 件。
以@Con?guration 注解為例,它用來(lái)標(biāo)記類(lèi)可以當(dāng)做一個(gè) bean 的定義,被Spring IOC 容器使用。另 一個(gè)例子是@Bean 注解,它表示此方法將要返回一個(gè)對(duì)象,作為一個(gè) bean 注冊(cè)進(jìn) Spring 應(yīng)用上下 文。

99、什么是基于注解的容器配置?

相對(duì)于 XML 文件,注解型的配置依賴(lài)于通過(guò)字節(jié)碼元數(shù)據(jù)裝配組件,而非尖括號(hào)的聲明。
開(kāi)發(fā)者通過(guò)在相應(yīng)的類(lèi),方法或?qū)傩陨鲜褂米⒔獾姆绞剑苯咏M件類(lèi)中進(jìn)行配置,而不是使用 xml 表述 bean 的裝配關(guān)系。

100、怎樣開(kāi)啟注解裝配?

注解裝配在默認(rèn)情況下是不開(kāi)啟的,為了使用注解裝配,我們必須在 Spring 配置文件中配置 context:annotation-con?g/元素

101、@Required 注解

這個(gè)注解表明 bean 的屬性必須在配置的時(shí)候設(shè)置,通過(guò)一個(gè) bean 定義的顯式的屬性值或通過(guò)自動(dòng)裝 配,若@Required 注解的 bean 屬性未被設(shè)置,容器將拋出BeanInitializationException。

102、@Autowired 注解

@Autowired 注解提供了更細(xì)粒度的控制,包括在何處以及如何完成自動(dòng)裝配。它的用法和@Required 一樣,修飾 setter 方法、構(gòu)造器、屬性或者具有任意名稱(chēng)和/或多個(gè)參數(shù)的 PN 方法。

103、@Quali?er 注解

當(dāng)有多個(gè)相同類(lèi)型的 bean 卻只有一個(gè)需要自動(dòng)裝配時(shí),將@Quali?er 注解和@Autowire 注解結(jié)合使 用以消除這種混淆,指定需要裝配的確切的 bean。

104、在 Spring 框架中如何更有效地使用 JDBC?

使用 SpringJDBC 框架,資源管理和錯(cuò)誤處理的代價(jià)都會(huì)被減輕。所以開(kāi)發(fā)者只需寫(xiě) statements 和 queries 從數(shù)據(jù)存取數(shù)據(jù),JDBC 也可以在 Spring 框架提供的模板類(lèi)的幫助下更有效地被使用,這個(gè)模 板叫 JdbcTemplate (例子見(jiàn)這里here)

105、JdbcTemplate

JdbcTemplate 類(lèi)提供了很多便利的方法解決諸如把數(shù)據(jù)庫(kù)數(shù)據(jù)轉(zhuǎn)變成基本數(shù)據(jù)類(lèi)型或?qū)ο螅瑘?zhí)行寫(xiě)好 的或可調(diào)用的數(shù)據(jù)庫(kù)操作語(yǔ)句,提供自定義的數(shù)據(jù)錯(cuò)誤處理。

106、Spring 對(duì) DAO 的支持

Spring 對(duì)數(shù)據(jù)訪問(wèn)對(duì)象(DAO)的支持旨在簡(jiǎn)化它和數(shù)據(jù)訪問(wèn)技術(shù)如 JDBC,Hibernate or JDO 結(jié)合使 用。這使我們可以方便切換持久層。編碼時(shí)也不用擔(dān)心會(huì)捕獲每種技術(shù)特有的異常。

107、使用 Spring 通過(guò)什么方式訪問(wèn) Hibernate?

在 Spring 中有兩種方式訪問(wèn) Hibernate:
控制反轉(zhuǎn) Hibernate Template 和 Callback。
繼承 HibernateDAOSupport 提供一個(gè) AOP 攔截器。

108、Spring 支持的 ORM

Spring 支持以下 ORM:
Hibernate
iBatis
JPA (Java Persistence API)
TopLink
JDO (Java Data Objects)
OJB

109、如何通過(guò) HibernateDaoSupport 將 Spring 和 Hibernate結(jié) 合起來(lái)?

用 Spring 的 SessionFactory 調(diào)用 LocalSessionFactory。集成過(guò)程分三步:
配置 the Hibernate SessionFactory。
繼承 HibernateDaoSupport 實(shí)現(xiàn)一個(gè) DAO。
在 AOP 支持的事務(wù)中裝配。

110、Spring 支持的事務(wù)管理類(lèi)型

Spring 支持兩種類(lèi)型的事務(wù)管理:
編程式事務(wù)管理:這意味你通過(guò)編程的方式管理事務(wù),給你帶來(lái)極大的靈活性,但是難維護(hù)。
聲明式事務(wù)管理:這意味著你可以將業(yè)務(wù)代碼和事務(wù)管理分離,你只需用注解和 XML 配置來(lái)管理事 務(wù)。

111、Spring 框架的事務(wù)管理有哪些優(yōu)點(diǎn)?

它為不同的事務(wù) API 如 JTA,JDBC,Hibernate,JPA 和 JDO,提供一個(gè)不變的編程模式。
它為編程式事務(wù)管理提供了一套簡(jiǎn)單的 API 而不是一些復(fù)雜的事務(wù) API

它支持聲明式事務(wù)管理。
它和 Spring 各種數(shù)據(jù)訪問(wèn)抽象層很好得集成。

112、你更傾向用那種事務(wù)管理類(lèi)型?

大多數(shù) Spring 框架的用戶(hù)選擇聲明式事務(wù)管理,因?yàn)樗鼘?duì)應(yīng)用代碼的影響最小,因此更符合一個(gè)無(wú)侵 入的輕量級(jí)容器的思想。聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理,雖然比編程式事務(wù)管理(這種方式允 許你通過(guò)代碼控制事務(wù))少了一點(diǎn)靈活性

113、解釋 AOP

面向切面的編程,或 AOP, 是一種編程技術(shù),允許程序模塊化橫向切割關(guān)注點(diǎn),或橫切典型的責(zé)任劃 分,如日志和事務(wù)管理。

114、Aspect 切面

AOP 核心就是切面,它將多個(gè)類(lèi)的通用行為封裝成可重用的模塊,該模塊含有一組 API 提供橫切功能。 比如,一個(gè)日志模塊可以被稱(chēng)作日志的 AOP 切面。根據(jù)需求的不同,一個(gè)應(yīng)用程序可以有若干切面。 在 Spring AOP 中,切面通過(guò)帶有@Aspect 注解的類(lèi)實(shí)現(xiàn)。

115、在 Spring AOP 中,關(guān)注點(diǎn)和橫切關(guān)注的區(qū)別是什么?

關(guān)注點(diǎn)是應(yīng)用中一個(gè)模塊的行為,一個(gè)關(guān)注點(diǎn)可能會(huì)被定義成一個(gè)我們想實(shí)現(xiàn)的一個(gè)功能。橫切關(guān)注點(diǎn) 是一個(gè)關(guān)注點(diǎn),此關(guān)注點(diǎn)是整個(gè)應(yīng)用都會(huì)使用的功能,并影響整個(gè)應(yīng)用,比如日志,安全和數(shù)據(jù)傳輸, 幾乎應(yīng)用的每個(gè)模塊都需要的功能。因此這些都屬于橫切關(guān)注點(diǎn)。

116、連接點(diǎn)

連接點(diǎn)代表一個(gè)應(yīng)用程序的某個(gè)位置,在這個(gè)位置我們可以插入一個(gè) AOP 切面,它實(shí)際上是個(gè)應(yīng)用程 序執(zhí)行 Spring AOP 的位置。

117、通知

通知是個(gè)在方法執(zhí)行前或執(zhí)行后要做的動(dòng)作,實(shí)際上是程序執(zhí)行時(shí)要通過(guò)SpringAOP 框架觸發(fā)的代碼 段。
Spring 切面可以應(yīng)用五種類(lèi)型的通知:
before:前置通知,在一個(gè)方法執(zhí)行前被調(diào)用。
after: 在方法執(zhí)行之后調(diào)用的通知,無(wú)論方法執(zhí)行是否成功。
after-returning: 僅當(dāng)方法成功完成后執(zhí)行的通知。
after-throwing: 在方法拋出異常退出時(shí)執(zhí)行的通知。
around: 在方法執(zhí)行之前和之后調(diào)用的通知。

118、切點(diǎn)

切入點(diǎn)是一個(gè)或一組連接點(diǎn),通知將在這些位置執(zhí)行??梢酝ㄟ^(guò)表達(dá)式或匹配的方式指明切入點(diǎn)。

119、什么是引入?

引入允許我們?cè)谝汛嬖诘念?lèi)中增加新的方法和屬性。

120、什么是目標(biāo)對(duì)象?

被一個(gè)或者多個(gè)切面所通知的對(duì)象。它通常是一個(gè)代理對(duì)象。也指被通知(advised)對(duì)象。

121、什么是代理?

代理是通知目標(biāo)對(duì)象后創(chuàng)建的對(duì)象。從客戶(hù)端的角度看,代理對(duì)象和目標(biāo)對(duì)象是一樣的。

122、有幾種不同類(lèi)型的自動(dòng)代理?

BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying

123、什么是織入。什么是織入應(yīng)用的不同點(diǎn)?

織入是將切面和到其他應(yīng)用類(lèi)型或?qū)ο筮B接或創(chuàng)建一個(gè)被通知對(duì)象的過(guò)程??椚肟梢栽诰幾g時(shí),加載 時(shí),或運(yùn)行時(shí)完成。

124、解釋基于 XML Schema 方式的切面實(shí)現(xiàn)。

在這種情況下,切面由常規(guī)類(lèi)以及基于 XML 的配置實(shí)現(xiàn)。

125、解釋基于注解的切面實(shí)現(xiàn)

在這種情況下(基于@AspectJ 的實(shí)現(xiàn)),涉及到的切面聲明的風(fēng)格與帶有 java5 標(biāo)注的普通 java 類(lèi)一 致。
Spring 的 MVC

126、什么是 Spring 的 MVC 框架?

Spring 配備構(gòu)建 Web 應(yīng)用的全功能 MVC 框架。Spring 可以很便捷地和其他MVC 框架集成,如 Struts,Spring 的 MVC 框架用控制反轉(zhuǎn)把業(yè)務(wù)對(duì)象和控制邏輯清晰地隔離。它也允許以聲明的方式把 請(qǐng)求參數(shù)和業(yè)務(wù)對(duì)象綁定。

127、DispatcherServlet

Spring 的 MVC 框架是圍繞 DispatcherServlet 來(lái)設(shè)計(jì)的,它用來(lái)處理所有的 HTTP請(qǐng)求和響應(yīng)。

128、WebApplicationContext

WebApplicationContext 繼承了 ApplicationContext 并增加了一些 WEB 應(yīng)用必備的特有功能,它不同 于一般的 ApplicationContext ,因?yàn)樗芴幚碇黝},并找到被關(guān)聯(lián)的 servlet。

129、什么是 Spring MVC 框架的控制器?

控制器提供一個(gè)訪問(wèn)應(yīng)用程序的行為,此行為通常通過(guò)服務(wù)接口實(shí)現(xiàn)??刂破鹘馕鲇脩?hù)輸入并將其轉(zhuǎn)換 為一個(gè)由視圖呈現(xiàn)給用戶(hù)的模型。Spring 用一個(gè)非常抽象的方式實(shí)現(xiàn)了一個(gè)控制層,允許用戶(hù)創(chuàng)建多種 用途的控制器。

130、@Controller 注解

該注解表明該類(lèi)扮演控制器的角色,Spring 不需要你繼承任何其他控制器基類(lèi)或引用 Servlet API。

131、@RequestMapping 注解

該注解是用來(lái)映射一個(gè) URL 到一個(gè)類(lèi)或一個(gè)特定的方處理法上

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容