Spring面試題資料_第1頁
Spring面試題資料_第2頁
Spring面試題資料_第3頁
Spring面試題資料_第4頁
Spring面試題資料_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1、什么是Spring框架?Spring框架有哪些主要模塊?Spring框架是一個(gè)為Java應(yīng)用程序的開發(fā)提供了綜合、廣泛的基礎(chǔ)性支持的Java平臺(tái)。Spring幫助開發(fā)者解決了開發(fā)中基礎(chǔ)性的問題,使得開發(fā)人員可以專注于應(yīng)用程序的開發(fā)。Spring框架本身亦是按照設(shè)計(jì)模式精心打造,這使得我們可以在開發(fā)環(huán)境中安心的集成Spring框架,不必?fù)?dān)心Spring是如何在后臺(tái)進(jìn)行工作的。Spring框架至今已集成了20多個(gè)模塊。這些模塊主要被分如下圖所示的核心容器、數(shù)據(jù)訪問/集成,、Web、AOP(面向切面編程)、工具、消息和測(cè)試模塊。更多信息:Spring 框架教程。2、使用Spring框架能帶來哪些

2、好處?下面列舉了一些使用Spring框架帶來的主要好處:· Dependency Injection(DI) 方法使得構(gòu)造器和JavaBean properties文件中的依賴關(guān)系一目了然。· 與EJB容器相比較,IoC容器更加趨向于輕量級(jí)。這樣一來IoC容器在有限的內(nèi)存和CPU資源的情況下進(jìn)行應(yīng)用程序的開發(fā)和發(fā)布就變得十分有利。· Spring并沒有閉門造車,Spring利用了已有的技術(shù)比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他視圖技術(shù)。· Spring框架是按照模塊的形式來組織的。由包和類的編號(hào)

3、就可以看出其所屬的模塊,開發(fā)者僅僅需要選用他們需要的模塊即可。· 要測(cè)試一項(xiàng)用Spring開發(fā)的應(yīng)用程序十分簡(jiǎn)單,因?yàn)闇y(cè)試相關(guān)的環(huán)境代碼都已經(jīng)囊括在框架中了。更加簡(jiǎn)單的是,利用JavaBean形式的POJO類,可以很方便的利用依賴注入來寫入測(cè)試數(shù)據(jù)。· Spring的Web框架亦是一個(gè)精心設(shè)計(jì)的Web MVC框架,為開發(fā)者們?cè)趙eb框架的選擇上提供了一個(gè)除了主流框架比如Struts、過度設(shè)計(jì)的、不流行web框架的以外的有力選項(xiàng)。· Spring提供了一個(gè)便捷的事務(wù)管理接口,適用于小型的本地事物處理(比如在單DB的環(huán)境下)和復(fù)雜的共同事物處理(比如利用JT

4、A的復(fù)雜DB環(huán)境)。3、什么是控制反轉(zhuǎn)(IOC)?什么是依賴注入?控制反轉(zhuǎn)是應(yīng)用于軟件工程領(lǐng)域中的,在運(yùn)行時(shí)被裝配器對(duì)象來綁定耦合對(duì)象的一種編程技巧,對(duì)象之間耦合關(guān)系在編譯時(shí)通常是未知的。在傳統(tǒng)的編程方式中,業(yè)務(wù)邏輯的流程是由應(yīng)用程序中的早已被設(shè)定好關(guān)聯(lián)關(guān)系的對(duì)象來決定的。在使用控制反轉(zhuǎn)的情況下,業(yè)務(wù)邏輯的流程是由對(duì)象關(guān)系圖來決定的,該對(duì)象關(guān)系圖由裝配器負(fù)責(zé)實(shí)例化,這種實(shí)現(xiàn)方式還可以將對(duì)象之間的關(guān)聯(lián)關(guān)系的定義抽象化。而綁定的過程是通過“依賴注入”實(shí)現(xiàn)的??刂品崔D(zhuǎn)是一種以給予應(yīng)用程序中目標(biāo)組件更多控制為目的設(shè)計(jì)范式,并在我們的實(shí)際工作中起到了有效的作用。依賴注入是在編譯階段尚未知所需的功能是來自

