目錄 1. Spring基礎(chǔ)1.1 什么是 spring?Spring是一個(gè)輕量級Java開發(fā)框架,最早有Rod Johnson創(chuàng)建,目的是為了解決企業(yè)級應(yīng)用開發(fā)的業(yè)務(wù)邏輯層和其他各層的耦合問題。它是一個(gè)分層的JavaSE/JavaEE full-stack(一站式)輕量級開源框架,為開發(fā)Java應(yīng)用程序提供全面的基礎(chǔ)架構(gòu)支持。Spring負(fù)責(zé)基礎(chǔ)架構(gòu),因此Java開發(fā)者可以專注于應(yīng)用程序的開發(fā)。 Spring最根本的使命是解決企業(yè)級應(yīng)用開發(fā)的復(fù)雜性,即簡化Java開發(fā)。 Spring可以做很多事情,它為企業(yè)級開發(fā)提供給了豐富的功能,但是這些功能的底層都依賴于它的兩個(gè)核心特性,也就是依賴注入(dependency injection,DI)和面向切面編程(aspect-oriented programming,AOP)。 為了降低Java開發(fā)的復(fù)雜性,Spring采取了以下4種關(guān)鍵策略
1.2 Spring框架的設(shè)計(jì)目標(biāo),設(shè)計(jì)理念,和核心是什么?
IoC讓相互協(xié)作的組件保持松散的耦合,而AOP編程允許你把遍布于應(yīng)用各層的功能分離出來形成可重用的功能組件。 1.3 Spring 框架中都用到了哪些設(shè)計(jì)模式?
1.4 Spring Framework 中有多少個(gè)模塊,它們分別是什么?Spring 總共大約有 20 個(gè)模塊, 由 1300 多個(gè)不同的文件構(gòu)成。 而這些組件被分別整合在
1.5 spring context應(yīng)用上下文有什么作用?這是基本的Spring模塊,提供spring 框架的基礎(chǔ)功能,BeanFactory 是 任何以spring為基礎(chǔ)的應(yīng)用的核心。Spring 框架建立在此模塊之上,它使Spring成為一個(gè)容器。 Bean 工廠是工廠模式的一個(gè)實(shí)現(xiàn),提供了控制反轉(zhuǎn)功能,用來把應(yīng)用的配置和依賴從真正的應(yīng)用代碼中分離。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根據(jù)XML文件中的定義加載beans。該容器從XML 文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個(gè)完全配置的系統(tǒng)或應(yīng)用。 1.6 Spring 應(yīng)用程序有哪些不同組件?Spring 應(yīng)用一般有以下組件:
1.7 使用 Spring 有哪些方式?
1.8 Spring的優(yōu)缺點(diǎn)是什么?
1.9 Spring框架中有哪些不同類型的事件?Spring 提供了以下5種標(biāo)準(zhǔn)的事件:
2. Spring IoC2.1 什么是 Spring IOC 容器?控制反轉(zhuǎn)即IoC (Inversion of Control),它把傳統(tǒng)上由程序代碼直接操控的對象的調(diào)用權(quán)交給容器,通過容器來實(shí)現(xiàn)對象組件的裝配和管理。所謂的“控制反轉(zhuǎn)”概念就是對組件對象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。 Spring IOC 負(fù)責(zé)創(chuàng)建對象,管理對象(通過依賴注入(DI),裝配對象,配置對象,并且管理這些對象的整個(gè)生命周期 2.2 控制反轉(zhuǎn)(IoC)有什么作用?
2.3 可以通過多少種方式完成依賴注入?通常,依賴注入可以通過三種方式完成,即:
2.4 Spring 如何設(shè)計(jì)容器的,BeanFactory和ApplicationContext的關(guān)系詳解?Spring 作者 Rod Johnson 設(shè)計(jì)了兩個(gè)接口用以表示容器。
BeanFactory 簡單粗暴,可以理解為就是個(gè) HashMap,Key 是 BeanName,Value 是 Bean 實(shí)例。通常只提供注冊(put),獲取(get)這兩個(gè)功能。我們可以稱之為 “低級容器”。 ApplicationContext 可以稱之為 “高級容器”。因?yàn)樗?BeanFactory 多了更多的功能。他繼承了多個(gè)接口。因此具備了更多的功能。例如資源的獲取,支持多種消息(例如 JSP tag 的支持),對 BeanFactory 多了工具級別的支持等待。所以你看他的名字,已經(jīng)不是 BeanFactory 之類的工廠了,而是 “應(yīng)用上下文”, 代表著整個(gè)大容器的所有功能。該接口定義了一個(gè) refresh 方法,此方法是所有閱讀 Spring 源碼的人的最熟悉的方法,用于刷新整個(gè)容器,即重新加載/刷新所有的 bean。 當(dāng)然,除了這兩個(gè)大接口,還有其他的輔助接口,這里就不介紹他們了。 BeanFactory和ApplicationContext的關(guān)系 為了更直觀的展示 “低級容器” 和 “高級容器” 的關(guān)系,這里通過常用的 ClassPathXmlApplicationContext 類來展示整個(gè)容器的層級 UML 關(guān)系。 看下面的隸屬 ApplicationContext 粉紅色的 “高級容器”,依賴著 “低級容器”,這里說的是依賴,不是繼承哦。他依賴著 “低級容器” 的 getBean 功能。而高級容器有更多的功能:支持不同的信息源頭,可以訪問文件資源,支持應(yīng)用事件(Observer 模式)。 通常用戶看到的就是 “高級容器”。 但 BeanFactory 也非常夠用啦! 左邊灰色區(qū)域的是 “低級容器”, 只負(fù)載加載 Bean,獲取 Bean。容器其他的高級功能是沒有的。例如上圖畫的 refresh 刷新 Bean 工廠所有配置,生命周期事件回調(diào)等。 小結(jié) 說了這么多,不知道你有沒有理解Spring IoC? 這里小結(jié)一下:IoC 在 Spring 里,只需要低級容器就可以實(shí)現(xiàn),2 個(gè)步驟:
上面就是 Spring 低級容器(BeanFactory)的 IoC。 至于高級容器 ApplicationContext,他包含了低級容器的功能,當(dāng)他執(zhí)行 refresh 模板方法的時(shí)候,將刷新整個(gè)容器的 Bean。同時(shí)其作為高級容器,包含了太多的功能。一句話,他不僅僅是 IoC。他支持不同信息源頭,支持 BeanFactory 工具類,支持層級容器,支持訪問文件資源,支持事件發(fā)布通知,支持接口回調(diào)等等。 2.5 IoC 的好處有哪些?
2.6 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("com.xxx.xxx.Apple"); if(f!=null){ f.eat(); } } } 2.7 Spring 的 IoC支持哪些功能?Spring 的 IoC 設(shè)計(jì)支持以下功能:
其中,最重要的就是依賴注入,從 XML 的配置上說,即 ref 標(biāo)簽。對應(yīng) Spring RuntimeBeanReference 對象。 對于 IoC 來說,最重要的就是容器。容器管理著 Bean 的生命周期,控制著 Bean 的依賴注入。 2.8 BeanFactory 和 ApplicationContext有什么區(qū)別?BeanFactory和ApplicationContext是Spring的兩大核心接口,都可以當(dāng)做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
2.9 ApplicationContext通常的實(shí)現(xiàn)是什么?
2.10 什么是Spring的依賴注入?控制反轉(zhuǎn)IoC是一個(gè)很大的概念,可以用不同的方式來實(shí)現(xiàn)。其主要實(shí)現(xiàn)方式有兩種:依賴注入和依賴查找 依賴注入:相對于IoC而言,依賴注入(DI)更加準(zhǔn)確地描述了IoC的設(shè)計(jì)理念。所謂依賴注入(Dependency Injection),即組件之間的依賴關(guān)系由容器在應(yīng)用系統(tǒng)運(yùn)行期來決定,也就是由容器動(dòng)態(tài)地將某種依賴關(guān)系的目標(biāo)對象實(shí)例注入到應(yīng)用系統(tǒng)中的各個(gè)關(guān)聯(lián)的組件之中。組件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關(guān)系。 2.11 依賴注入的基本原則是什么?依賴注入的基本原則是:應(yīng)用組件不應(yīng)該負(fù)責(zé)查找資源或者其他依賴的協(xié)作對象。配置對象的工作應(yīng)該由IoC容器負(fù)責(zé),“查找資源”的邏輯應(yīng)該從應(yīng)用組件的代碼中抽取出來,交給IoC容器負(fù)責(zé)。容器全權(quán)負(fù)責(zé)組件的裝配,它會(huì)把符合依賴關(guān)系的對象通過屬性(JavaBean中的setter)或者是構(gòu)造器傳遞給需要的對象。 2.12 依賴注入有什么優(yōu)勢?依賴注入之所以更流行是因?yàn)樗且环N更可取的方式:讓容器全權(quán)負(fù)責(zé)依賴查詢,受管組件只需要暴露JavaBean的setter方法或者帶參數(shù)的構(gòu)造器或者接口,使容器可以在初始化時(shí)組裝對象的依賴關(guān)系。其與依賴查找方式相比,主要優(yōu)勢為:
2.13 構(gòu)造器依賴注入和 Setter方法注入有什么區(qū)別?
兩種依賴方式都可以使用,構(gòu)造器注入和Setter方法注入。最好的解決方案是用構(gòu)造器參數(shù)實(shí)現(xiàn)強(qiáng)制依賴,setter方法實(shí)現(xiàn)可選依賴。 3. Spring Beans3.1 什么是 spring bean?
3.2 spring 提供了哪些配置方式?
3.3 spring 支持幾種 bean scope?Spring bean 支持5種scope:
3.4 spring bean 容器的生命周期是什么樣的?spring bean 容器的生命周期流程如下: 1、Spring 容器根據(jù)配置中的 bean 定義中實(shí)例化 bean。 3.5 什么是 spring 的內(nèi)部 bean?只有將 bean 用作另一個(gè) bean 的屬性時(shí),才能將 bean 聲明為內(nèi)部 bean。為了定義 bean, Spring 的基于 XML 的配置元數(shù)據(jù)在或 中提供了元素的使用 。 內(nèi)部 bean 總是匿名的,它們總是作為原型。 例如,假設(shè)我們有一個(gè) Student 類,其中引用了 Person 類。 這里我們將只創(chuàng)建一個(gè) Person 類實(shí)例并在 Student 中使用它。 Student.java public class Student { private Person person; //Setters and Getters } Person.java public class Person { private String name; private String address; //Setters and Getters } bean.xml <bean id=“StudentBean" class="com.lupf.Student"> <property name="person"> <!--This is inner bean --> <bean class="com.lupf.Person"> <property name="name" value=“Scott"></property> <property name="address" value="Bangalore"></property> </bean> </property> </bean> 3.6 什么是bean裝配?什么是bean的自動(dòng)裝配?裝配,或bean裝配是指在Spring容器中把bean組裝到一起,前提是容器需要知道bean的依賴關(guān)系,如何通過依賴注入來把它們裝配到一起。 在Spring框架中,在配置文件中設(shè)定bean的依賴關(guān)系是一個(gè)很好的機(jī)制,Spring 容器能夠自動(dòng)裝配相互合作的bean,這意味著容器不需要和配置,能通過Bean工廠自動(dòng)處理bean之間的協(xié)作。這意味著 Spring可以通過向Bean Factory中注入的方式自動(dòng)搞定bean之間的依賴關(guān)系。自動(dòng)裝配可以設(shè)置在每個(gè)bean上,也可以設(shè)定在特定的bean上。 3.7 自動(dòng)裝配有哪些方式?Spring容器能夠自動(dòng)裝配bean。也就是說,可以通過檢查BeanFactory的內(nèi)容讓Spring自動(dòng)解析bean的協(xié)作者。 自動(dòng)裝配的不同模式:
3.8 自動(dòng)裝配有什么局限?
3.9 使用@Autowired注解自動(dòng)裝配的過程是怎樣的?使用@Autowired注解來自動(dòng)裝配指定的bean。在使用@Autowired注解之前需要在Spring配置文件進(jìn)行配置,<context:annotation-config />。 在啟動(dòng)spring IoC時(shí),容器自動(dòng)裝載了一個(gè)AutowiredAnnotationBeanPostProcessor后置處理器,當(dāng)容器掃描到@Autowied、@Resource或@Inject時(shí),就會(huì)在IoC容器自動(dòng)查找需要的bean,并裝配給該對象的屬性。在使用@Autowired時(shí),首先在容器中查詢對應(yīng)類型的bean:
3.10 Spring配置文件包含了哪些信息?Spring配置文件是個(gè)XML 文件,這個(gè)文件包含了類信息,描述了如何配置它們,以及如何相互調(diào)用。 3.11 Spring基于xml注入bean的幾種方式
3.12 Spring框架中的單例bean是線程安全的嗎?不是,Spring框架中的單例bean不是線程安全的。 spring 中的 bean 默認(rèn)是單例模式,spring 框架并沒有對單例 bean 進(jìn)行多線程的封裝處理。 實(shí)際上大部分時(shí)候 spring bean 無狀態(tài)的(比如 dao 類),所有某種程度上來說 bean 也是安全的,但如果 bean 有狀態(tài)的話(比如 view model 對象),那就要開發(fā)者自己去保證線程安全了,最簡單的就是改變 bean 的作用域,把“singleton”變更為“prototype”,這樣請求 bean 相當(dāng)于 new Bean()了,所以就可以保證線程安全了。
3.13 Spring如何處理線程并發(fā)問題?在一般情況下,只有無狀態(tài)的Bean才可以在多線程環(huán)境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因?yàn)镾pring對一些Bean中非線程安全狀態(tài)采用ThreadLocal進(jìn)行處理,解決線程安全問題。 ThreadLocal和線程同步機(jī)制都是為了解決多線程中相同變量的訪問沖突問題。同步機(jī)制采用了“時(shí)間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊(duì)。而ThreadLocal采用了“空間換時(shí)間”的方式。 ThreadLocal會(huì)為每一個(gè)線程提供一個(gè)獨(dú)立的變量副本,從而隔離了多個(gè)線程對數(shù)據(jù)的訪問沖突。因?yàn)槊恳粋€(gè)線程都擁有自己的變量副本,從而也就沒有必要對該變量進(jìn)行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時(shí),可以把不安全的變量封裝進(jìn)ThreadLocal。 3.14 bean生命周期方法有哪些? 你能重載它們嗎?有兩個(gè)重要的bean 生命周期方法:
bean 標(biāo)簽有兩個(gè)重要的屬性(init-method和destroy-method)。用它們你可以自己定制初始化和注銷方法。它們也有相應(yīng)的注解(@PostConstruct和@PreDestroy)。 3.15 在 Spring中如何注入一個(gè)java集合?Spring提供以下幾種集合的配置元素:
3.16 你可以在Spring中注入一個(gè)null 和一個(gè)空字符串嗎?可以。 4. Spring注解4.1 什么是基于Java的Spring注解配置?基于Java的配置,允許你在少量的Java注解的幫助下,進(jìn)行你的大部分Spring配置而非通過XML文件。 以@Configuration 注解為例,它用來標(biāo)記類可以當(dāng)做一個(gè)bean的定義,被Spring IOC容器使用。 另一個(gè)例子是@Bean注解,它表示此方法將要返回一個(gè)對象,作為一個(gè)bean注冊進(jìn)Spring應(yīng)用上下文。 @Configuration public class StudentConfig { @Bean public StudentBean myStudent() { return new StudentBean(); } } 4.2 怎樣開啟注解裝配?注解裝配在默認(rèn)情況下是不開啟的,為了使用注解裝配,我們必須在Spring配置文件中配置 4.3 @Component, @Controller, @Repository, @Service 有何區(qū)別?
4.4 @Required 注解有什么作用?這個(gè)注解表明bean的屬性必須在配置的時(shí)候設(shè)置,通過一個(gè)bean定義的顯式的屬性值或通過自動(dòng)裝配,若@Required注解的bean屬性未被設(shè)置,容器將拋出BeanInitializationException。示例: public class Employee { private String name; @Required public void setName(String name){ this.name=name; } public string getName(){ return name; } } 4.5 @Autowired 注解有什么作用?@Autowired默認(rèn)是按照類型裝配注入的,默認(rèn)情況下它要求依賴對象必須存在(可以設(shè)置它required屬性為false)。@Autowired 注解提供了更細(xì)粒度的控制,包括在何處以及如何完成自動(dòng)裝配。它的用法和@Required一樣,修飾setter方法、構(gòu)造器、屬性或者具有任意名稱和/或多個(gè)參數(shù)的PN方法。 public class Employee { private String name; @Autowired public void setName(String name) { this.name=name; } public string getName(){ return name; } } 4.6 @Autowired和@Resource有什么區(qū)別?@Autowired可用于:構(gòu)造函數(shù)、成員變量、Setter方法 @Autowired和@Resource之間的區(qū)別
4.7 @Qualifier注解有什么作用?當(dāng)您創(chuàng)建多個(gè)相同類型的 bean 并希望僅使用屬性裝配其中一個(gè) bean 時(shí),您可以使用@Qualifier 注解和 @Autowired 通過指定應(yīng)該裝配哪個(gè)確切的 bean 來消除歧義。 4.8 @RequestMapping注解有什么用?@RequestMapping 注解用于將特定 HTTP 請求方法映射到將處理相應(yīng)請求的控制器中的特定類/方法。此注釋可應(yīng)用于兩個(gè)級別:
5. Spring數(shù)據(jù)訪問5.1 解釋對象/關(guān)系映射集成模塊Spring 通過提供ORM模塊,支持我們在直接JDBC之上使用一個(gè)對象/關(guān)系映射映射(ORM)工具,Spring 支持集成主流的ORM框架,如Hiberate,JDO和 iBATIS,JPA,TopLink,JDO,OJB 。Spring的事務(wù)管理同樣支持以上所有ORM框架及JDBC。 5.2 在Spring框架中如何更有效地使用JDBC?使用Spring JDBC 框架,資源管理和錯(cuò)誤處理的代價(jià)都會(huì)被減輕。所以開發(fā)者只需寫statements 和 queries從數(shù)據(jù)存取數(shù)據(jù),JDBC也可以在Spring框架提供的模板類的幫助下更有效地被使用,這個(gè)模板叫JdbcTemplate 5.3 解釋JDBC抽象和DAO模塊的作用是什么?通過使用JDBC抽象和DAO模塊,保證數(shù)據(jù)庫代碼的簡潔,并能避免數(shù)據(jù)庫資源錯(cuò)誤關(guān)閉導(dǎo)致的問題,它在各種不同的數(shù)據(jù)庫的錯(cuò)誤信息之上,提供了一個(gè)統(tǒng)一的異常訪問層。它還利用Spring的AOP 模塊給Spring應(yīng)用中的對象提供事務(wù)管理服務(wù)。 5.4 Spring DAO 有什么用?Spring DAO(數(shù)據(jù)訪問對象) 使得 JDBC,Hibernate 或 JDO 這樣的數(shù)據(jù)訪問技術(shù)更容易以一種統(tǒng)一的方式工作。這使得用戶容易在持久性技術(shù)之間切換。它還允許您在編寫代碼時(shí),無需考慮捕獲每種技術(shù)不同的異常。 5.5 Spring JDBC API 中存在哪些類?
5.6 JdbcTemplate是什么?JdbcTemplate 類提供了很多便利的方法解決諸如把數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)變成基本數(shù)據(jù)類型或?qū)ο?,?zhí)行寫好的或可調(diào)用的數(shù)據(jù)庫操作語句,提供自定義的數(shù)據(jù)錯(cuò)誤處理。 5.7 Spring通過什么方式訪問Hibernate?在Spring中有兩種方式訪問Hibernate:
5.8 如何通過HibernateDaoSupport將Spring和Hibernate結(jié)合起來?用Spring的 SessionFactory 調(diào)用 LocalSessionFactory。集成過程分三步:
5.9 Spring支持的事務(wù)管理類型是什么?spring 事務(wù)實(shí)現(xiàn)方式有哪些?Spring支持兩種類型的事務(wù)管理:
5.10 Spring事務(wù)的實(shí)現(xiàn)方式和實(shí)現(xiàn)原理是什么?Spring事務(wù)的本質(zhì)其實(shí)就是數(shù)據(jù)庫對事務(wù)的支持,沒有數(shù)據(jù)庫的事務(wù)支持,spring是無法提供事務(wù)功能的。真正的數(shù)據(jù)庫層的事務(wù)提交和回滾是通過binlog或者redo log實(shí)現(xiàn)的。 5.11 Spring的事務(wù)傳播行為有那些?Spring事務(wù)的傳播行為說的是,當(dāng)多個(gè)事務(wù)同時(shí)存在的時(shí)候,spring如何處理這些事務(wù)的行為。
5.12 說一下 Spring 的事務(wù)隔離?spring 有五大隔離級別,默認(rèn)值為 ISOLATION_DEFAULT(使用數(shù)據(jù)庫的設(shè)置),其他四個(gè)隔離級別和數(shù)據(jù)庫的隔離級別一致:
臟讀 :表示一個(gè)事務(wù)能夠讀取另一個(gè)事務(wù)中還未提交的數(shù)據(jù)。比如,某個(gè)事務(wù)嘗試插入記錄 A,此時(shí)該事務(wù)還未提交,然后另一個(gè)事務(wù)嘗試讀取到了記錄 A。 不可重復(fù)讀 :是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。 幻讀 :指同一個(gè)事務(wù)內(nèi)多次查詢返回的結(jié)果集不一樣。比如同一個(gè)事務(wù) A 第一次查詢時(shí)候有 n 條記錄,但是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產(chǎn)生了幻覺。發(fā)生幻讀的原因也是另外一個(gè)事務(wù)新增或者刪除或者修改了第一個(gè)事務(wù)結(jié)果集里面的數(shù)據(jù),同一個(gè)記錄的數(shù)據(jù)內(nèi)容被修改了,所有數(shù)據(jù)行的記錄就變多或者變少了。 5.13 Spring框架的事務(wù)管理有哪些優(yōu)點(diǎn)?
5.14 你更傾向用那種事務(wù)管理類型?大多數(shù)Spring框架的用戶選擇聲明式事務(wù)管理,因?yàn)樗鼘?yīng)用代碼的影響最小,因此更符合一個(gè)無侵入的輕量級容器的思想。聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理,雖然比編程式事務(wù)管理(這種方式允許你通過代碼控制事務(wù))少了一點(diǎn)靈活性。唯一不足地方是,最細(xì)粒度只能作用到方法級別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別。 6. Spring AOP6.1 什么是AOP?OOP(Object-Oriented Programming)面向?qū)ο缶幊?/strong>,允許開發(fā)者定義縱向的關(guān)系,但并適用于定義橫向的關(guān)系,導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。 AOP(Aspect-Oriented Programming),一般稱為面向切面編程,作為面向?qū)ο蟮囊环N補(bǔ)充,用于將那些與業(yè)務(wù)無關(guān),但卻對多個(gè)對象產(chǎn)生影響的公共行為和邏輯,抽取并封裝為一個(gè)可重用的模塊,這個(gè)模塊被命名為“切面”(Aspect),減少系統(tǒng)中的重復(fù)代碼,降低了模塊間的耦合度,同時(shí)提高了系統(tǒng)的可維護(hù)性??捎糜跈?quán)限認(rèn)證、日志、事務(wù)處理等。 6.2 Spring AOP and AspectJ AOP 有什么區(qū)別?AOP 有哪些實(shí)現(xiàn)方式?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代理類,因此也稱為編譯時(shí)增強(qiáng),他會(huì)在編譯階段將AspectJ(切面)織入到Java字節(jié)碼中,運(yùn)行的時(shí)候就是增強(qiáng)之后的AOP對象。 2. Spring AOP使用的動(dòng)態(tài)代理,所謂的動(dòng)態(tài)代理就是說AOP框架不會(huì)去修改字節(jié)碼,而是每次運(yùn)行時(shí)在內(nèi)存中臨時(shí)為方法生成一個(gè)AOP對象,這個(gè)AOP對象包含了目標(biāo)對象的全部方法,并且在特定的切點(diǎn)做了增強(qiáng)處理,并回調(diào)原對象的方法。 6.3 JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理的區(qū)別是什么?Spring AOP中的動(dòng)態(tài)代理主要有兩種方式,JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理:
靜態(tài)代理與動(dòng)態(tài)代理區(qū)別在于生成AOP代理對象的時(shí)機(jī)不同,相對來說AspectJ的靜態(tài)代理方式具有更好的性能,但是AspectJ需要特定的編譯器進(jìn)行處理,而Spring AOP則無需特定的編譯器處理。
6.4 如何理解 Spring 中的代理?將 Advice 應(yīng)用于目標(biāo)對象后創(chuàng)建的對象稱為代理。在客戶端對象的情況下,目標(biāo)對象和代理對象是相同的。 Advice + Target Object = Proxy 6.5 請解釋一下Spring AOP核心的名稱分別是什么意思?
6.6 為什么Spring只支持方法級別的連接點(diǎn)?因?yàn)镾pring基于動(dòng)態(tài)代理,所以Spring只支持方法連接點(diǎn)。Spring缺少對字段連接點(diǎn)的支持,而且它不支持構(gòu)造器連接點(diǎn)。方法之外的連接點(diǎn)攔截功能,我們可以利用Aspect來補(bǔ)充。 6.7 Spring AOP 中,關(guān)注點(diǎn)和橫切關(guān)注的區(qū)別是什么?關(guān)注點(diǎn)(concern)是應(yīng)用中一個(gè)模塊的行為,一個(gè)關(guān)注點(diǎn)可能會(huì)被定義成一個(gè)我們想實(shí)現(xiàn)的一個(gè)功能。 橫切關(guān)注點(diǎn)(cross-cutting concern)是一個(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)。 6.8 Spring通知有哪些類型?在AOP術(shù)語中,切面的工作被稱為通知,實(shí)際上是程序執(zhí)行時(shí)要通過SpringAOP框架觸發(fā)的代碼段。 Spring切面可以應(yīng)用5種類型的通知:
同一個(gè)aspect,不同advice的執(zhí)行順序:
6.9 什么是切面 Aspect?aspect 由 pointcount 和 advice 組成,切面是通知和切點(diǎn)的結(jié)合。 它既包含了橫切邏輯的定義, 也包括了連接點(diǎn)的定義. Spring AOP 就是負(fù)責(zé)實(shí)施切面的框架, 它將切面所定義的橫切邏輯編織到切面所指定的連接點(diǎn)中.
可以簡單地認(rèn)為, 使用 @Aspect 注解的類就是切面. 6.10 什么是基于XML Schema方式的切面實(shí)現(xiàn)?在這種情況下,切面由常規(guī)類以及基于XML的配置實(shí)現(xiàn)。 6.11 什么是基于注解的切面實(shí)現(xiàn)?在這種情況下(基于@AspectJ的實(shí)現(xiàn)),涉及到的切面聲明的風(fēng)格與帶有java5標(biāo)注的普通java類一致。 6.12 有幾種不同類型的自動(dòng)代理?
|
|