Java_框架面試題html
七大模塊,以下: 1. Spring Core: Core封裝包是框架的最基礎部分,提供IOC和依賴注入特性。這裏的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的須要,並真正地容許你從程序邏輯中分離出依賴關係和配置。java
Spring Context: 構建於Core封裝包基礎上的 Context 封裝包,提供了一種框架式的對象訪問方法,有些象JNDI註冊器。Context封裝包的特性得自於Beans封裝包,並添加了對國際化(I18N)的支持(例如資源綁定),事件傳播,資源裝載的方式和Context的透明建立,好比說經過Servlet容器。nginx
Spring DAO: DAO (Data Access Object)提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼。 而且,JDBC封裝包還提供了一種比編程性更好的聲明性事務管理方法,不只僅是實現了特定接口,並且對全部的POJOs(plain old Java objects)都適用。git
Spring ORM:ORM 封裝包提供了經常使用的「對象/關係」映射APIs的集成層。 其中包括 JPA 、 JDO 、 Hibernate 和 iBatis 。利用ORM封裝包,能夠混合使用全部Spring提供的特性進行「對象/關係」映射,如前邊提到的簡單聲明性事務管理。web
Spring AOP: Spring的 AOP 封裝包提供了符合AOP Alliance規範的面向方面的編程實現,讓你能夠定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,從而減弱代碼的功能耦合,清晰的被分離開。並且,利用source-level的元數據功能,還能夠將各類行爲信息合併到你的代碼中。面試
Spring Web: Spring中的 Web 包提供了基礎的針對Web開發的集成特性,例如多方文件上傳,利用Servlet listeners進行IOC容器初始化和針對Web的ApplicationContext。當與WebWork或Struts一塊兒使用Spring時,這個包使Spring可與其餘框架結合。spring
Spring Web MVC: Spring中的MVC封裝包提供了Web應用的Model-View-Controller(MVC)實現。Spring的MVC框架並非僅僅提供一種傳統的實現,它提供了一種清晰的分離模型,在領域模型代碼和Web Form之間。而且,還能夠藉助Spring框架的其餘特性。數據庫
DI(依賴注入),IOC(控制反轉),AOP(面向切面編程)編程
IOC:Inversion of Control,控制反轉模式(也稱做依賴性介入)的基本概念是:不建立對象,可是描述建立它們的方式。在代碼中不直接與對象和服務鏈接,但在配置文件中描述哪個組件須要哪一項服務。容器 (在 Spring 框架中是 IOC 容器) 負責將這些聯繫在一塊兒。
在Java開發中,IOC意味着將你設計好的類交給系統去控制,而不是在你的類內部控制,這稱爲控制反轉,就是被調用類的實例由原先的調用類控制建立、銷燬如今轉變成由Spring的容器管理。
注入方式: 1. 接口注入 2. 屬性注入[屬性的SET/GET] 3. 構造注入[構造方法注入] 使用構造函數依賴注入時,Spring保證對象其所依賴的全部對象先實例化後,才實例化這個對象。 使用set方法依賴注入時,Spring首先實例化對象,而後才實例化全部依賴的對象。 * 當設值注入與構造注入同時存在時,先執行設置注入,在執行構造注入。
使用DI注入時,Property表明注入類的屬性,若是引用其餘的bean,則用ref屬性來代表被引用bean的名稱,若是是引用字符串的話,用value屬性。
如: \<property name=」userDao」 ref=」被引用bean的名稱」 /> \<property name=」username」 value = 」字符串」/>
注入DataSource數據源對象,不須要手動關閉數據庫鏈接,JdbcTemplate會幫咱們關閉數據庫鏈接
我的理解:若是說彙編語言是對計算機指令的抽象,面嚮對象語言是對程序要解決的問題的抽象,AOP則是對程序功能自己的抽象。
實現AOP有幾種方式: >1. Spring 1.2版本中經過ProxyFactoryBean來實現aop,即經過動態代理來實現的,Aspect必須繼承MethodBeforeAdvice,MethodAfterAdvice等 >2. Spring 2.0 AOP須要改的是FBI 這個類,並且它也不須要再實現某些接口 >3. 使用標註(@AspectJ)實現AOP
spring提供的事務管理能夠分爲兩類:編程式的和聲明式的。編程式的,比較靈活,可是代碼量大,存在重複的代碼比較多;聲明式的比編程式的更靈活.
不能。Spring的聲明式事務爲實現類產生代理。不能在代碼中使用Try/Catch,由於代碼中捕獲了異常,Spring容器捕獲不了異常。
SpringMVC是基於過濾器對servlet進行了封裝的一個框架,咱們使用的時候就在web.xml中配置DispatcherServlet類;SpringMVC工做是主要是經過DispatcherServlet管理接受到的請求並進行處理。 * SpringMVC的工做流程描述:
- 第一步:用戶向服務器發送請求,請求被Spring前端控制Servelt DispatcherServlet捕獲;
- 第二步: DispatcherServlet對請求URL進行解析,獲得請求資源標識符(URL),而後根據該URL調用HandlerMapping得到該Handler配置的全部相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;
- 第三步: DispatcherServlet 根據得到的Handler,選擇一個合適的HandlerAdapter。(附註:若是成功得到HandlerAdapter後,此時將開始執行攔截器的preHandler(…)方法)
- 第四步:提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程當中,根據你的配置,Spring將幫你作一些額外的工做: >> 1. HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換爲指定的響應信息 >> 2. 數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等 >> 3. 數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期 >> 4. 數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
- 第五步: Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;
- 第六步:根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
- 第七步:ViewResolver 結合Model和View,來渲染視圖
- 第八步:將渲染結果返回給客戶端。
Nginx 是俄羅斯人編寫的十分輕量級的 是一個高性能的HTTP和反向代理服務器,同時也是一個 IMAP/POP3/SMTP 代理服務器. * Nginx實現負載均衡只須要在nginx文件中進行配置便可,配置以下: 1. 第一步:在http模塊中配置upstream 模塊:(舉例)
upstream www.myweb.com { server 127.0.0.1:9100 weight=1; server 127.0.0.1:9200 weight=1;} <br /> 其中weight=1表示權重,用於後端服務器性能不均的狀況,訪問比率約等於權重之比,權重越大訪問機會越多; upstream是配置nginx與後端服務器負載均衡很是重要的一個模塊,而且它還能對後端的服務器的健康狀態進行檢查,若後端服務器中的一臺發生故障,則前端的請求不會轉發到該故障的機器;
第二步:在server模塊裏添加:(舉例) location /myweb { proxy_pass http://www.myweb.com;} 其中 www.myweb.com 字符串要和 upstream 後面的字符串相等;
其中,request、response、session、application、config這五個對象和Servlet的API是同樣的。
struts1是基於JSP和servlet的一個開源的Web應用框架,使用的是MVC的設計模式。struts2是基於webwork技術的框架,是sun和webwork公司聯手開發的一個功能很是齊全的框架,struts2和struts1沒有任何關係,是一個全新的框架
JavaServer Face是基於組件的web開發框架,跟sturts差很少的框架
SessionFactory對應Hibernate的一個數據存儲的概念,它是線程安全的,能夠被多個線程併發訪問。SessionFactory通常只會在啓動的時候構建。對於應用程序,最好將SessionFactory經過單例模式進行封裝以便於訪問。Session是一個輕量級非線程安全的對象(線程間不能共享session),它表示與數據庫進行交互的一個工做單元。Session是由SessionFactory建立的,在任務完成以後它會被關閉。Session是持久層服務對外提供的主要接口。Session會延遲獲取數據庫鏈接(也就是在須要的時候纔會獲取)。爲了不建立太多的session,可使用ThreadLocal將session和當前線程綁定在一塊兒,這樣可讓同一個線程得到的老是同一個session。Hibernate 3中SessionFactory的getCurrentSession()方法就能夠作到。
有些業務邏輯在執行過程當中要求對數據進行排他性的訪問,因而須要經過一些機制保證在此過程當中數據被鎖住不會被外界修改,這就是所謂的鎖機制。 1. 悲觀鎖,顧名思義悲觀的認爲在數據處理過程當中極有可能存在修改數據的併發事務(包括本系統的其餘事務或來自外部系統的事務),因而將處理的數據設置爲鎖定狀態。悲觀鎖必須依賴數據庫自己的鎖機制才能真正保證數據訪問的排他性 2. 樂觀鎖,顧名思義,對併發事務持樂觀態度(認爲對數據的併發操做不會常常性的發生),經過更加寬鬆的鎖機制來解決因爲悲觀鎖排他性的數據訪問對系統性能形成的嚴重影響。最多見的樂觀鎖是經過數據版本標識來實現的,讀取數據時得到數據的版本號,更新數據時將此版本號加1,而後和數據庫表對應記錄的當前版本號進行比較,若是提交的數據版本號大於數據庫中此記錄的當前版本號則更新數據,不然認爲是過時數據沒法更新。 * Hibernate中經過Session的get()和load()方法從數據庫中加載對象時能夠經過參數指定使用悲觀鎖;而樂觀鎖能夠經過給實體類加整型的版本字段再經過XML或@Version註解進行配置。
Application Context 是 spring 中較高級的容器。和 BeanFactory 相似,它能夠加載配置文件中定義的 bean,將全部的 bean 集中在一塊兒,當有請求的時候分配 bean。 另外,它增長了企業所須要的功能,好比,從屬性文件從解析文本信息和將事件傳遞給所指定的監聽器。這個容器在 org.springframework.context.ApplicationContext interface 接口中定義。
ApplicationContext 包含 BeanFactory 全部的功能,通常狀況下,相對於 BeanFactory,ApplicationContext 會被推薦使用。BeanFactory 仍然能夠在輕量級應用中使用,好比移動設備或者基於 applet 的應用程序。
Spring beans 是那些造成Spring應用的主幹的java對象。它們被Spring IOC容器初始化,裝配,和管理。這些beans經過容器中配置的元數據建立。好比,以XML文件中<bean/> 的形式定義。
Spring 框架定義的beans都是單件beans。在bean tag中有個屬性」singleton」,若是它被賦爲TRUE,bean 就是單件,不然就是一個 prototype bean。默認是TRUE,因此全部在Spring框架中的beans 缺省都是單件。
二者都是裝入bean定義信息,裝配bean,根據須要分發bean。可是ApplicationContext提供更多功能,它提供了bean工廠所沒有的解析信息文本工具,包括對國際化的支持,提供了載入文件資源的通用方法,如載入圖片,它能夠用註冊爲監聽器的bean發送事件。另一個很重要的區別是單例bean被載入的方式不同。bean工廠延遲載入全部的bean,直到getbean方法被調用,才被建立。而ApplicationContext會預裝入全部的單例bean,確保須要的時候單例bean都已經準備好了,這樣咱們的應用就不須要等待這些單例bean被建立。
這裏有三種重要的方法給Spring 容器提供配置元數據。 1. XML配置文件。 2. 基於註解的配置。 3. 基於java的配置。
當定義一個<bean> 在Spring裏,咱們還能給這個bean聲明一個做用域。它能夠經過bean 定義中的scope屬性來定義。如,當Spring要在須要的時候每次生產一個新的bean實例,bean的scope屬性被指定爲prototype。另外一方面,一個bean每次使用的時候必須返回同一個實例,這個bean的scope 屬性 必須設爲 singleton。 Spring框架支持如下五種bean的做用域: singleton : bean在每一個Spring ioc 容器中只有一個實例。缺省的Spring bean 的做用域是Singleton,且Spring框架中的單例bean不是線程安全的。 prototype:一個bean的定義能夠有多個實例。 request:每次http請求都會建立一個bean,該做用域僅在基於web的Spring ApplicationContext情形下有效。 session:在一個HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。 * global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。
有兩個重要的bean 生命週期方法,第一個是setup , 它是在容器加載bean的時候被調用。第二個方法是 teardown 它是在容器卸載類的時候被調用。<br /> The bean 標籤有兩個重要的屬性(init-method和destroy-method)。用它們你能夠本身定製初始化和註銷方法。它們也有相應的註解(@PostConstruct和@PreDestroy)。
當一個bean僅被用做另外一個bean的屬性時,它能被聲明爲一個內部bean,爲了定義inner bean,在Spring 的 基於XML的 配置元數據中,能夠在 \<property/>或\<constructor-arg/> 元素內使用\<bean/> 元素,內部bean一般是匿名的,它們的Scope通常是prototype。
Spring提供如下幾種集合的配置元素: 1. \<list>類型用於注入一列值,容許有相同的值。 2. \<<set> 類型用於注入一組值,不容許有相同的值。 3. \<<map> 類型用於注入一組鍵值對,鍵和值均可覺得任意類型。 4. \<<props>類型用於注入一組鍵值對,鍵和值都只能爲String類型。
有五種自動裝配的方式,能夠用來指導Spring容器用自動裝配方式來進行依賴注入。 1. no:默認的方式是不進行自動裝配,經過顯式設置ref 屬性來進行裝配。 2. byName:經過參數名 自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byname,以後容器試圖匹配、裝配和該bean的屬性具備相同名字的bean。 3. byType::經過參數類型自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byType,以後容器試圖匹配、裝配和該bean的屬性具備相同類型的bean。若是有多個bean符合條件,則拋出錯誤。 4. constructor:這個方式相似於byType, 可是要提供給構造器參數,若是沒有肯定的帶參數的構造器參數類型,將會拋出異常。 5. autodetect:首先嚐試使用constructor來自動裝配,若是沒法工做,則使用byType方式。
自動裝配的侷限性是: 1. 重寫: 你仍需用 <constructor-arg>和 <property> 配置來定義依賴,意味着總要重寫自動裝配。 2. 基本數據類型:你不能自動裝配簡單的屬性,如基本數據類型,String字符串,和類。 3. 模糊特性:自動裝配不如顯式裝配精確,若是有可能,建議使用顯式裝配。
能夠。
基於Java的配置,容許你在少許的Java註解的幫助下,進行你的大部分Spring配置而非經過XML文件。
以@Configuration 註解爲例,它用來標記類能夠當作一個bean的定義,被Spring IOC容器使用。另外一個例子是@Bean註解,它表示此方法將要返回一個對象,做爲一個bean註冊進Spring應用上下文。
在Spring中有兩種方式訪問Hibernate: 1. 控制反轉 Hibernate Template和 Callback。 2. 繼承 HibernateDAOSupport提供一個AOP 攔截器。
用Spring的 SessionFactory 調用 LocalSessionFactory。集成過程分三步: 1. 配置the Hibernate SessionFactory。 2. 繼承HibernateDaoSupport實現一個DAO。 3. 在AOP支持的事務中裝配。
編程式事務管理:這意味你經過編程的方式管理事務,給你帶來極大的靈活性,可是難維護。
聲明式事務管理:這意味着你能夠將業務代碼和事務管理分離,你只需用註解和XML配置來管理事務。 >大多數Spring框架的用戶選擇聲明式事務管理,由於它對應用代碼的影響最小,所以更符合一個無侵入的輕量級容器的思想。聲明式事務管理要優於編程式事務管理,雖然比編程式事務管理(這種方式容許你經過代碼控制事務)少了一點靈活性。
引入容許咱們在已存在的類中增長新的方法和屬性。