5、哪個(gè)的類的情況下,將其他對(duì)象所依賴的功能對(duì)象實(shí)例化的模式。這就需要一種機(jī)制用來激活相應(yīng)的組件以提供特定的功能,所以依賴注入是控制反轉(zhuǎn)的基礎(chǔ)。否則如果在組件不受框架控制的情況下,框架又怎么知道要?jiǎng)?chuàng)建哪個(gè)組件?在Java中依然注入有以下三種實(shí)現(xiàn)方式:1. 構(gòu)造器注入2. Setter方法注入3. 接口注入4、請(qǐng)解釋下Spring框架中的IoC?Spring中的  包和 org.springframework.context包構(gòu)成了Spring框架IoC容器的基礎(chǔ)。BeanFactory 接口提供了一個(gè)先進(jìn)的配置機(jī)制,使得任何類型的對(duì)象的配置成為可能。Applicati

6、onContex接口對(duì)BeanFactory(是一個(gè)子接口)進(jìn)行了擴(kuò)展,在BeanFactory的基礎(chǔ)上添加了其他功能,比如與Spring的AOP更容易集成,也提供了處理message resource的機(jī)制(用于國際化)、事件傳播以及應(yīng)用層的特別配置,比如針對(duì)Web應(yīng)用的WebApplicationContext。 是Spring IoC容器的具體實(shí)現(xiàn),用來包裝和管理前面提到的各種bean。BeanFactory接口是Spring IoC 容器的核心接口。5、BeanFactory和ApplicationContext有什么區(qū)別?BeanFactory 可以理解為含有be

7、an集合的工廠類。BeanFactory 包含了種bean的定義,以便在接收到客戶端請(qǐng)求時(shí)將對(duì)應(yīng)的bean實(shí)例化。BeanFactory還能在實(shí)例化對(duì)象的時(shí)生成協(xié)作類之間的關(guān)系。此舉將bean自身與bean客戶端的配置中解放出來。BeanFactory還包含了bean生命周期的控制,調(diào)用客戶端的初始化方法(initialization methods)和銷毀方法(destruction methods)。從表面上看,application context如同bean factory一樣具有bean定義、bean關(guān)聯(lián)關(guān)系的設(shè)置,根據(jù)請(qǐng)求分發(fā)bean的功能。但application co

8、ntext在此基礎(chǔ)上還提供了其他的功能。1. 提供了支持國際化的文本消息2. 統(tǒng)一的資源文件讀取方式3. 已在監(jiān)聽器中注冊(cè)的bean的事件以下是三種較常見的 ApplicationContext 實(shí)現(xiàn)方式:1、ClassPathXmlApplicationContext:從classpath的XML配置文件中讀取上下文,并生成上下文定義。應(yīng)用程序上下文從程序環(huán)境變量中取得。ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);2、FileSystemXmlApplication

9、Context :由文件系統(tǒng)中的XML配置文件讀取上下文。ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);3、XmlWebApplicationContext:由Web應(yīng)用的XML文件讀取上下文。6、Spring有幾種配置方式?將Spring配置到應(yīng)用開發(fā)中有以下三種方式:1. 基于XML的配置2. 基于注解的配置3. 基于Java的配置7、如何用基于XML配置的方式配置Spring?在Spring框架中,依賴和服務(wù)需要在專門的配置文件來實(shí)現(xiàn),我常用的XML格式的配置文件。這些配置文件的格

