1、不同版本的 Spring Framework 有哪些主要功能嫂易?
2谭胚、什么是 Spring Framework?
Spring 是一個開源應(yīng)用框架颈嚼,旨在降低應(yīng)用程序開發(fā)的復(fù)雜度毛秘。它是輕量級、松散耦合的粘舟。它具有分層 體系結(jié)構(gòu)熔脂,允許用戶選擇組件,同時還為 J2EE 應(yīng)用程序開發(fā)提供了一個有凝聚力的框架柑肴。它可以集成 其他框架霞揉,如 Structs、Hibernate晰骑、EJB 等适秩,所以又稱為框架的框架。
3硕舆、列舉 Spring Framework 的優(yōu)點秽荞。
由于 Spring Frameworks 的分層架構(gòu),用戶可以自由選擇自己需要的組件抚官。Spring Framework 支持 POJO(Plain Old Java Object) 編程扬跋,從而具備持續(xù)集成和可測試性。由于依賴注入和控制反轉(zhuǎn)凌节,JDBC 得以簡化钦听。它是開源免費的。
4倍奢、Spring Framework 有哪些不同的功能朴上?
輕量級 - Spring 在代碼量和透明度方面都很輕便。IOC - 控制反轉(zhuǎn) AOP - 面向切面編程可以將應(yīng)用業(yè)務(wù) 邏輯和系統(tǒng)服務(wù)分離卒煞,以實現(xiàn)高內(nèi)聚痪宰。容器 - Spring 負(fù)責(zé)創(chuàng)建和管理對象(Bean)的生命周期和配
置。MVC - 對 web 應(yīng)用提供了高度可配置性畔裕,其他框架的集成也十分方便衣撬。事務(wù)管理 - 提供了用于事務(wù) 管理的通用抽象層。Spring 的事務(wù)支持也可用于容器較少的環(huán)境扮饶。JDBC 異常 - Spring的 JDBC 抽象層 提供了一個異常層次結(jié)構(gòu)淮韭,簡化了錯誤處理策略。
5贴届、Spring Framework 中有多少個模塊靠粪,它們分別是什么蜡吧?
pring 核心容器 – 該層基本上是 Spring Framework 的核心。它包含以下模塊:
Spring Core
Spring Bean
SpEL (Spring Expression Language)
Spring Context
數(shù)據(jù)訪問/集成 – 該層提供與數(shù)據(jù)庫交互的支持占键。它包含以下模塊:
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
該層為類檢測和類加載器實現(xiàn)提供支持。
Test
該層為使用 JUnit 和 TestNG 進(jìn)行測試提供支持畔乙。
幾個雜項模塊:
Messaging – 該模塊為 STOMP 提供支持君仆。它還支持注解編程模型,該模型用于從 WebSocket 客戶端 路由和處理 STOMP 消息牲距。Aspects – 該模塊為與 AspectJ 的集成提供支持返咱。
6、什么是 Spring 配置文件牍鞠?
Spring 配置文件是 XML 文件咖摹。該文件主要包含類信息。它描述了這些類是如何配置以及相互引入的难述。 但是萤晴,XML 配置文件冗長且更加干凈。如果沒有正確規(guī)劃和編寫胁后,那么在大項目中管理變得非常困難
7店读、Spring 應(yīng)用程序有哪些不同組件?
Spring 應(yīng)用一般有以下組件:
接口 - 定義功能攀芯。
Bean 類 - 它包含屬性屯断,setter 和 getter 方法,函數(shù)等侣诺。
Spring 面向切面編程(AOP) - 提供面向切面編程的功能殖演。
Bean 配置文件 - 包含類的信息以及如何配置它們。
用戶程序 - 它使用接口紧武。
8、使用 Spring 有哪些方式敏储?
使用 Spring 有以下方式:
作為一個成熟的 Spring Web 應(yīng)用程序阻星。
作為第三方 Web 框架,使用 Spring Frameworks 中間層已添。
用于遠(yuǎn)程使用妥箕。
作為企業(yè)級 Java Bean,它可以包裝現(xiàn)有的 POJO(Plain Old Java Objects)更舞。
9畦幢、什么是 Spring IOC 容器?
Spring 框架的核心是 Spring 容器缆蝉。容器創(chuàng)建對象宇葱,將它們裝配在一起瘦真,配置它們并管理它們的完整生 命周期。Spring 容器使用依賴注入來管理組成應(yīng)用程序的組件黍瞧。容器通過讀取提供的配置元數(shù)據(jù)來接收 對象進(jìn)行實例化诸尽,配置和組裝的指令。該元數(shù)據(jù)可以通過 XML印颤,Java 注解或 Java 代碼提供您机。
10、什么是依賴注入年局?
在依賴注入中际看,您不必創(chuàng)建對象,但必須描述如何創(chuàng)建它們矢否。您不是直接在代碼中將組件和服務(wù)連接在 一起仲闽,而是描述配置文件中哪些組件需要哪些服務(wù)。由 IoC容器將它們裝配在一起兴喂。
11蔼囊、可以通過多少種方式完成依賴注入?
通常衣迷,依賴注入可以通過三種方式完成畏鼓,即:
構(gòu)造函數(shù)注入
setter 注入
接口注入
在 Spring Framework 中,僅使用構(gòu)造函數(shù)和 setter 注入壶谒。
12云矫、區(qū)分構(gòu)造函數(shù)注入和 setter 注入
13、spring 中有多少種 IOC 容器汗菜?
BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類让禀。它會在客戶端要求時實例化 bean。 ApplicationContext - ApplicationContext 接口擴(kuò)展了 BeanFactory 接口陨界。它在 BeanFactory 基礎(chǔ)上 提供了一些額外的功能巡揍。
14、區(qū)分 BeanFactory 和 ApplicationContext菌瘪。
15腮敌、列舉 IoC 的一些好處。
IoC 的一些好處是:
它將最小化應(yīng)用程序中的代碼量俏扩。
它將使您的應(yīng)用程序易于測試糜工,因為它不需要單元測試用例中的任何單例或 JNDI 查找機(jī)制。
它以最小的影響和最少的侵入機(jī)制促進(jìn)松耦合录淡。
它支持即時的實例化和延遲加載服務(wù)捌木。
16、Spring IoC 的實現(xiàn)機(jī)制嫉戚。
Spring 中的 IoC 的實現(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();
}
}
}
17澈圈、什么是 spring bean?
它們是構(gòu)成用戶應(yīng)用程序主干的對象崔拥。
Bean 由 Spring IoC 容器管理极舔。
它們由 Spring IoC 容器實例化,配置链瓦,裝配和管理拆魏。
Bean 是基于用戶提供給容器的配置元數(shù)據(jù)創(chuàng)建。
18慈俯、spring 提供了哪些配置方式渤刃?
基于 xml 配置
bean 所需的依賴項和服務(wù)在 XML 格式的配置文件中指定。這些配置文件通常包含許多 bean 定義和特 定于應(yīng)用程序的配置選項贴膘。它們通常以 bean 標(biāo)簽開頭卖子。例如:
<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">
<property name="name" value="Edureka"></property> </bean>
基于注解配置
您可以通過在相關(guān)的類,方法或字段聲明上使用注解刑峡,將 bean 配置為組件類本身洋闽,而不是使用 XML 來描述 bean 裝配。默認(rèn)情況下突梦,Spring 容器中未打開注解裝配诫舅。因此,您需要在使用它之前在 Spring 配置文件中啟用它宫患。例如:
<beans>
<context:annotation-config/>
<!-- bean definitions go here --> </beans>
基于 Java API 配置
Spring 的 Java 配置是通過使用 @Bean 和 @Con?guration 來實現(xiàn)刊懈。
1、 @Bean 注解扮演與 元素相同的角色娃闲。
2虚汛、 @Con?guration 類允許通過簡單地調(diào)用同一個類中的其他 @Bean 方法來定義 bean 間依賴關(guān)系。
例如:
@Configuration public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
19皇帮、spring 支持集中 bean scope卷哩?
Spring bean 支持 5 種 scope:
Singleton - 每個 Spring IoC 容器僅有一個單實例。
Prototype - 每次請求都會產(chǎn)生一個新的實例属拾。
Request - 每一次 HTTP 請求都會產(chǎn)生一個新的實例将谊,并且該 bean 僅在當(dāng)前 HTTP 請求內(nèi)有效。
Session - 每一次 HTTP 請求都會產(chǎn)生一個新的 bean捌年,同時該 bean 僅在當(dāng)前 HTTP session 內(nèi)有效瓢娜。
Global-session - 類似于標(biāo)準(zhǔn)的 HTTP Session 作用域挂洛,不過它僅僅在基于portlet 的 web 應(yīng)用中才有意 義礼预。Portlet 規(guī)范定義了全局 Session 的概念,
它被所有構(gòu)成某個 portlet web 應(yīng)用的各種不同的 portlet 所共享虏劲。在 globalsession 作用域中定義的 bean 被限定于全局 portlet Session 的生命周期范圍內(nèi)托酸。如果你在 web 中使用 global session 作用域 來標(biāo)識 bean褒颈,那么 web會自動當(dāng)成 session 類型來使用。
僅當(dāng)用戶使用支持 Web 的 ApplicationContext 時励堡,最后三個才可用谷丸。
20、spring bean 容器的生命周期是什么樣的应结?
spring bean 容器的生命周期流程如下:
1刨疼、Spring 容器根據(jù)配置中的 bean 定義中實例化 bean。
2鹅龄、Spring 使用依賴注入填充所有屬性揩慕,如 bean 中所定義的配置。
3扮休、如果 bean 實現(xiàn)BeanNameAware 接口迎卤,則工廠通過傳遞 bean 的 ID 來調(diào)用setBeanName()。 4玷坠、如果 bean 實現(xiàn) BeanFactoryAware 接口蜗搔,工廠通過傳遞自身的實例來調(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 實現(xiàn)DisposableBean 接口,當(dāng) spring 容器關(guān)閉 時庐扫,會調(diào)用 destory()饭望。
9、如果為bean 指定了 destroy 方法( 的 destroy-method 屬性)形庭,那么將調(diào)用它铅辞。
21、什么是 spring 的內(nèi)部 bean萨醒?
只有將 bean 用作另一個 bean 的屬性時斟珊,才能將 bean 聲明為內(nèi)部 bean。為了定義 bean富纸,Spring 的 基于 XML 的配置元數(shù)據(jù)在 或 中提供了 元素的使用囤踩。內(nèi)部 bean 總是匿名
的旨椒,它們總是作為原型。
例如堵漱,假設(shè)我們有一個 Student 類综慎,其中引用了 Person 類。這里我們將只創(chuàng)建一個 Person 類實例并 在 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 容器中組合在一起時,它被稱為裝配或 bean 裝配愉镰。Spring容器需要知道需要什么 bean 以及容器應(yīng)該如何使用依賴注入來將 bean 綁定在一起涝涤,同時裝配 bean。
23岛杀、自動裝配有哪些方式阔拳?
Spring 容器能夠自動裝配 bean。也就是說类嗤,可以通過檢查 BeanFactory 的內(nèi)容讓 Spring 自動解析 bean 的協(xié)作者糊肠。
自動裝配的不同模式:
no - 這是默認(rèn)設(shè)置,表示沒有自動裝配遗锣。應(yīng)使用顯式 bean 引用進(jìn)行裝配货裹。byName - 它根據(jù) bean 的 名稱注入對象依賴項。它匹配并裝配其屬性與 XML文件中由相同名稱定義的 bean精偿。byType - 它根據(jù)類 型注入對象依賴項弧圆。如果屬性的類型與 XML 文件中的一個 bean 名稱匹配惭笑,則匹配并裝配屬性辈讶。構(gòu)造 函數(shù)- 它通過調(diào)用類的構(gòu)造函數(shù)來注入依賴項航厚。它有大量的參數(shù)夸浅。autodetect - 首先容器嘗試通過構(gòu)造 函數(shù)使用 autowire 裝配,如果不能壳繁,則嘗試通過 byType 自動裝配
24绷杜、自動裝配有什么局限垃瞧?
覆蓋的可能性 - 您始終可以使用 和 設(shè)置指定依賴項甩十,這將覆蓋自動裝配船庇。基本元數(shù)據(jù)類型 - 簡單屬性 (如原數(shù)據(jù)類型侣监,字符串和類)無法自動裝配鸭轮。令人困惑的性質(zhì) - 總是喜歡使用明確的裝配,因為自動 裝配不太精確橄霉。
25窃爷、什么是基于注解的容器配置
不使用 XML 來描述 bean 裝配,開發(fā)人員通過在相關(guān)的類,方法或字段聲明上使用注解將配置移動到 組件類本身吞鸭。它可以作為 XML 設(shè)置的替代方案。例如:Spring 的 Java 配置是通過使用 @Bean 和
@Con?guration 來實現(xiàn)覆糟。 @Bean 注解扮演與 元素相同的角色刻剥。 @Con?guration 類允許通過簡單地 調(diào)
用同一個類中的其他 @Bean 方法來定義 bean 間依賴關(guān)系。
例如
@Configuration public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
26滩字、如何在 spring 中啟動注解裝配造虏?
默認(rèn)情況下,Spring 容器中未打開注解裝配麦箍。因此漓藕,要使用基于注解裝配,我們必須通過配置 <context:annotation-con?g/> 元素在 Spring 配置文件中啟用它挟裂。
27享钞、@Component, @Controller, @Repository
@Service 有何區(qū)別?
@Component :這將 java 類標(biāo)記為 bean诀蓉。它是任何 Spring 管理組件的通用構(gòu)造型栗竖。spring 的組件 掃描機(jī)制現(xiàn)在可以將其拾取并將其拉入應(yīng)用程序環(huán)境中。
@Controller :這將一個類標(biāo)記為 Spring Web MVC 控制器渠啤。標(biāo)有它的Bean 會自動導(dǎo)入到 IoC 容器 中狐肢。
@Service :此注解是組件注解的特化。它不會對 @Component 注解提供任何其他行為沥曹。您可以在服 務(wù)層類中使用@Service 而不是 @Component份名,因為它以更好的方式指定了意圖。
@Repository :這個注解是具有類似用途和功能的 @Component 注解的特化妓美。它為 DAO 提供了額外 的好處僵腺。它將 DAO 導(dǎo)入 IoC 容器,并使未經(jīng)檢查的異常有資格轉(zhuǎn)換為 Spring DataAccessException壶栋。
28想邦、@Required 注解有什么用?
@Required 應(yīng)用于 bean 屬性 setter 方法委刘。此注解僅指示必須在配置時使用bean 定義中的顯式屬性值 或使用自動裝配填充受影響的 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)行自動裝配淆珊。此注解用于在 setter 方法夺饲,構(gòu)造函 數(shù),具有任意名稱或多個參數(shù)的屬性或方法上自動裝配bean。默認(rèn)情況下往声,它是類型驅(qū)動的注入擂找。
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)建多個相同類型的 bean 并希望僅使用屬性裝配其中一個 bean 時贯涎,您可以使用@Quali?er 注解 和 @Autowired 通過指定應(yīng)該裝配哪個確切的 bean
來消除歧義。
例如慢洋,這里我們分別有兩個類塘雳,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 請求方法映射到將處理相應(yīng)請求的 控制器中的特定類/方法妻顶。此注釋可應(yīng)用于兩個級別:
類級別:映射請求的 URL
方法級別:映射 URL 以及 HTTP 請求方法
32、spring DAO 有什么用蜒车?
Spring DAO 使得 JDBC盈包,Hibernate 或 JDO 這樣的數(shù)據(jù)訪問技術(shù)更容易以一種統(tǒng)一的方式工作。這使 得用戶容易在持久性技術(shù)之間切換醇王。它還允許您在編寫代碼時呢燥,無需考慮捕獲每種技術(shù)不同的異常。
33寓娩、列舉 Spring DAO 拋出的異常叛氨。
34、spring JDBC API 中存在哪些類棘伴?
JdbcTemplate
SimpleJdbcTemplate
NamedParameterJdbcTemplate
SimpleJdbcInsert
SimpleJdbcCall
35寞埠、使用 Spring 訪問 Hibernate 的方法有哪些?
我們可以通過兩種方式使用 Spring 訪問 Hibernate:
1焊夸、 使用 Hibernate 模板和回調(diào)進(jìn)行控制反轉(zhuǎn)
2仁连、 擴(kuò)展 HibernateDAOSupport 并應(yīng)用 AOP 攔截器節(jié)點
36、列舉 spring 支持的事務(wù)管理類型
Spring 支持兩種類型的事務(wù)管理:
1阱穗、 程序化事務(wù)管理:在此過程中饭冬,在編程的幫助下管理事務(wù)。它為您提供極大的靈活性揪阶,但維護(hù)起來 非常困難昌抠。
2、 聲明式事務(wù)管理:在此鲁僚,事務(wù)管理與業(yè)務(wù)代碼分離炊苫。僅使用注解或基于 XML的配置來管理事務(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 中, 我們以類(class)作為我 們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)
39、什么是 Aspect唠梨?
aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接點的定義. Spring AOP 就是負(fù)責(zé)實施切面的框架, 它將切面所定義的橫切邏輯編織到切面所指定的連接點中. AOP 的工作重心在 于如何將增強(qiáng)編織目標(biāo)對象的連接點上, 這里包含兩個工作:
1袋励、如何通過 pointcut 和 advice 定位到特定的 joinpoint 上
2、如何在advice 中編寫切面代碼.
以簡單地認(rèn)為, 使用 @Aspect 注解的類就是切面.
40姻成、什么是切點(JoinPoint)
程序運行中的一些時間點, 例如一個方法的執(zhí)行, 或者是一個異常的處理.在 Spring AOP 中, join point 總 是方法的執(zhí)行點。
41愿棋、什么是通知(Advice)科展?
特定 JoinPoint 處的 Aspect 所采取的動作稱為 Advice。Spring AOP 使用一個 Advice 作為攔截器糠雨,在 JoinPoint “周圍”維護(hù)一系列的攔截器才睹。
42、有哪些類型的通知(Advice)甘邀?
Before - 這些類型的 Advice 在 joinpoint 方法之前執(zhí)行琅攘,并使用@Before 注解標(biāo)記進(jìn)行配置。
After Returning - 這些類型的 Advice 在連接點方法正常執(zhí)行后執(zhí)行松邪,并使用@AfterReturning 注解 標(biāo)記進(jìn)行配置坞琴。
After Throwing - 這些類型的 Advice 僅在 joinpoint 方法通過拋出異常退出并使用 @AfterThrowing 注解標(biāo)記配置時執(zhí)行。
After (?nally) - 這些類型的 Advice 在連接點方法之后執(zhí)行逗抑,無論方法退出是正常還是異常返回剧辐,并 使用 @After 注解標(biāo)記進(jìn)行配置。
Around - 這些類型的 Advice 在連接點之前和之后執(zhí)行邮府,并使用@Around 注解標(biāo)記進(jìn)行配置荧关。
43、指出在 spring aop 中 concern 和 cross-cuttingconcern 的 不同之處褂傀。
concern是我們想要在應(yīng)用程序的特定模塊中定義的行為忍啤。它可以定義為我們想要實現(xiàn)的功能 。
cross-cutting concern是一個適用于整個應(yīng)用的行為仙辟,這會影響整個應(yīng)用程序同波。例如,日志記錄叠国,安全性和數(shù)據(jù)傳輸是應(yīng)用程序幾乎每個模塊都需要關(guān)注的問題参萄,因此它們是跨領(lǐng)域的問題
44、AOP 有哪些實現(xiàn)方式煎饼?
實 現(xiàn) AOP 的 技 術(shù) 讹挎, 主 要 分 為 兩 大 類 :
靜態(tài)代理
指使用 AOP 框架提供的命令進(jìn)行編譯校赤,從而在編譯階段就可生成 AOP 代理類,因此也稱為編譯時增 強(qiáng)筒溃;
編譯時編織(特殊編譯器實現(xiàn))
類加載時編織(特殊的類加載器實現(xiàn))马篮。
動態(tài)代理
在運行時在內(nèi)存中“臨時”生成 AOP 動態(tài)代理類,因此也被稱為運行時增強(qiáng)怜奖。
JDK 動態(tài)代理
CGLIB
45浑测、Spring AOP and AspectJ AOP 有什么區(qū)別?
Spring AOP 基于動態(tài)代理方式實現(xiàn)歪玲;AspectJ 基于靜態(tài)代理方式實現(xiàn)迁央。SpringAOP 僅支持方法級別的 PointCut;提供了完全的 AOP 支持滥崩,它還支持屬性級別的 PointCut岖圈。
46、如何理解 Spring 中的代理钙皮?
將 Advice 應(yīng)用于目標(biāo)對象后創(chuàng)建的對象稱為代理蜂科。在客戶端對象的情況下,目標(biāo)對象和代理對象是相 同的短条。
Advice + Target Object = Proxy
47导匣、什么是編織(Weaving)?
為了創(chuàng)建一個 advice 對象而鏈接一個 aspect 和其它應(yīng)用類型或?qū)ο笕资保Q為編織(Weaving)贡定。在 Spring AOP 中,編織在運行時執(zhí)行可都。請參考下圖:
48厕氨、Spring MVC 框架有什么用?
Spring Web MVC 框架提供 模型-視圖-控制器 架構(gòu)和隨時可用的組件汹粤,用于開發(fā)靈活且松散耦合的 Web 應(yīng)用程序命斧。MVC 模式有助于分離應(yīng)用程序的不同方面,如輸入邏輯嘱兼,業(yè)務(wù)邏輯和 UI 邏輯国葬,同時在 所有這些元素之間提供松散耦合。
49芹壕、描述一下 DispatcherServlet 的工作流程
DispatcherServlet 的工作流程可以用一幅圖來說明:
1汇四、向服務(wù)器發(fā)送 HTTP 請求,請求被前端控制器 DispatcherServlet 捕獲踢涌。
2通孽、 DispatcherServlet 根據(jù) -servlet.xml 中的配置對請求的 URL 進(jìn)行解析,得到請求資源標(biāo)識符 (URI)睁壁。然后根據(jù)該 URI背苦,調(diào)用 HandlerMapping獲得該 Handler 配置的所有相關(guān)的對象(包括 Handler 對象以及 Handler 對
象對應(yīng)的攔截器)互捌,最后以 HandlerExecutionChain 對象的形式返回。
3行剂、 DispatcherServlet 根據(jù)獲得的 Handler秕噪,選擇一個合適的HandlerAdapter。(附注:如果成功獲
得 HandlerAdapter 后厚宰,此時將開始執(zhí)行攔截器的 preHandler(...)方法)腌巾。
4、提取 Request 中的模型數(shù)據(jù)铲觉,填充 Handler 入?yún)⒊候_始執(zhí)行 Handler( Controller)。在填充 Handler 的入?yún)⑦^程中撵幽,根據(jù)你的配置灯荧,Spring 將幫你做一些額外的工作:
HttpMessageConveter:將請求消息(如 Json、xml 等數(shù)據(jù))轉(zhuǎn)換成一個對象并齐,將對象轉(zhuǎn)換為指定 的響應(yīng)信息漏麦。
數(shù)據(jù)轉(zhuǎn)換:對請求消息進(jìn)行數(shù)據(jù)轉(zhuǎn)換客税。如 String 轉(zhuǎn)換成 Integer况褪、Double 等。
數(shù)據(jù)根式化:對請求消息進(jìn)行數(shù)據(jù)格式化更耻。如將字符串轉(zhuǎn)換成格式化數(shù)字或格式化日期等测垛。
數(shù)據(jù)驗證:驗證數(shù)據(jù)的有效性(長度、格式等)秧均,驗證結(jié)果存儲到BindingResult 或 Error 中食侮。
5、Handler(Controller)執(zhí)行完成后目胡,向 DispatcherServlet 返回一個ModelAndView 對象锯七;
6、根據(jù)返回的 ModelAndView誉己,選擇一個適合的 ViewResolver(必須是已經(jīng)注冊到 Spring 容器中的 ViewResolver)返回給 DispatcherServlet眉尸。
7、 ViewResolver 結(jié)合 Model 和 View巨双,來渲染視圖噪猾。
8、視圖負(fù)責(zé)將渲染結(jié)果返回給客戶端筑累。
50袱蜡、介紹一下 WebApplicationContext
WebApplicationContext 是 ApplicationContext 的擴(kuò)展。它具有 Web 應(yīng)用程序所需的一些額外功能慢宗。 它與普通的 ApplicationContext 在解析主題和決定與哪個 servlet 關(guān)聯(lián)的能力方面有所不同坪蚁。
英文原文鏈接:
https://www.edureka.co/blog/interview-questions/spring-interview-questions/
51奔穿、什么是 spring?
Spring 是個 java 企業(yè)級應(yīng)用的開源開發(fā)框架。Spring 主要用來開發(fā) Java 應(yīng)用迅细,但是有些擴(kuò)展是針對構(gòu) 建 J2EE 平臺的 web 應(yīng)用巫橄。Spring 框架目標(biāo)是簡化 Java企業(yè)級應(yīng)用開發(fā),并通過 POJO 為基礎(chǔ)的編程模 型促進(jìn)良好的編程習(xí)慣茵典。
52湘换、使用 Spring 框架的好處是什么?
輕量:Spring 是輕量的统阿,基本的版本大約 2MB彩倚。
** 控制反轉(zhuǎn):**Spring 通過控制反轉(zhuǎn)實現(xiàn)了松散耦合,對象們給出它們的依賴扶平,而不是創(chuàng)建或查找依賴的 對象們帆离。
面向切面的編程(AOP):Spring 支持面向切面的編程,并且把應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開结澄。
容器:Spring 包含并管理應(yīng)用中對象的生命周期和配置哥谷。
MVC 框架:Spring 的 WEB 框架是個精心設(shè)計的框架,是 Web 框架的一個很好的替代品麻献。
事務(wù)管理:Spring 提供一個持續(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框架的過程中惑惶,其實就是為了使用IOC,依賴注入短纵,和AOP带污,面向切面編程,這兩 個是Spring的靈魂香到。
主要用到的設(shè)計模式有工廠模式和代理模式鱼冀。
IOC就是典型的工廠模式,通過sessionfactory去注入實例养渴。
AOP就是典型的代理模式的體現(xiàn)雷绢。
代理模式是常用的java設(shè)計模式,他的特征是代理類與委托類有同樣的接口理卑,代理類主要負(fù)責(zé)為委托類 預(yù)處理消息翘紊、過濾消息、把消息轉(zhuǎn)發(fā)給委托類藐唠,以及事后處理消息等帆疟。代理類與委托類之間通常會存在 關(guān)聯(lián)關(guān)系鹉究,一個代理類的對象與一個委托類的對象關(guān)聯(lián),代理類的對象本身并不真正實現(xiàn)服務(wù)踪宠,而是通 過調(diào)用委托類的對象的相關(guān)方法自赔,來提供特定的服務(wù)
spring的IoC容器是spring的核心,spring AOP是spring框架的重要組成部分柳琢。
在傳統(tǒng)的程序設(shè)計中绍妨,當(dāng)調(diào)用者需要被調(diào)用者的協(xié)助時,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例柬脸。但在 spring里創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成他去,因此控制反轉(zhuǎn)(IoC);創(chuàng)建被調(diào)用者實例的工作 通常由spring容器來完成倒堕,然后注入調(diào)用者灾测,因此也被稱為依賴注入(DI),依賴注入和控制反轉(zhuǎn)是同 一個概念垦巴。
面向方面編程(AOP)是以另一個角度來考慮程序結(jié)構(gòu)媳搪,通過分析程序結(jié)構(gòu)的關(guān)注點來完善面向?qū)ο缶幊?(OOP)。OOP將應(yīng)用程序分解成各個層次的對象骤宣,而AOP將程序分解成多個切面秦爆。spring AOP 只實 現(xiàn)了方法級別的連接點,在J2EE應(yīng)用中涯雅,AOP攔截到方法級別的操作就已經(jīng)足夠鲜结。在spring中展运,未來使 IoC方便地使用健壯活逆、靈活的企業(yè)服務(wù),需要利用spring AOP實現(xiàn)為IoC和企業(yè)服務(wù)之間建立聯(lián)系拗胜。
IOC:控制反轉(zhuǎn)也叫依賴注入蔗候。利用了工廠模式
將對象交給容器管理,你只需要在spring配置文件總配置相應(yīng)的bean埂软,以及設(shè)置相關(guān)的屬性锈遥,讓spring 容器來生成類的實例對象以及管理對象。在spring容器啟動的時候勘畔,spring會把你在配置文件中配置的 bean都初始化好所灸,然后在你需要調(diào)用的時候,就把它已經(jīng)初始化好的那些bean分配給你需要調(diào)用這些 bean的類(假設(shè)這個類名是A)炫七,分配的方法就是調(diào)用A的setter方法來注入爬立,而不需要你在A里面new 這些bean了。
注意:面試的時候万哪,如果有條件侠驯,畫圖抡秆,這樣更加顯得你懂了
AOP:面向切面編程。(Aspect-Oriented Programming)
AOP可以說是對OOP的補(bǔ)充和完善吟策。OOP引入封裝儒士、繼承和多態(tài)性等概念來建立一種對象層次結(jié)構(gòu), 用以模擬公共行為的一個集合檩坚。當(dāng)我們需要為分散的對象引入公共行為的時候着撩,OOP則顯得無能為力。 也就是說匾委,OOP允許你定義從上到下的關(guān)系睹酌,但并不適合定義從左到右的關(guān)系。例如日志功能剩檀。日志代 碼往往水平地散布在所有對象層次中憋沿,而與它所散布到的對象的核心功能毫無關(guān)系。在OOP設(shè)計中沪猴,它 導(dǎo)致了大量代碼的重復(fù)辐啄,而不利于各個模塊的重用。將程序中的交叉業(yè)務(wù)邏輯(比如安全运嗜,日志壶辜,事務(wù) 等),封裝成一個切面担租,然后注入到目標(biāo)對象(具體
業(yè)務(wù)邏輯)中去砸民。
實現(xiàn)AOP的技術(shù)床佳,主要分為兩大類:一是采用動態(tài)代理技術(shù)崇众,利用截取消息的方式,對該消息進(jìn)行裝 飾包晰,以取代原有對象行為的執(zhí)行尝艘;二是采用靜態(tài)織入的方式演侯,引入特定的語法創(chuàng)建“方面”,從而使得編 譯器可以在編譯期間織入有關(guān)“方面”的代碼.
簡單點解釋背亥,比方說你想在你的biz層所有類中都加上一個打印‘你好’的功能,這時就可以用aop思想來做. 你先寫個類寫個類方法秒际,方法經(jīng)實現(xiàn)打印‘你好’,然后Ioc這個類 ref=“biz.*”讓每個類都注入即可實現(xiàn)
55、Spring中Autowired和Resource關(guān)鍵字的區(qū)別
@Resource和@Autowired都是做bean的注入時使用狡汉,其實@Resource并不是Spring的注解娄徊,它的包 是javax.annotation.Resource,需要導(dǎo)入盾戴,但是Spring支持該注解的注入寄锐。
1、共同點
兩者都可以寫在字段和setter方法上。兩者如果都寫在字段上锐峭,那么就不需要再寫setter方法中鼠。
2、不同點
(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注解是按照類型(byType)裝配依賴對象援雇,默認(rèn)情況下它要求依賴對象必須存在,如果允 許null值椎扬,可以設(shè)置它的required屬性為false惫搏。如果我們想使用按照名稱(byName)來裝配,可以結(jié) 合@Quali?er注解一起使用蚕涤。如下:
public class TestServiceImpl {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
(2)@Resource
@Resource默認(rèn)按照ByName自動注入筐赔,由J2EE提供,需要導(dǎo)入包javax.annotation.Resource揖铜。
@Resource有兩個重要的屬性:name和type茴丰,而Spring將@Resource注解的name屬性解析為bean的 名字,而type屬性則解析為bean的類型天吓。所以贿肩,如果使用name屬性,則使用byName的自動注入策 略龄寞,而使用type屬性時則使用byType自動注入策略汰规。如果既不制定name也不制定type屬性,這時將通 過反射機(jī)制使用byName自動注入策略
public class TestServiceImpl {
// 下面兩種@Resource只要使用一種即可
@Resource(name="userDao")
private UserDao userDao; // 用于字段上
@Resource(name="userDao")
public void setUserDao(UserDao userDao) { // 用于屬性的setter方法上
this.userDao = userDao;
}
}
注:最好是將@Resource放在setter方法上物邑,因為這樣更符合面向?qū)ο蟮乃枷肓锵ㄟ^set、get去 操作屬
性色解,而不是直接去操作屬性茂嗓。
@Resource裝配順序:
①如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配冒签,找不到則拋出異 常在抛。
②如果指定了name钟病,則從上下文中查找名稱(id)匹配的bean進(jìn)行裝配萧恕,找不到則拋出異常。
③如果指定了type肠阱,則從上下文中找到類似匹配的唯一bean進(jìn)行裝配票唆,找不到或是找到多個,都會拋 出異常
④如果既沒有指定name屹徘,又沒有指定type走趋,則自動按照byName方式進(jìn)行裝配;如果沒有匹配噪伊,則回 退為一個原始類型進(jìn)行匹配簿煌,如果匹配則自動裝配氮唯。@Resource的作用相當(dāng)于@Autowired,只不過 @Autowired按照byType自動注入
56姨伟、依賴注入的方式有幾種惩琉,各是什么?
一、構(gòu)造器注入
將被依賴對象通過構(gòu)造函數(shù)的參數(shù)注入給依賴對象夺荒,并且在初始化對象的時候注入瞒渠。
優(yōu)點:
對象初始化完成后便可獲得可使用的對象。
缺點:
當(dāng)需要注入的對象很多時技扼,構(gòu)造器參數(shù)列表將會很長伍玖;不夠靈活。若有多種注入方式剿吻,每種方式只需注 入指定幾個依賴窍箍,那么就需要提供多個重載的構(gòu)造函數(shù),麻煩丽旅。
二仔燕、setter方法注入
IoC Service Provider通過調(diào)用成員變量提供的setter函數(shù)將被依賴對象注入給依賴類。
優(yōu)點:
靈活魔招∥螅可以選擇性地注入需要的對象。
缺點:
依賴對象初始化完成后由于尚未注入被依賴對象办斑,因此還不能使用外恕。
三、接口注入
依賴類必須要實現(xiàn)指定的接口乡翅,然后實現(xiàn)該接口中的一個函數(shù)鳞疲,該函數(shù)就是用于依賴注入。該函數(shù)的參 數(shù)就是要注入的對象
優(yōu)點
接口注入中蠕蚜,接口的名字尚洽、函數(shù)的名字都不重要,只要保證函數(shù)的參數(shù)是要注入的對象類型即可靶累。
缺點:
侵入行太強(qiáng)腺毫,不建議使用。
PS:什么是侵入行挣柬?
如果類A要使用別人提供的一個功能潮酒,若為了使用這功能,需要在自己的類中增加額外的代碼邪蛔,這就是侵入性
57急黎、講一下什么是Spring
Spring是一個輕量級的IoC和AOP容器框架。是為Java應(yīng)用程序提供基礎(chǔ)性服務(wù)的一套框架,目的是用 于簡化企業(yè)應(yīng)用程序的開發(fā)勃教,它使得開發(fā)者只需要關(guān)心業(yè)務(wù)需求淤击。常見的配置方式有三種:基于XML的 配置、基于注解的配置故源、基于Java的配置遭贸。
主要由以下幾個模塊組成:
Spring Core:核心類庫,提供IOC服務(wù)心软;
Spring Context:提供框架式的Bean訪問方式壕吹,以及企業(yè)級功能(JNDI、定時任務(wù)等)删铃;
Spring AOP:AOP服務(wù)耳贬;
Spring DAO:對JDBC的抽象,簡化了數(shù)據(jù)訪問異常的處理
Spring ORM:對現(xiàn)有的ORM框架的支持猎唁;
Spring Web:提供了基本的面向Web的綜合特性咒劲,例如多方文件上傳; Spring MVC:提供面向Web應(yīng)用的Model-View-Controller實現(xiàn)诫隅。
58腐魂、Spring MVC流程
1、 用戶發(fā)送請求至前端控制器DispatcherServlet逐纬。
2蛔屹、 DispatcherServlet收到請求調(diào)用HandlerMapping處理器映射器。
3豁生、 處理器映射器找到具體的處理器(可以根據(jù)xml配置兔毒、注解進(jìn)行查找),生成處理器對象及處理器攔截 器(如果有則生成)一并返回給DispatcherServlet甸箱。
4育叁、 DispatcherServlet調(diào)用HandlerAdapter處理器適配器。
5芍殖、 HandlerAdapter經(jīng)過適配調(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)用戶
組件說明:
以下組件通常使用框架提供實現(xiàn):
DispatcherServlet:作為前端控制器,整個流程控制的中心纬凤,控制其它組件執(zhí)行福贞,統(tǒng)一調(diào)度,降低組件 之間的耦合性停士,提高每個組件的擴(kuò)展性
HandlerMapping:通過擴(kuò)展處理器映射器實現(xiàn)不同的映射方式挖帘,例如:配置文件方式,實現(xiàn)接口方 式恋技,注解方式等拇舀。
HandlAdapter:通過擴(kuò)展處理器適配器,支持更多類型的處理器蜻底。
ViewResolver:通過擴(kuò)展視圖解析器骄崩,支持更多類型的視圖解析,例如:jsp薄辅、freemarker要拂、pdf、 excel等站楚。
組件:
1脱惰、前端控制器DispatcherServlet(不需要工程師開發(fā)),由框架提供
作用:接收請求,響應(yīng)結(jié)果窿春,相當(dāng)于轉(zhuǎn)發(fā)器枪芒,中央處理器。有了dispatcherServlet減少了其它組件之間 的耦合度谁尸。
用戶請求到達(dá)前端控制器舅踪,它就相當(dāng)于mvc模式中的c,dispatcherServlet是整個流程控制的中心良蛮,由 它調(diào)用其它組件處理用戶的請求抽碌,dispatcherServlet的存在降低了組件之間的耦合性。
2决瞳、處理器映射器HandlerMapping(不需要工程師開發(fā)),由框架提供
作用:根據(jù)請求的url查找Handler
HandlerMapping負(fù)責(zé)根據(jù)用戶請求找到Handler即處理器货徙,springmvc提供了不同的映射器實現(xiàn)不同 的映射方式,例如:配置文件方式皮胡,實現(xiàn)接口方式痴颊,注解方式等。
3屡贺、處理器適配器HandlerAdapter
作用:按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler
通過HandlerAdapter對處理器進(jìn)行執(zhí)行蠢棱,這是適配器模式的應(yīng)用锌杀,通過擴(kuò)展適配器可以對更多類型的 處理器進(jìn)行執(zhí)行。
4泻仙、處理器Handler(需要工程師開發(fā))
注意:編寫Handler時按照HandlerAdapter的要求去做糕再,這樣適配器才可以去正確執(zhí)行Handler Handler 是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對具 體的用戶請求進(jìn)行處理玉转。
由于Handler涉及到具體的用戶業(yè)務(wù)請求突想,所以一般情況需要工程師根據(jù)業(yè)務(wù)需求開發(fā)Handler。
5究抓、視圖解析器View resolver(不需要工程師開發(fā)),由框架提供
作用:進(jìn)行視圖解析猾担,根據(jù)邏輯視圖名解析成真正的視圖(view)
View Resolver負(fù)責(zé)將處理結(jié)果生成View視圖,View Resolver首先根據(jù)邏輯視圖名解析成物理視圖名即 具體的頁面地址刺下,再生成View視圖對象绑嘹,最后對View進(jìn)行渲染將處理結(jié)果通過頁面展示給用戶。 springmvc框架提供了很多的View視圖類型怠李,包括:jstlView圾叼、freemarkerView、pdfView等捺癞。一般情 況下需要通過頁面標(biāo)簽或頁面模版技術(shù)將模型數(shù)據(jù)通過頁面展示給用戶夷蚊,需要由工程師根據(jù)業(yè)務(wù)需求開 發(fā)具體的頁面。
6髓介、視圖View(需要工程師開發(fā)jsp...)
View是一個接口惕鼓,實現(xiàn)類支持不同的View類型(jsp、freemarker唐础、pdf...)核心架構(gòu)的具體流程步驟如 下:
1箱歧、首先用戶發(fā)送請求——>DispatcherServlet,前端控制器收到請求后自己不進(jìn)行處理一膨,而是委托給 其他的解析器進(jìn)行處理呀邢,作為統(tǒng)一訪問點,進(jìn)行全局的流程控制豹绪;
2价淌、DispatcherServlet——>HandlerMapping, HandlerMapping 將會把請求映射為 HandlerExecutionChain 對象(包含一個Handler 處理器(頁面控制器)對象瞒津、多個 HandlerInterceptor 攔截器)對象蝉衣,通過這種策略模式,很容易添加新的映射策略巷蚪;
3病毡、DispatcherServlet——>HandlerAdapter,HandlerAdapter 將會把處理器包裝為適配器屁柏,從而支 持多種類型的處理器啦膜,即適配器設(shè)計模式的應(yīng)用有送,從而很容易支持很多類型的處理器;
4功戚、HandlerAdapter——>處理器功能處理方法的調(diào)用娶眷,HandlerAdapter 將會根據(jù)適配的結(jié)果調(diào)用真 正的處理器的功能處理方法似嗤,完成功能處理啸臀;并返回一個ModelAndView 對象(包含模型數(shù)據(jù)、邏輯視 圖名)烁落;
5乘粒、ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver 將把邏輯視圖名解析為具體的 View伤塌,通過這種策略模式灯萍,很容易更換其他視圖技術(shù);
6每聪、View——>渲染旦棉,View會根據(jù)傳進(jìn)來的Model模型數(shù)據(jù)進(jìn)行渲染,此處的Model實際是一個Map數(shù) 據(jù)結(jié)構(gòu)药薯,因此很容易支持其他視圖技術(shù)绑洛;
7、返回控制權(quán)給DispatcherServlet童本,由DispatcherServlet返回響應(yīng)給用戶真屯,到此一個流程結(jié)束。下邊 兩個組件通常情況下需要開發(fā):
Handler:處理器穷娱,即后端控制器用controller表示绑蔫。
View:視圖,即展示給用戶的界面泵额,視圖中通常需要標(biāo)簽語言展示模型數(shù)據(jù)配深。
59、springMVC是什么
springMVC是一個MVC的開源框架嫁盲,springMVC=struts2+spring篓叶,springMVC就相當(dāng)于是Struts2加上 sring的整合,但是這里有一個疑惑就是亡资,springMVC和spring是什么樣的關(guān)系呢澜共?這個在百度百科上有 一個很好的解釋:意思是說,springMVC是spring的一個后續(xù)產(chǎn)品锥腻,其實就是spring在原有基礎(chǔ)上嗦董,又 提供了web應(yīng)用的MVC模塊,可以簡單的把springMVC理解為是spring的一個模塊(類似AOP瘦黑,IOC這 樣的模塊)京革,網(wǎng)絡(luò)上經(jīng)常會說springMVC和spring無縫集成奇唤,其實springMVC就是spring的一個子模塊,所以根本不需要同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:用于處理請求 url 映射的注解,可用于類或方法上坡垫。用于類上梭灿,則表示類中的所 有響應(yīng)請求的方法都是以該地址作為父路徑。
@RequestBody:注解實現(xiàn)接收http請求的json數(shù)據(jù)冰悠,將json轉(zhuǎn)換為java對象堡妒。
@ResponseBody:注解實現(xiàn)將conreoller方法返回對象轉(zhuǎn)化為json對象響應(yīng)給客戶
62、Spring的AOP理解
OOP面向?qū)ο蟾茸浚试S開發(fā)者定義縱向的關(guān)系皮迟,但并適用于定義橫向的關(guān)系,導(dǎo)致了大量代碼的重復(fù)桑寨,而 不利于各個模塊的重用伏尼。
AOP,一般稱為面向切面西疤,作為面向?qū)ο蟮囊环N補(bǔ)充烦粒,用于將那些與業(yè)務(wù)無關(guān),但卻對多個對象產(chǎn)生影 響的公共行為和邏輯代赁,抽取并封裝為一個可重用的模塊扰她,這個模塊被命名為“切面”(Aspect),減少系 統(tǒng)中的重復(fù)代碼芭碍,降低了模塊間的耦合度徒役,同時提高了系統(tǒng)的可維護(hù)性〗押荆可用于權(quán)限認(rèn)證忧勿、日志、事務(wù)處理瞻讽。
AOP實現(xiàn)的關(guān)鍵在于代理模式鸳吸,AOP代理主要分為靜態(tài)代理和動態(tài)代理。靜態(tài)代理的代表為AspectJ速勇; 動態(tài)代理則以Spring AOP為代表晌砾。
(1)AspectJ是靜態(tài)代理的增強(qiáng),所謂靜態(tài)代理烦磁,就是AOP框架會在編譯階段生成AOP代理類养匈,因此也 稱為編譯時增強(qiáng)哼勇,他會在編譯階段將AspectJ(切面)織入到Java字節(jié)碼中,運行的時候就是增強(qiáng)之后的 AOP對象呕乎。
(2)Spring AOP使用的動態(tài)代理积担,所謂的動態(tài)代理就是說AOP框架不會去修改字節(jié)碼,而是每次運行 時在內(nèi)存中臨時為方法生成一個AOP對象猬仁,這個AOP對象包含了目標(biāo)對象的全部方法帝璧,并且在特定的切 點做了增強(qiáng)處理,并回調(diào)原對象的方法逐虚。
Spring AOP中的動態(tài)代理主要有兩種方式聋溜,JDK動態(tài)代理和CGLIB動態(tài)代理 :
①JDK動態(tài)代理只提供接口的代理谆膳,不支持類的代理叭爱。核心InvocationHandler接口和Proxy類, InvocationHandler 通過invoke()方法反射來調(diào)用目標(biāo)類中的代碼漱病,動態(tài)地將橫切邏輯和業(yè)務(wù)編織在一 起买雾;接著,Proxy利用 InvocationHandler動態(tài)創(chuàng)建一個符合某一接口的的實例, 生成目標(biāo)類的代理對
象杨帽。
②如果代理類沒有實現(xiàn) InvocationHandler 接口漓穿,那么Spring AOP會選擇使用CGLIB來動態(tài)代理目標(biāo) 類。CGLIB(Code Generation Library)注盈,是一個代碼生成的類庫晃危,可以在運行時動態(tài)的生成指定類的 一個子類對象,并覆蓋其中特定方法并添加增強(qiáng)代碼老客,從而實現(xiàn)AOP僚饭。CGLIB是通過繼承的方式做的動 態(tài)代理,因此如果某個類被標(biāo)記為?nal胧砰,那么它是無法使用CGLIB做動態(tài)代理的
3)靜態(tài)代理與動態(tài)代理區(qū)別在于生成AOP代理對象的時機(jī)不同鳍鸵,相對來說AspectJ的靜態(tài)代理方式具 有更好的性能,但是AspectJ需要特定的編譯器進(jìn)行處理尉间,而Spring AOP則無需特定的編譯器處理偿乖。
63、Spring的IOC理解
(1)IOC就是控制反轉(zhuǎn)哲嘲,是指創(chuàng)建對象的控制權(quán)的轉(zhuǎn)移贪薪,以前創(chuàng)建對象的主動權(quán)和時機(jī)是由自己把控的, 而現(xiàn)在這種權(quán)力轉(zhuǎn)移到Spring容器中眠副,并由容器根據(jù)配置文件去創(chuàng)建實例和管理各個實例之間的依賴關(guān) 系画切,對象與對象之間松散耦合,也利于功能的復(fù)用侦啸。DI依賴注入槽唾,和控制反轉(zhuǎn)是同一個概念的不同角度 的描述丧枪,即 應(yīng)用程序在運行時依賴IoC容器來動態(tài)注入對象需要的外部資源。
(2)最直觀的表達(dá)就是庞萍,IOC讓對象的創(chuàng)建不用去new了拧烦,可以由spring自動生產(chǎn),使用java的反射機(jī) 制钝计,根據(jù)配置文件在運行時動態(tài)的去創(chuàng)建對象以及管理對象恋博,并調(diào)用對象的方法的。
(3)Spring的IOC有三種注入方式 :構(gòu)造器注入私恬、setter方法注入债沮、根據(jù)注解注入。
IoC讓相互協(xié)作的組件保持松散的耦合本鸣,而AOP編程允許你把遍布于應(yīng)用各層的功能分離出來形成 可重用的功能組件
64疫衩、解釋一下spring bean的生命周期
首先說一下Servlet的生命周期:實例化,初始init荣德,接收請求service触机,銷毀destroy霉囚;Spring上下文中 的Bean生命周期也類似,如下:
(1)實例化Bean:
對于BeanFactory容器,當(dāng)客戶向容器請求一個尚未初始化的bean時产场,或初始化bean的時候需要注入 另一個尚未初始化的依賴時涩金,容器就會調(diào)用createBean進(jìn)行實例化哪痰。對于ApplicationContext容器诈唬,當(dāng) 容器啟動結(jié)束后,通過獲取BeanDe?nition對象中的信息宁否,實例化所有的bean窒升。
(2)設(shè)置對象屬性(依賴注入):
實例化后的對象被封裝在BeanWrapper對象中,緊接著家淤,Spring根據(jù)BeanDe?nition中的信息 以及 通 過BeanWrapper提供的設(shè)置屬性的接口完成依賴注入异剥。
(3)處理Aware接口:
接著,Spring會檢測該對象是否實現(xiàn)了xxxAware接口絮重,并將相關(guān)的xxxAware實例注入給Bean:
①如果這個Bean已經(jīng)實現(xiàn)了BeanNameAware接口冤寿,會調(diào)用它實現(xiàn)的setBeanName(String beanId)方 法,此處傳遞的就是Spring配置文件中Bean的id值青伤;
②如果這個Bean已經(jīng)實現(xiàn)了BeanFactoryAware接口督怜,會調(diào)用它實現(xiàn)的setBeanFactory()方法,傳遞的 是Spring工廠自身狠角。
③如果這個Bean已經(jīng)實現(xiàn)了ApplicationContextAware接口号杠,會調(diào)用
setApplicationContext(ApplicationContext)方法,傳入Spring上下文;
(4)BeanPostProcessor:
如果想對Bean進(jìn)行一些自定義的處理姨蟋,那么可以讓Bean實現(xiàn)了BeanPostProcessor接口屉凯,那將會調(diào)用 postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean 與 init-method:
如果Bean在Spring配置文件中配置了 init-method 屬性眼溶,則會自動調(diào)用其配置的初始化方法悠砚。
(6)如果這個Bean實現(xiàn)了BeanPostProcessor接口,將會調(diào)用postProcessAfterInitialization(Object obj, String s)方法堂飞;由于這個方法是在Bean初始化結(jié)束時調(diào)用的灌旧,所以可以被應(yīng)用于內(nèi)存或緩存技術(shù)
以上幾個步驟完成后,Bean就已經(jīng)被正確創(chuàng)建了绰筛,之后就可以使用這個Bean了
7)DisposableBean:
當(dāng)Bean不再需要時枢泰,會經(jīng)過清理階段,如果Bean實現(xiàn)了DisposableBean這個接口铝噩,會調(diào)用其實現(xiàn)的 destroy()方法衡蚂;
(8)destroy-method:
最后,如果這個Bean的Spring配置中配置了destroy-method屬性薄榛,會自動調(diào)用其配置的銷毀方法
65讳窟、解釋Spring支持的幾種bean的作用域。
Spring容器中的bean可以分為5個范圍:
(1)singleton:默認(rèn)敞恋,每個容器中只有一個bean的實例,單例的模式由BeanFactory自身來維護(hù)谋右。 (2)prototype:為每一個bean請求提供一個實例硬猫。
(3)request:為每一個網(wǎng)絡(luò)請求創(chuàng)建一個實例,在請求完成以后改执,bean會失效并被垃圾回收器回
收啸蜜。
(4)session:與request范圍類似,確保每個session中有一個bean的實例辈挂,在session過期后衬横,bean 會隨之失效。
(5)global-session:全局作用域终蒂,global-session和Portlet應(yīng)用相關(guān)蜂林。當(dāng)你的應(yīng)用部署在Portlet容器 中工作時,它包含很多portlet拇泣。如果你想要聲明讓所有的portlet共用全局的存儲變量的話噪叙,那么這全局 變量需要存儲在global-session中。全局作用域與Servlet中的session作用域效果相同
66霉翔、Spring基于xml注入bean的幾種方式
(1)Set方法注入睁蕾;
(2)構(gòu)造器注入:①通過index設(shè)置參數(shù)的位置;②通過type設(shè)置參數(shù)類型; (3)靜態(tài)工廠注入子眶;
(4)實例工廠瀑凝;
詳細(xì)內(nèi)容可以閱讀:https://blog.csdn.net/a745233700/article/details/89307518
67、Spring框架中都用到了哪些設(shè)計模式
(1)工廠模式:BeanFactory就是簡單工廠模式的體現(xiàn)臭杰,用來創(chuàng)建對象的實例猜丹;
(2)單例模式:Bean默認(rèn)為單例模式。
(3)代理模式:Spring的AOP功能用到了JDK的動態(tài)代理和CGLIB字節(jié)碼生成技術(shù)硅卢;
(4)模板方法:用來解決代碼重復(fù)的問題射窒。比如. RestTemplate, JmsTemplate, JpaTemplate。 (5)觀察者模式:定義對象鍵一種一對多的依賴關(guān)系将塑,當(dāng)一個對象的狀態(tài)發(fā)生改變時脉顿,所有依賴于它 的對象都會得到通知被制動更新,如Spring中l(wèi)istener的實現(xiàn)--ApplicationListener
68点寥、核心容器(應(yīng)用上下文) 模塊
這是基本的 Spring 模塊艾疟,提供 spring 框架的基礎(chǔ)功能,BeanFactory 是 任何以 spring 為基礎(chǔ)的應(yīng)用 的核心敢辩。Spring 框架建立在此模塊之上蔽莱,它使 Spring 成為一個容器。
69戚长、BeanFactory – BeanFactory 實現(xiàn)舉例盗冷。
Bean 工廠是工廠模式的一個實現(xiàn),提供了控制反轉(zhuǎn)功能同廉,用來把應(yīng)用的配置和依賴從正真的應(yīng)用代碼 中分離仪糖。
最常用的 BeanFactory 實現(xiàn)是 XmlBeanFactory 類。
70迫肖、XMLBeanFactory
最常用的就是 org.springframework.beans.factory.xml.XmlBeanFactory 锅劝,它根據(jù) XML 文件中的定義 加載 beans。該容器從 XML 文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個完全配置的系統(tǒng)或應(yīng)用蟆湖。
71故爵、解釋 AOP 模塊
AOP 模塊用于發(fā)給我們的 Spring 應(yīng)用做面向切面的開發(fā), 很多支持由 AOP 聯(lián)盟提供隅津,這樣就確保了 Spring 和其他 AOP 框架的共通性诬垂。這個模塊將元數(shù)據(jù)編程引入 Spring。
72饥瓷、解釋 JDBC 抽象和 DAO 模塊剥纷。
通過使用 JDBC 抽象和 DAO 模塊,保證數(shù)據(jù)庫代碼的簡潔呢铆,并能避免數(shù)據(jù)庫資源錯誤關(guān)閉導(dǎo)致的問
題晦鞋,它在各種不同的數(shù)據(jù)庫的錯誤信息之上,提供了一個統(tǒng)一的異常訪問層。它還利用 Spring 的 AOP 模塊給 Spring 應(yīng)用中的對象提供事務(wù)管理服務(wù)悠垛。
72线定、解釋對象/關(guān)系映射集成模塊。
Spring 通過提供 ORM 模塊确买,支持我們在直接 JDBC 之上使用一個對象/關(guān)系映射映射(ORM)工具斤讥,
Spring 支持集成主流的 ORM 框架,如 Hiberate,JDO 和 iBATISSQL Maps湾趾。
Spring 的事務(wù)管理同樣支 持以上所有 ORM 框架及 JDBC芭商。
73、解釋 WEB 模塊搀缠。
Spring 的 WEB 模塊是構(gòu)建在 application context 模塊基礎(chǔ)之上铛楣,提供一個適合 web 應(yīng)用的上下文。 這個模塊也包括支持多種面向 web 的任務(wù)艺普,如透明地處理多個文件上傳請求和程序級請求參數(shù)的綁定 到你的業(yè)務(wù)對象簸州。它也有對 Jakarta Struts 的支持。
74歧譬、Spring 配置文件
Spring 配置文件是個 XML 文件岸浑,這個文件包含了類信息,描述了如何配置它們瑰步,以及如何相互調(diào)用
75矢洲、什么是 Spring IOC 容器?
Spring IOC 負(fù)責(zé)創(chuàng)建對象面氓,管理對象(通過依賴注入(DI)兵钮,裝配對象,配置對象舌界,并且管理這些對象 的整個生命周期。
76泰演、IOC 的優(yōu)點是什么呻拌?
IOC 或 依賴注入把應(yīng)用的代碼量降到最低。它使應(yīng)用容易測試睦焕,單元測試不再需要單例和 JNDI 查找機(jī) 制藐握。最小的代價和最小的侵入性使松散耦合得以實現(xiàn)。IOC容器支持加載服務(wù)時的餓漢式初始化和懶加 載垃喊。
77猾普、ApplicationContext 通常的實現(xiàn)是什么?
FileSystemXmlApplicationContext :此容器從一個 XML 文件中加載 beans 的定義,XML Bean 配 置文件的全路徑名必須提供給它的構(gòu)造函數(shù)本谜。
ClassPathXmlApplicationContext:此容器也從一個 XML 文件中加載 beans 的定義初家,這里,你需要 正確設(shè)置 classpath 因為這個容器將在 classpath里找 bean 配置。
WebXmlApplicationContext:此容器加載一個 XML 文件溜在,此文件定義了一個 WEB 應(yīng)用的所有 bean陌知。
78、Bean 工廠和 Application contexts 有什么區(qū)別掖肋?
Application contexts 提供一種方法處理文本消息仆葡,一個通常的做法是加載文件資源(比如鏡像),它 們可以向注冊為監(jiān)聽器的 bean 發(fā)布事件志笼。另外沿盅,在容器或容器內(nèi)的對象上執(zhí)行的那些不得不由 bean 工廠以程序化方式處理的操作,可以在Application contexts 中以聲明的方式處理纫溃。Application contexts 實現(xiàn)了MessageSource 接口腰涧,該接口的實現(xiàn)以可插拔的方式提供獲取本地化消息的方法。
79皇耗、一個 Spring 的應(yīng)用看起來象什么南窗?
一個定義了一些功能的接口。
這實現(xiàn)包括屬性郎楼,它的 Setter 万伤, getter 方法和函數(shù)等。
Spring AOP呜袁。
Spring 的 XML 配置文件敌买。
使用以上功能的客戶端程序。
80阶界、什么是 Spring 的依賴注入虹钮?
依賴注入,是 IOC 的一個方面膘融,是個通常的概念芙粱,它有多種解釋。這概念是說你不用創(chuàng)建對象氧映,而只需 要描述它如何被創(chuàng)建春畔。你不在代碼里直接組裝你的組件和服務(wù),但是要在配置文件里描述哪些組件需要 哪些服務(wù)岛都,之后一個容器(IOC 容器)負(fù)責(zé)把他們組裝起來律姨。
81、有哪些不同類型的 IOC(依賴注入)方式臼疫?
構(gòu)造器依賴注入:構(gòu)造器依賴注入通過容器觸發(fā)一個類的構(gòu)造器來實現(xiàn)的择份,該類有一系列參數(shù),每個 參數(shù)代表一個對其他類的依賴烫堤。
Setter 方法注入:Setter 方法注入是容器通過調(diào)用無參構(gòu)造器或無參static 工廠 方法實例化 bean 之 后荣赶,調(diào)用該 bean 的 setter 方法凤价,即實現(xiàn)了基于 setter 的依賴注入。
82讯壶、哪種依賴注入方式你建議使用料仗,構(gòu)造器注入,還是 Setter方法 注入伏蚊?
你兩種依賴方式都可以使用立轧,構(gòu)造器注入和 Setter 方法注入。最好的解決方案是用構(gòu)造器參數(shù)實現(xiàn)強(qiáng)制依賴躏吊,setter 方法實現(xiàn)可選依賴
83氛改、什么是 Spring beans?
Spring beans 是那些形成 Spring 應(yīng)用的主干的 java 對象。它們被 Spring IOC容器初始化比伏,裝配胜卤,和 管理。這些 beans 通過容器中配置的元數(shù)據(jù)創(chuàng)建赁项。比如葛躏,以 XML 文件中 的形式定義。
Spring 框架定義的 beans 都是單件 beans悠菜。在 bean tag 中有個屬性”singleton”舰攒,如果它被賦為 TRUE,bean 就是單件悔醋,否則就是一個 prototype bean摩窃。默認(rèn)是 TRUE,所以所有在 Spring 框架中的 beans 缺省都是單件芬骄。
84猾愿、一個 Spring Bean 定義 包含什么?
一個 Spring Bean 的定義包含容器必知的所有配置元數(shù)據(jù)账阻,包括如何創(chuàng)建一個bean蒂秘,它的生命周期詳 情及它的依賴。
85淘太、如何給 Spring 容器提供配置元數(shù)據(jù)?
這里有三種重要的方法給 Spring 容器提供配置元數(shù)據(jù)材彪。 XML 配置文件。
基于注解的配置琴儿。
基于 java 的配置。
86嘁捷、你怎樣定義類的作用域?
當(dāng)定義一個 在 Spring 里造成,我們還能給這個 bean 聲明一個作用域。它可以通過bean 定義中的 scope 屬性來定義雄嚣。如晒屎,當(dāng) Spring 要在需要的時候每次生產(chǎn)一個新的 bean 實例喘蟆,bean 的 scope 屬性被指定 為 prototype。另一方面鼓鲁,一個 bean 每次使用的時候必須返回同一個實例蕴轨,這個 bean 的 scope 屬性 必須設(shè)為singleton
87、解釋 Spring 支持的幾種 bean 的作用域骇吭。
Spring 框架支持以下五種 bean 的作用域:
singleton : bean 在每個 Spring ioc 容器中只有一個實例橙弱。
prototype:一個 bean 的定義可以有多個實例。
request:每次 http 請求都會創(chuàng)建一個 bean燥狰,該作用域僅在基于 web的 Spring ApplicationContext 情形下有效棘脐。
session:在一個 HTTP Session 中,一個 bean 定義對應(yīng)一個實例龙致。該作用域僅在基于 web 的 Spring ApplicationContext 情形下有效蛀缝。
global-session:在一個全局的 HTTP Session 中,一個 bean 定義對應(yīng)一個實例目代。該作用域僅在基于 web 的 Spring ApplicationContext 情形下有效屈梁。缺省的 Spring bean 的作用域是 Singleton.
88、Spring 框架中的單例 bean 是線程安全的嗎?
不榛了,Spring 框架中的單例 bean 不是線程安全的在讶。
89、解釋 Spring 框架中 bean 的生命周期忽冻。
Spring 容器 從 XML 文件中讀取 bean 的定義真朗,并實例化 bean。
Spring 根據(jù) bean 的定義填充所有的屬性僧诚。
如果 bean 實現(xiàn)了 BeanNameAware 接口遮婶,Spring 傳遞 bean 的 ID 到setBeanName 方法。
如果 Bean 實現(xiàn)了 BeanFactoryAware 接口湖笨, Spring 傳遞beanfactory 給 setBeanFactory 方法旗扑。
如果有任何與 bean 相關(guān)聯(lián)的 BeanPostProcessors,Spring 會在 postProcesserBeforeInitialization()方法內(nèi)調(diào)用它們慈省。
如果 bean 實現(xiàn) IntializingBean 了臀防,調(diào)用它的 afterPropertySet 方法,如果 bean 聲明了初始化方 法边败,調(diào)用此初始化方法袱衷。
如果有 BeanPostProcessors 和 bean 關(guān)聯(lián),這些 bean 的postProcessAfterInitialization() 方法將被 調(diào)用笑窜。
如果 bean 實現(xiàn)了 DisposableBean致燥,它將調(diào)用 destroy()方法
90、哪些是重要的 bean 生命周期方法排截?你能重載它們嗎嫌蚤?
有兩個重要的 bean 生命周期方法辐益,第一個是 setup , 它是在容器加載 bean的時候被調(diào)用脱吱。第二個方 法是 teardown 它是在容器卸載類的時候被調(diào)用智政。The bean 標(biāo)簽有兩個重要的屬性(init-method 和 destroy-method)。用它們你可以自己定制初始化和注銷方法箱蝠。它們也有相應(yīng)的注解(@PostConstruct 和 @PreDestroy)续捂。
91、什么是 Spring 的內(nèi)部 bean抡锈?
當(dāng)一個 bean 僅被用作另一個 bean 的屬性時疾忍,它能被聲明為一個內(nèi)部 bean,為了定義 inner bean床三, 在 Spring 的 基于 XML 的 配置元數(shù)據(jù)中一罩,可以在 或 元素內(nèi)使用 元素,內(nèi)部 bean 通常是匿名的撇簿,它們的 Scope 一般是 prototype聂渊。
92、在 Spring 中如何注入一個 java 集合四瘫?
Spring 提供以下幾種集合的配置元素:
類型用于注入一列值汉嗽,允許有相同的值。
類型用于注入一組值找蜜,不允許有相同的值饼暑。
類型用于注入一組鍵值對,鍵和值都可以為任意類型洗做。
類型用于注入一組鍵值對弓叛,鍵和值都只能為 String 類型。
93诚纸、什么是 bean 裝配?
裝配撰筷,或 bean 裝配是指在 Spring 容器中把 bean 組裝到一起,前提是容器需要知道 bean 的依賴關(guān)系畦徘,如何通過依賴注入來把它們裝配到一起毕籽。
94、什么是 bean 的自動裝配井辆?
Spring 容器能夠自動裝配相互合作的 bean关筒,這意味著容器不需要和配置,能通過 Bean 工廠自動處理 bean 之間的協(xié)作杯缺。
95平委、解釋不同方式的自動裝配 。
有五種自動裝配的方式夺谁,可以用來指導(dǎo) Spring 容器用自動裝配方式來進(jìn)行依賴注入廉赔。
no:默認(rèn)的方式是不進(jìn)行自動裝配,通過顯式設(shè)置 ref 屬性來進(jìn)行裝配匾鸥。
byName:通過參數(shù)名 自動裝配蜡塌,Spring 容器在配置文件中發(fā)現(xiàn) bean的 autowire 屬性被設(shè)置成 byname,之后容器試圖匹配勿负、裝配和該 bean 的屬性具有相同名字的 bean馏艾。
byType::通過參數(shù)類型自動裝配,Spring 容器在配置文件中發(fā)現(xiàn) bean的 autowire 屬性被設(shè)置成 byType奴愉,之后容器試圖匹配琅摩、裝配和該 bean 的屬性具有相同類型的 bean。如果有多個 bean 符合條 件锭硼,則拋出錯誤房资。
constructor:這個方式類似于 byType, 但是要提供給構(gòu)造器參數(shù)檀头,如果沒有確定的帶參數(shù)的構(gòu)造器 參數(shù)類型轰异,將會拋出異常。
autodetect:首先嘗試使用 constructor 來自動裝配暑始,如果無法工作搭独,則使用 byType 方式。
96廊镜、自動裝配有哪些局限性
自動裝配的局限性是:
重寫:你仍需用 和 配置來定義依賴牙肝,意味著總要重寫自動裝配。
基本數(shù)據(jù)類型:你不能自動裝配簡單的屬性嗤朴,如基本數(shù)據(jù)類型配椭,String字符串,和類播赁。
模糊特性:自動裝配不如顯式裝配精確颂郎,如果有可能,建議使用顯式裝配容为。
97乓序、你可以在 Spring 中注入一個 null 和一個空字符串嗎?
可以
98坎背、什么是基于 Java 的 Spring 注解配置? 給一些注解的例子.
基于 Java 的配置替劈,允許你在少量的 Java 注解的幫助下,進(jìn)行你的大部分 Spring配置而非通過 XML 文 件得滤。
以@Con?guration 注解為例陨献,它用來標(biāo)記類可以當(dāng)做一個 bean 的定義,被Spring IOC 容器使用懂更。另 一個例子是@Bean 注解眨业,它表示此方法將要返回一個對象急膀,作為一個 bean 注冊進(jìn) Spring 應(yīng)用上下 文。
99龄捡、什么是基于注解的容器配置?
相對于 XML 文件卓嫂,注解型的配置依賴于通過字節(jié)碼元數(shù)據(jù)裝配組件,而非尖括號的聲明聘殖。
開發(fā)者通過在相應(yīng)的類晨雳,方法或?qū)傩陨鲜褂米⒔獾姆绞剑苯咏M件類中進(jìn)行配置奸腺,而不是使用 xml 表述 bean 的裝配關(guān)系餐禁。
100、怎樣開啟注解裝配突照?
注解裝配在默認(rèn)情況下是不開啟的帮非,為了使用注解裝配,我們必須在 Spring 配置文件中配置 context:annotation-con?g/元素
101绷旗、@Required 注解
這個注解表明 bean 的屬性必須在配置的時候設(shè)置喜鼓,通過一個 bean 定義的顯式的屬性值或通過自動裝 配,若@Required 注解的 bean 屬性未被設(shè)置衔肢,容器將拋出BeanInitializationException庄岖。
102、@Autowired 注解
@Autowired 注解提供了更細(xì)粒度的控制角骤,包括在何處以及如何完成自動裝配隅忿。它的用法和@Required 一樣,修飾 setter 方法邦尊、構(gòu)造器背桐、屬性或者具有任意名稱和/或多個參數(shù)的 PN 方法。
103蝉揍、@Quali?er 注解
當(dāng)有多個相同類型的 bean 卻只有一個需要自動裝配時链峭,將@Quali?er 注解和@Autowire 注解結(jié)合使 用以消除這種混淆,指定需要裝配的確切的 bean又沾。
104弊仪、在 Spring 框架中如何更有效地使用 JDBC?
使用 SpringJDBC 框架,資源管理和錯誤處理的代價都會被減輕杖刷。所以開發(fā)者只需寫 statements 和 queries 從數(shù)據(jù)存取數(shù)據(jù)励饵,JDBC 也可以在 Spring 框架提供的模板類的幫助下更有效地被使用,這個模 板叫 JdbcTemplate (例子見這里here)
105滑燃、JdbcTemplate
JdbcTemplate 類提供了很多便利的方法解決諸如把數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)變成基本數(shù)據(jù)類型或?qū)ο笠厶瑘?zhí)行寫好 的或可調(diào)用的數(shù)據(jù)庫操作語句,提供自定義的數(shù)據(jù)錯誤處理。
106典予、Spring 對 DAO 的支持
Spring 對數(shù)據(jù)訪問對象(DAO)的支持旨在簡化它和數(shù)據(jù)訪問技術(shù)如 JDBC甜滨,Hibernate or JDO 結(jié)合使 用。這使我們可以方便切換持久層熙参。編碼時也不用擔(dān)心會捕獲每種技術(shù)特有的異常艳吠。
107、使用 Spring 通過什么方式訪問 Hibernate?
在 Spring 中有兩種方式訪問 Hibernate:
控制反轉(zhuǎn) Hibernate Template 和 Callback孽椰。
繼承 HibernateDAOSupport 提供一個 AOP 攔截器。
108凛篙、Spring 支持的 ORM
Spring 支持以下 ORM:
Hibernate
iBatis
JPA (Java Persistence API)
TopLink
JDO (Java Data Objects)
OJB
109黍匾、如何通過 HibernateDaoSupport 將 Spring 和 Hibernate結(jié) 合起來?
用 Spring 的 SessionFactory 調(diào)用 LocalSessionFactory呛梆。集成過程分三步:
配置 the Hibernate SessionFactory锐涯。
繼承 HibernateDaoSupport 實現(xiàn)一個 DAO。
在 AOP 支持的事務(wù)中裝配填物。
110纹腌、Spring 支持的事務(wù)管理類型
Spring 支持兩種類型的事務(wù)管理:
編程式事務(wù)管理:這意味你通過編程的方式管理事務(wù),給你帶來極大的靈活性滞磺,但是難維護(hù)升薯。
聲明式事務(wù)管理:這意味著你可以將業(yè)務(wù)代碼和事務(wù)管理分離,你只需用注解和 XML 配置來管理事 務(wù)击困。
111涎劈、Spring 框架的事務(wù)管理有哪些優(yōu)點?
它為不同的事務(wù) API 如 JTA阅茶,JDBC蛛枚,Hibernate,JPA 和 JDO脸哀,提供一個不變的編程模式蹦浦。
它為編程式事務(wù)管理提供了一套簡單的 API 而不是一些復(fù)雜的事務(wù) API
如
它支持聲明式事務(wù)管理。
它和 Spring 各種數(shù)據(jù)訪問抽象層很好得集成撞蜂。
112盲镶、你更傾向用那種事務(wù)管理類型?
大多數(shù) Spring 框架的用戶選擇聲明式事務(wù)管理谅摄,因為它對應(yīng)用代碼的影響最小徒河,因此更符合一個無侵 入的輕量級容器的思想。聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理送漠,雖然比編程式事務(wù)管理(這種方式允 許你通過代碼控制事務(wù))少了一點靈活性
113顽照、解釋 AOP
面向切面的編程,或 AOP, 是一種編程技術(shù)代兵,允許程序模塊化橫向切割關(guān)注點尼酿,或橫切典型的責(zé)任劃 分,如日志和事務(wù)管理植影。
114裳擎、Aspect 切面
AOP 核心就是切面,它將多個類的通用行為封裝成可重用的模塊,該模塊含有一組 API 提供橫切功能竭宰。 比如郑现,一個日志模塊可以被稱作日志的 AOP 切面。根據(jù)需求的不同惶我,一個應(yīng)用程序可以有若干切面。 在 Spring AOP 中博投,切面通過帶有@Aspect 注解的類實現(xiàn)绸贡。
115、在 Spring AOP 中毅哗,關(guān)注點和橫切關(guān)注的區(qū)別是什么听怕?
關(guān)注點是應(yīng)用中一個模塊的行為,一個關(guān)注點可能會被定義成一個我們想實現(xiàn)的一個功能虑绵。橫切關(guān)注點 是一個關(guān)注點尿瞭,此關(guān)注點是整個應(yīng)用都會使用的功能,并影響整個應(yīng)用蒸殿,比如日志筷厘,安全和數(shù)據(jù)傳輸, 幾乎應(yīng)用的每個模塊都需要的功能宏所。因此這些都屬于橫切關(guān)注點酥艳。
116、連接點
連接點代表一個應(yīng)用程序的某個位置爬骤,在這個位置我們可以插入一個 AOP 切面充石,它實際上是個應(yīng)用程 序執(zhí)行 Spring AOP 的位置。
117霞玄、通知
通知是個在方法執(zhí)行前或執(zhí)行后要做的動作骤铃,實際上是程序執(zhí)行時要通過SpringAOP 框架觸發(fā)的代碼 段。
Spring 切面可以應(yīng)用五種類型的通知:
before:前置通知坷剧,在一個方法執(zhí)行前被調(diào)用惰爬。
after: 在方法執(zhí)行之后調(diào)用的通知,無論方法執(zhí)行是否成功惫企。
after-returning: 僅當(dāng)方法成功完成后執(zhí)行的通知撕瞧。
after-throwing: 在方法拋出異常退出時執(zhí)行的通知陵叽。
around: 在方法執(zhí)行之前和之后調(diào)用的通知。
118丛版、切點
切入點是一個或一組連接點巩掺,通知將在這些位置執(zhí)行∫称瑁可以通過表達(dá)式或匹配的方式指明切入點胖替。
119、什么是引入?
引入允許我們在已存在的類中增加新的方法和屬性豫缨。
120独令、什么是目標(biāo)對象?
被一個或者多個切面所通知的對象。它通常是一個代理對象好芭。也指被通知(advised)對象记焊。
121、什么是代理?
代理是通知目標(biāo)對象后創(chuàng)建的對象栓撞。從客戶端的角度看,代理對象和目標(biāo)對象是一樣的碗硬。
122瓤湘、有幾種不同類型的自動代理?
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying
123恩尾、什么是織入弛说。什么是織入應(yīng)用的不同點?
織入是將切面和到其他應(yīng)用類型或?qū)ο筮B接或創(chuàng)建一個被通知對象的過程翰意∧救耍織入可以在編譯時,加載 時冀偶,或運行時完成醒第。
124、解釋基于 XML Schema 方式的切面實現(xiàn)进鸠。
在這種情況下,切面由常規(guī)類以及基于 XML 的配置實現(xiàn)客年。
125霞幅、解釋基于注解的切面實現(xiàn)
在這種情況下(基于@AspectJ 的實現(xiàn)),涉及到的切面聲明的風(fēng)格與帶有 java5 標(biāo)注的普通 java 類一 致量瓜。
Spring 的 MVC
126司恳、什么是 Spring 的 MVC 框架?
Spring 配備構(gòu)建 Web 應(yīng)用的全功能 MVC 框架绍傲。Spring 可以很便捷地和其他MVC 框架集成扔傅,如 Struts,Spring 的 MVC 框架用控制反轉(zhuǎn)把業(yè)務(wù)對象和控制邏輯清晰地隔離。它也允許以聲明的方式把 請求參數(shù)和業(yè)務(wù)對象綁定铅鲤。
127划提、DispatcherServlet
Spring 的 MVC 框架是圍繞 DispatcherServlet 來設(shè)計的,它用來處理所有的 HTTP請求和響應(yīng)邢享。
128鹏往、WebApplicationContext
WebApplicationContext 繼承了 ApplicationContext 并增加了一些 WEB 應(yīng)用必備的特有功能,它不同 于一般的 ApplicationContext 骇塘,因為它能處理主題伊履,并找到被關(guān)聯(lián)的 servlet。
129款违、什么是 Spring MVC 框架的控制器唐瀑?
控制器提供一個訪問應(yīng)用程序的行為,此行為通常通過服務(wù)接口實現(xiàn)插爹『謇保控制器解析用戶輸入并將其轉(zhuǎn)換 為一個由視圖呈現(xiàn)給用戶的模型。Spring 用一個非常抽象的方式實現(xiàn)了一個控制層赠尾,允許用戶創(chuàng)建多種 用途的控制器力穗。
130、@Controller 注解
該注解表明該類扮演控制器的角色气嫁,Spring 不需要你繼承任何其他控制器基類或引用 Servlet API当窗。
131、@RequestMapping 注解
該注解是用來映射一個 URL 到一個類或一個特定的方處理法上