10、式通常用<beans>開頭,然后一系列的bean定義和專門的應(yīng)用配置選項(xiàng)組成。SpringXML配置的主要目的時(shí)候是使所有的Spring組件都可以用xml文件的形式來進(jìn)行配置。這意味著不會(huì)出現(xiàn)其他的Spring配置類型(比如聲明的方式或基于Java Class的配置方式)Spring的XML配置方式是使用被Spring命名空間的所支持的一系列的XML標(biāo)簽來實(shí)現(xiàn)的。Spring有以下主要的命名空間:context、beans、jdbc、tx、aop、mvc和aso。<beans> <!- JSON Support -> <bean name="

11、viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/> <bean name="jsonTemplate" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/> <bean id="restTemplate" class="org.springframework.web

12、.client.RestTemplate"/></beans>下面這個(gè)web.xml僅僅配置了DispatcherServlet,這件最簡(jiǎn)單的配置便能滿足應(yīng)用程序配置運(yùn)行時(shí)組件的需求。<web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>spring</servlet-name> <servlet-class> </servlet-clas

13、s> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping></web-app>8、如何用基于Java配置的方式配置Spring?Spring對(duì)Java配置的支持是由Configuration注解和Bean注解來實(shí)現(xiàn)的。由Bean

14、注解的方法將會(huì)實(shí)例化、配置和初始化一個(gè)新對(duì)象,這個(gè)對(duì)象將由Spring的IoC容器來管理。Bean聲明所起到的作用與<bean/> 元素類似。被Configuration所注解的類則表示這個(gè)類的主要目的是作為bean定義的資源。被Configuration聲明的類可以通過在同一個(gè)類的內(nèi)部調(diào)用bean方法來設(shè)置嵌入bean的依賴關(guān)系。最簡(jiǎn)單的Configuration 聲明類請(qǐng)參考下面的代碼:Configurationpublic class AppConfig Bean public MyService myService() return new MyServ

15、iceImpl(); 對(duì)于上面的Beans配置文件相同的XML配置文件如下:<beans> <bean id="myService" class="com.howtodoinjava.services.MyServiceImpl"/></beans>上述配置方式的實(shí)例化方式如下:利用AnnotationConfigApplicationContext 類進(jìn)行實(shí)例化public static void main(String args) ApplicationContext ctx = new Annotati

16、onConfigApplicationContext(AppConfig.class); MyService myService = ctx.getBean(MyService.class); myService.doStuff();要使用組件組建掃描,僅需用Configuration進(jìn)行注解即可:ConfigurationComponentScan(basePackages = "com.howtodoinjava")public class AppConfig .在上面的例子中,com.acme包首先會(huì)被掃到,然后再容器內(nèi)查找被Component 聲明的類,找

17、到后將這些類按照Sring bean定義進(jìn)行注冊(cè)。如果你要在你的web應(yīng)用開發(fā)中選用上述的配置的方式的話,需要用AnnotationConfigWebApplicationContext 類來讀取配置文件,可以用來配置Spring的Servlet監(jiān)聽器ContrextLoaderListener或者Spring MVC的DispatcherServlet。<web-app> <!- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext instead of the d

18、efault XmlWebApplicationContext -> <context-param> <param-name>contextClass</param-name> <param-value> </param-value> </context-param> <!- Configuration locations must consist of one or more comma- or space-delimited fully-qualified Configuration classes. Fu

19、lly-qualified packages may also be specified for component-scanning -> <context-param> <param-name>contextConfigLocation</param-name> <param-value>com.howtodoinjava.AppConfig</param-value> </context-param> <!- Bootstrap the root application context as usual

20、using ContextLoaderListener -> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!- Declare a Spring MVC DispatcherServlet as usual -> <servlet> <servlet-name>dispatcher</servlet-name> <

21、;servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext instead of the default XmlWebApplicationContext -> <init-param> <param-name>contextClass</param-name> <par

22、am-value> </param-value> </init-param> <!- Again, config locations must consist of one or more comma- or space-delimited and fully-qualified Configuration classes -> <init-param> <param-name>contextConfigLocation</param-name> <param-value>com.howtodoinjav

23、a.web.MvcConfig</param-value> </init-param> </servlet> <!- map all requests for /app/* to the dispatcher servlet -> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping></web-app&g

24、t;9、怎樣用注解的方式配置Spring?Spring在2.5版本以后開始支持用注解的方式來配置依賴注入??梢杂米⒔獾姆绞絹硖娲鶻ML方式的bean描述,可以將bean描述轉(zhuǎn)移到組件類的內(nèi)部,只需要在相關(guān)類上、方法上或者字段聲明上使用注解即可。注解注入將會(huì)被容器在XML注入之前被處理,所以后者會(huì)覆蓋掉前者對(duì)于同一個(gè)屬性的處理結(jié)果。注解裝配在Spring中是默認(rèn)關(guān)閉的。所以需要在Spring文件中配置一下才能使用基于注解的裝配模式。如果你想要在你的應(yīng)用程序中使用關(guān)于注解的方法的話,請(qǐng)參考如下的配置。<beans> <context:annotation-config/>

25、<!- bean definitions go here -></beans>在 <context:annotation-config/>標(biāo)簽配置完成以后,就可以用注解的方式在Spring中向?qū)傩?、方法和?gòu)造方法中自動(dòng)裝配變量。下面是幾種比較重要的注解類型:1. Required:該注解應(yīng)用于設(shè)值方法。2. Autowired:該注解應(yīng)用于有值設(shè)值方法、非設(shè)值方法、構(gòu)造方法和變量。3. Qualifier:該注解和Autowired注解搭配使用,用于消除特定bean自動(dòng)裝配的歧義。4. JSR-250 Annotations:Spring支持基于J

26、SR-250 注解的以下注解,Resource、PostConstruct 和 PreDestroy。10、請(qǐng)解釋Spring Bean的生命周期?Spring Bean的生命周期簡(jiǎn)單易懂。在一個(gè)bean實(shí)例被初始化時(shí),需要執(zhí)行一系列的初始化操作以達(dá)到可用的狀態(tài)。同樣的,當(dāng)一個(gè)bean不在被調(diào)用時(shí)需要進(jìn)行相關(guān)的析構(gòu)操作,并從bean容器中移除。Spring bean factory 負(fù)責(zé)管理在spring容器中被創(chuàng)建的bean的生命周期。Bean的生命周期由兩組回調(diào)(call back)方法組成。1. 初始化之后調(diào)用的回調(diào)方法。2. 銷毀之前調(diào)用的回調(diào)方法。Spring框架提供了以下四種方式來

27、管理bean的生命周期事件:· InitializingBean和DisposableBean回調(diào)接口· 針對(duì)特殊行為的其他Aware接口· Bean配置文件中的Custom init()方法和destroy()方法· PostConstruct和PreDestroy注解方式使用customInit()和 customDestroy()方法管理bean生命周期的代碼樣例如下:<beans> <bean id="demoBean" class="com.howtodoinjava.task.Demo

28、Bean" init-method="customInit" destroy-method="customDestroy"></bean></beans>更多內(nèi)容請(qǐng)參考:Spring生命周期Spring Bean Life Cycle。11、Spring Bean的作用域之間有什么區(qū)別?Spring容器中的bean可以分為5個(gè)范圍。所有范圍的名稱都是自說明的,但是為了避免混淆,還是讓我們來解釋一下:1. singleton:這種bean范圍是默認(rèn)的,這種范圍確保不管接受到多少個(gè)請(qǐng)求,每個(gè)容器中只有一個(gè)bean的實(shí)例

29、,單例的模式由bean factory自身來維護(hù)。2. prototype:原形范圍與單例范圍相反,為每一個(gè)bean請(qǐng)求提供一個(gè)實(shí)例。3. request:在請(qǐng)求bean范圍內(nèi)會(huì)每一個(gè)來自客戶端的網(wǎng)絡(luò)請(qǐng)求創(chuàng)建一個(gè)實(shí)例,在請(qǐng)求完成以后,bean會(huì)失效并被垃圾回收器回收。4. Session:與請(qǐng)求范圍類似,確保每個(gè)session中有一個(gè)bean的實(shí)例,在session過期后,bean會(huì)隨之失效。5. global-session:global-session和Portlet應(yīng)用相關(guān)。當(dāng)你的應(yīng)用部署在Portlet容器中工作時(shí),它包含很多portlet。如果你想要聲明讓所有的portlet共用全局

30、的存儲(chǔ)變量的話,那么這全局變量需要存儲(chǔ)在global-session中。全局作用域與Servlet中的session作用域效果相同。更多內(nèi)容請(qǐng)參考 : Spring Bean Scopes。12、什么是Spring inner beans?在Spring框架中,無論何時(shí)bean被使用時(shí),當(dāng)僅被調(diào)用了一個(gè)屬性。一個(gè)明智的做法是將這個(gè)bean聲明為內(nèi)部bean。內(nèi)部bean可以用setter注入“屬性”和構(gòu)造方法注入“構(gòu)造參數(shù)”的方式來實(shí)現(xiàn)。比如,在我們的應(yīng)用程序中,一個(gè)Customer類引用了一個(gè)Person類,我們的要做的是創(chuàng)建一個(gè)Person的實(shí)例,然后在Customer內(nèi)部使用。

31、public class Customer private Person person; /Setters and Getterspublic class Person private String name; private String address; private int age; /Setters and Getters內(nèi)部bean的聲明方式如下:<bean id="CustomerBean" class="mon.Customer"> <property name="person"> <!-

32、 This is inner bean -> <bean class="mon.Person"> <property name="name" value="lokesh" /> <property name="address" value="India" /> <property name="age" value="34" /> </bean> </property></b

33、ean>13、Spring框架中的單例Beans是線程安全的么?Spring框架并沒有對(duì)單例bean進(jìn)行任何多線程的封裝處理。關(guān)于單例bean的線程安全和并發(fā)問題需要開發(fā)者自行去搞定。但實(shí)際上,大部分的Spring bean并沒有可變的狀態(tài)(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態(tài)的話(比如 View Model 對(duì)象),就需要自行保證線程安全。最淺顯的解決辦法就是將多態(tài)bean的作用域由“singleton”變更為“prototype”。14、請(qǐng)舉例說明如何在Spring中注入一個(gè)Java Collectio

34、n?Spring提供了以下四種集合類的配置元素:· <list> :   該標(biāo)簽用來裝配可重復(fù)的list值。· <set> :    該標(biāo)簽用來裝配沒有重復(fù)的set值。· <map>:   該標(biāo)簽可用來注入鍵和值可以為任何類型的鍵值對(duì)。· <props> : 該標(biāo)簽支持注入鍵和值都是字符串類型的鍵值對(duì)。下面看一下具體的例子:<beans> <!- Definition for javaCol

35、lection -> <bean id="javaCollection" class="com.howtodoinjava.JavaCollection"> <!- java.util.List -> <property name="customList"> <list> <value>INDIA</value> <value>Pakistan</value> <value>USA</value> <va

36、lue>UK</value> </list> </property> <!- java.util.Set -> <property name="customSet"> <set> <value>INDIA</value> <value>Pakistan</value> <value>USA</value> <value>UK</value> </set> </property>

37、<!- java.util.Map -> <property name="customMap"> <map> <entry key="1" value="INDIA"/> <entry key="2" value="Pakistan"/> <entry key="3" value="USA"/> <entry key="4" value="UK&qu

38、ot;/> </map> </property> <!- java.util.Properties -> <property name="customProperies"> <props> <prop key="admin">admin</prop> <prop key="support">support</prop> </props> </property> </bean></b

39、eans>15、如何向Spring Bean中注入一個(gè)Java.util.Properties?第一種方法是使用如下面代碼所示的<props> 標(biāo)簽:<bean id="adminUser" class="mon.Customer"> <!- java.util.Properties -> <property name="emails"> <props> <prop key="admin">admin</prop>

40、<prop key="support">support</prop> </props> </property></bean>也可用”util:”命名空間來從properties文件中創(chuàng)建出一個(gè)propertiesbean,然后利用setter方法注入bean的引用。16、請(qǐng)解釋Spring Bean的自動(dòng)裝配?在Spring框架中,在配置文件中設(shè)定bean的依賴關(guān)系是一個(gè)很好的機(jī)制,Spring容器還可以自動(dòng)裝配合作關(guān)系bean之間的關(guān)聯(lián)關(guān)系。這意味著Spring可以通過向Bean Factory中注入的方式自動(dòng)搞

41、定bean之間的依賴關(guān)系。自動(dòng)裝配可以設(shè)置在每個(gè)bean上,也可以設(shè)定在特定的bean上。下面的XML配置文件表明了如何根據(jù)名稱將一個(gè)bean設(shè)置為自動(dòng)裝配:<bean id="employeeDAO" class="com.howtodoinjava.EmployeeDAOImpl" autowire="byName" />除了bean配置文件中提供的自動(dòng)裝配模式,還可以使用Autowired注解來自動(dòng)裝配指定的bean。在使用Autowired注解之前需要在按照如下的配置方式在Spring配置文件進(jìn)行配置才可以使用。&

42、lt;context:annotation-config />也可以通過在配置文件中配置AutowiredAnnotationBeanPostProcessor 達(dá)到相同的效果。<bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>配置好以后就可以使用Autowired來標(biāo)注了。Autowiredpublic EmployeeDAOImpl ( EmployeeManager manager ) this.

43、manager = manager;17、請(qǐng)解釋自動(dòng)裝配模式的區(qū)別?在Spring框架中共有5種自動(dòng)裝配,讓我們逐一分析。1. no:這是Spring框架的默認(rèn)設(shè)置,在該設(shè)置下自動(dòng)裝配是關(guān)閉的,開發(fā)者需要自行在bean定義中用標(biāo)簽明確的設(shè)置依賴關(guān)系。2. byName:該選項(xiàng)可以根據(jù)bean名稱設(shè)置依賴關(guān)系。當(dāng)向一個(gè)bean中自動(dòng)裝配一個(gè)屬性時(shí),容器將根據(jù)bean的名稱自動(dòng)在在配置文件中查詢一個(gè)匹配的bean。如果找到的話,就裝配這個(gè)屬性,如果沒找到的話就報(bào)錯(cuò)。3. byType:該選項(xiàng)可以根據(jù)bean類型設(shè)置依賴關(guān)系。當(dāng)向一個(gè)bean中自動(dòng)裝配一個(gè)屬性時(shí),容器將根據(jù)bean的類型自動(dòng)在在配置

44、文件中查詢一個(gè)匹配的bean。如果找到的話,就裝配這個(gè)屬性,如果沒找到的話就報(bào)錯(cuò)。4. constructor:造器的自動(dòng)裝配和byType模式類似,但是僅僅適用于與有構(gòu)造器相同參數(shù)的bean,如果在容器中沒有找到與構(gòu)造器參數(shù)類型一致的bean,那么將會(huì)拋出異常。5. autodetect:該模式自動(dòng)探測(cè)使用構(gòu)造器自動(dòng)裝配或者byType自動(dòng)裝配。首先,首先會(huì)嘗試找合適的帶參數(shù)的構(gòu)造器,如果找到的話就是用構(gòu)造器自動(dòng)裝配,如果在bean內(nèi)部沒有找到相應(yīng)的構(gòu)造器或者是無參構(gòu)造器,容器就會(huì)自動(dòng)選擇byTpe的自動(dòng)裝配方式。18、如何開啟基于注解的自動(dòng)裝配?要使用 Autowired,需要注

45、冊(cè) AutowiredAnnotationBeanPostProcessor,可以有以下兩種方式來實(shí)現(xiàn):1、引入配置文件中的<bean>下引入 <context:annotation-config><beans> <context:annotation-config /></beans>2、在bean配置文件中直接引入AutowiredAnnotationBeanPostProcessor<beans> <bean class="org.springframework.beans.fac

46、tory.annotation.AutowiredAnnotationBeanPostProcessor"/></beans>19、請(qǐng)舉例解釋Required annotation?在產(chǎn)品級(jí)別的應(yīng)用中,IoC容器可能聲明了數(shù)十萬了bean,bean與bean之間有著復(fù)雜的依賴關(guān)系。設(shè)值注解方法的短板之一就是驗(yàn)證所有的屬性是否被注解是一項(xiàng)十分困難的操作。可以通過在<bean>中設(shè)置“dependency-check”來解決這個(gè)問題。在應(yīng)用程序的生命周期中,你可能不大愿意花時(shí)間在驗(yàn)證所有bean的屬性是否按照上下文文件正確配置?;蛘吣銓幙沈?yàn)證某個(gè)bean的特

47、定屬性是否被正確的設(shè)置。即使是用“dependency-check”屬性也不能很好的解決這個(gè)問題,在這種情況下,你需要使用Required 注解。需要用如下的方式使用來標(biāo)明bean的設(shè)值方法。public class EmployeeFactoryBean extends AbstractFactoryBean<Object> private String designation; public String getDesignation() return designation; Required public void setDesignation(String de

48、signation) this.designation = designation; /more code hereRequiredAnnotationBeanPostProcessor是Spring中的后置處理用來驗(yàn)證被Required 注解的bean屬性是否被正確的設(shè)置了。在使用RequiredAnnotationBeanPostProcesso來驗(yàn)證bean屬性之前,首先要在IoC容器中對(duì)其進(jìn)行注冊(cè):<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPo

49、stProcessor" />但是如果沒有屬性被用 Required 注解過的話,后置處理器會(huì)拋出一個(gè)BeanInitializationException 異常。20、請(qǐng)舉例解釋Autowired注解?Autowired注解對(duì)自動(dòng)裝配何時(shí)何處被實(shí)現(xiàn)提供了更多細(xì)粒度的控制。Autowired注解可以像Required注解、構(gòu)造器一樣被用于在bean的設(shè)值方法上自動(dòng)裝配bean的屬性,一個(gè)參數(shù)或者帶有任意名稱或帶有多個(gè)參數(shù)的方法。比如,可以在設(shè)值方法上使用Autowired注解來替代配置文件中的 <property>元素。當(dāng)Sp

50、ring容器在setter方法上找到Autowired注解時(shí),會(huì)嘗試用byType 自動(dòng)裝配。當(dāng)然我們也可以在構(gòu)造方法上使用Autowired 注解。帶有Autowired 注解的構(gòu)造方法意味著在創(chuàng)建一個(gè)bean時(shí)將會(huì)被自動(dòng)裝配,即便在配置文件中使用<constructor-arg> 元素。public class TextEditor private SpellChecker spellChecker; Autowired public TextEditor(SpellChecker spellChecker) System.out.pri

51、ntln("Inside TextEditor constructor." ); this.spellChecker = spellChecker; public void spellCheck() spellChecker.checkSpelling(); 下面是沒有構(gòu)造參數(shù)的配置方式:<beans> <context:annotation-config/> <!- Definition for textEditor bean without constructor-arg -> <bean id="textEditor

52、" class="com.howtodoinjava.TextEditor"> </bean> <!- Definition for spellChecker bean -> <bean id="spellChecker" class="com.howtodoinjava.SpellChecker"> </bean></beans>21、請(qǐng)舉例說明Qualifier注解?Qualifier注解意味著可以在被標(biāo)注bean的字段上可以自動(dòng)裝配。Qualifier注

53、解可以用來取消Spring不能取消的bean應(yīng)用。下面的示例將會(huì)在Customer的person屬性中自動(dòng)裝配person的值。public class Customer Autowired private Person person;下面我們要在配置文件中來配置Person類。<bean id="customer" class="mon.Customer" /><bean id="personA" class="mon.Person" > <property name="n

54、ame" value="lokesh" /></bean><bean id="personB" class="mon.Person" > <property name="name" value="alex" /></bean>Spring會(huì)知道要自動(dòng)裝配哪個(gè)person bean么?不會(huì)的,但是運(yùn)行上面的示例時(shí),會(huì)拋出下面的異常:Caused by: org.springframework.beans.factory.NoSuchB

55、eanDefinitionException: No unique bean of type mon.Person is defined: expected single matching bean but found 2: personA, personB要解決上面的問題,需要使用 Quanlifier注解來告訴Spring容器要裝配哪個(gè)bean:public class Customer Autowired Qualifier("personA") private Person person;22、構(gòu)造方法注入和設(shè)值注入有什么區(qū)別?請(qǐng)注意以下明顯的區(qū)別:1.

56、在設(shè)值注入方法支持大部分的依賴注入,如果我們僅需要注入int、string和long型的變量,我們不要用設(shè)值的方法注入。對(duì)于基本類型,如果我們沒有注入的話,可以為基本類型設(shè)置默認(rèn)值。在構(gòu)造方法注入不支持大部分的依賴注入,因?yàn)樵谡{(diào)用構(gòu)造方法中必須傳入正確的構(gòu)造參數(shù),否則的話為報(bào)錯(cuò)。2. 設(shè)值注入不會(huì)重寫構(gòu)造方法的值。如果我們對(duì)同一個(gè)變量同時(shí)使用了構(gòu)造方法注入又使用了設(shè)置方法注入的話,那么構(gòu)造方法將不能覆蓋由設(shè)值方法注入的值。很明顯,因?yàn)闃?gòu)造方法盡在對(duì)象被創(chuàng)建時(shí)調(diào)用。3. 在使用設(shè)值注入時(shí)有可能還不能保證某種依賴是否已經(jīng)被注入,也就是說這時(shí)對(duì)象的依賴關(guān)系有可能是不完整的。而在另一種情況下,構(gòu)造器注

57、入則不允許生成依賴關(guān)系不完整的對(duì)象。4. 在設(shè)值注入時(shí)如果對(duì)象A和對(duì)象B互相依賴,在創(chuàng)建對(duì)象A時(shí)Spring會(huì)拋出sObjectCurrentlyInCreationException異常,因?yàn)樵贐對(duì)象被創(chuàng)建之前A對(duì)象是不能被創(chuàng)建的,反之亦然。所以Spring用設(shè)值注入的方法解決了循環(huán)依賴的問題,因?qū)ο蟮脑O(shè)值方法是在對(duì)象被創(chuàng)建之前被調(diào)用的。23、Spring框架中有哪些不同類型的事件?Spring的ApplicationContext 提供了支持事件和代碼中監(jiān)聽器的功能。我們可以創(chuàng)建bean用來監(jiān)聽在ApplicationContext 中發(fā)布的事件。ApplicationEvent類和在ApplicationContext接口中處理的事件,如果一個(gè)bean實(shí)現(xiàn)了ApplicationListener接口,當(dāng)一個(gè)ApplicationEvent 被發(fā)布以后,bean會(huì)自動(dòng)被通知。public class AllApplicationEventListener implements ApplicationListener < ApplicationEvent > Override public void onApplicationEvent(ApplicationEve

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論