25個(gè)經(jīng)典的Spring面試題

25個(gè)經(jīng)典的Spring面試問答?本人收集了一些在大家在面試時(shí)被經(jīng)常問及的關(guān)于Spring的主要問題,這些問題有可能在你下次面試時(shí)就會(huì)被問到圆丹。對(duì)于本文中未提及的Spring其他模塊滩愁,我會(huì)單獨(dú)分享面試的問題和答案。歡迎大家向我推薦你在面試過程中遇到關(guān)于Spring的問題运褪。我會(huì)把大家推薦的問題添加到下面的Spring常用面試題清單中供大家參考惊楼。問題清單:

1.什么是Spring框架?Spring框架有哪些主要模塊秸讹?

2.使用Spring框架有什么好處檀咙?

3.什么是控制反轉(zhuǎn)(IOC)?什么是依賴注入璃诀?

4.請(qǐng)解釋下Spring中的IOC弧可?

5.BeanFactory和ApplicationContext有什么區(qū)別?

6.將Spring配置到你的應(yīng)用中共有幾種方法劣欢?

7.什么基于XML的配置棕诵?

8.什么基Java的配置?

9.怎樣用注解的方式配置Spring凿将?

10.描述Spring Bean的生命周期校套?

11.描述Spring中各種Bean的范圍?

12.什么是Spring的嵌入beans牧抵?

13.Spring框架中的單例bean是否是線程安全的笛匙?

14.請(qǐng)舉例說明如何用Spring注入一個(gè)Java的集合類侨把?

15.請(qǐng)舉例說明如何在Spring的Bean中注入一個(gè)java.util.Properties?

16.請(qǐng)解釋Spring的Bean的自動(dòng)生成原理妹孙?


17.請(qǐng)辨析自動(dòng)生成Bean之間模塊的區(qū)別秋柄?


18.如何開啟基于基于注解的自動(dòng)寫入?

19.請(qǐng)舉例說明@Required注解蠢正?

20.請(qǐng)舉例說明@Autowired注解骇笔?

21.請(qǐng)舉例說明@Qualifier注解?

22.請(qǐng)說明構(gòu)造器注入和setter方法注入之間的區(qū)別嚣崭?23.Spring框架中不同類型event有什么區(qū)別笨触?24.FileSystemResource和ClassPathResource有何區(qū)別?25.請(qǐng)列舉Spring框架中用了哪些設(shè)計(jì)模式有鹿??

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框架能帶來哪些好處?下面列舉了一些使用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)就可以看出其所屬的模塊,開發(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ù)雜的共同事物處理(比如利用JTA的復(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)的忿等∑苤遥控制反轉(zhuǎn)是一種以給予應(yīng)用程序中目標(biāo)組件更多控制為目的設(shè)計(jì)范式,并在我們的實(shí)際工作中起到了有效的作用贸街。依賴注入是在編譯階段尚未知所需的功能是來自哪個(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.beans 包和 org.springframework.context包構(gòu)成了Spring框架IoC容器的基礎(chǔ)。BeanFactory 接口提供了一個(gè)先進(jìn)的配置機(jī)制岩齿,使得任何類型的對(duì)象的配置成為可能太颤。ApplicationContex接口對(duì)BeanFactory(是一個(gè)子接口)進(jìn)行了擴(kuò)展,在BeanFactory的基礎(chǔ)上添加了其他功能盹沈,比如與Spring的AOP更容易集成龄章,也提供了處理message resource的機(jī)制(用于國際化)、事件傳播以及應(yīng)用層的特別配置乞封,比如針對(duì)Web應(yīng)用的WebApplicationContext做裙。org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具體實(shí)現(xiàn),用來包裝和管理前面提到的各種bean肃晚。BeanFactory接口是Spring IoC 容器的核心接口锚贱。


5、BeanFactory和ApplicationContext有什么區(qū)別关串?BeanFactory 可以理解為含有bean集合的工廠類拧廊。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 context在此基礎(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、FileSystemXmlApplicationContext :由文件系統(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格式的配置文件。這些配置文件的格式通常用<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="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.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>????????????????org.springframework.web.servlet.DispatcherServlet????????????</servlet-class>????????<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注解的方法將會(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 MyServiceImpl();????}}對(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 AnnotationConfigApplicationContext(AppConfig.class);????MyService myService = ctx.getBean(MyService.class);????myService.doStuff();}要使用組件組建掃描巢寡,僅需用@Configuration進(jìn)行注解即可:@Configuration@ComponentScan(basePackages = "com.howtodoinjava")public class AppConfig ?{????...}在上面的例子中,com.acme包首先會(huì)被掃到椰苟,然后再容器內(nèi)查找被@Component 聲明的類抑月,找到后將這些類按照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 default XmlWebApplicationContext -->????<context-param>????????<param-name>contextClass</param-name>????????<param-value>????????????org.springframework.web.context.support.AnnotationConfigWebApplicationContext????????</param-value>????</context-param>?????<!-- Configuration locations must consist of one or more comma- or space-delimited????????fully-qualified @Configuration classes. Fully-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 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>????????<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>????????????<param-value>????????????????org.springframework.web.context.support.AnnotationConfigWebApplicationContext????????????</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.howtodoinjava.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>


9洁仗、怎樣用注解的方式配置Spring层皱?Spring在2.5版本以后開始支持用注解的方式來配置依賴注入【┝。可以用注解的方式來替代XML方式的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/>???<!-- 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支持基于JSR-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框架提供了以下四種方式來管理bean的生命周期事件:?InitializingBean和DisposableBean回調(diào)接口?針對(duì)特殊行為的其他Aware接口?Bean配置文件中的Custom init()方法和destroy()方法?@PostConstruct和@PreDestroy注解方式使用customInit()和 customDestroy()方法管理bean生命周期的代碼樣例如下:<beans>????<bean id="demoBean" class="com.howtodoinjava.task.DemoBean"????????????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í)例,單例的模式由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共用全局的存儲(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)部使用。public class Customer{????private Person person;?????//Setters and Getters}public class Person{????private String name;????private String address;????private int age;?????//Setters and Getters}內(nèi)部bean的聲明方式如下:<bean id="CustomerBean" class="com.howtodoinjava.common.Customer">????<property name="person">????????<!-- This is inner bean -->????????<bean class="com.howtodoinjava.common.Person">????????????<property name="name" value="lokesh" />????????????<property name="address" value="India" />????????????<property name="age" value="34" />????????</bean>????</property></bean>


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 Collection障陶?Spring提供了以下四種集合類的配置元素:?<list> : ??該標(biāo)簽用來裝配可重復(fù)的list值。?<set> : ???該標(biāo)簽用來裝配沒有重復(fù)的set值桐款。?<map>: ??該標(biāo)簽可用來注入鍵和值可以為任何類型的鍵值對(duì)咸这。?<props> : 該標(biāo)簽支持注入鍵和值都是字符串類型的鍵值對(duì)。下面看一下具體的例子:<beans>????<!-- Definition for javaCollection -->???<bean id="javaCollection" class="com.howtodoinjava.JavaCollection">???????<!-- java.util.List -->??????<property name="customList">????????<list>???????????<value>INDIA</value>???????????<value>Pakistan</value>???????????<value>USA</value>???????????<value>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>??????<!-- 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"/>????????</map>??????</property>???????<!-- java.util.Properties -->????<property name="customProperies">????????<props>????????????<prop key="admin">admin@nospam.com</prop>????????????<prop key="support">support@nospam.com</prop>????????</props>????</property>????</bean>?</beans>


15魔眨、如何向Spring Bean中注入一個(gè)Java.util.Properties媳维?第一種方法是使用如下面代碼所示的<props> 標(biāo)簽:<bean id="adminUser" class="com.howtodoinjava.common.Customer">?????<!-- java.util.Properties -->????<property name="emails">????????<props>????????????<prop key="admin">admin@nospam.com</prop>????????????<prop key="support">support@nospam.com</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)搞定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)行配置才可以使用。<context:annotation-config />也可以通過在配置文件中配置AutowiredAnnotationBeanPostProcessor 達(dá)到相同的效果团秽。<bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>配置好以后就可以使用@Autowired來標(biāo)注了主胧。@Autowiredpublic EmployeeDAOImpl ( EmployeeManager manager ) {????this.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)在在配置文件中查詢一個(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,需要注冊(cè) AutowiredAnnotationBeanPostProcessor茸苇,可以有以下兩種方式來實(shí)現(xiàn):1排苍、引入配置文件中的<bean>下引入 <context:annotation-config><beans>????<context:annotation-config /></beans>2、在bean配置文件中直接引入AutowiredAnnotationBeanPostProcessor<beans>????<bean class="org.springframework.beans.factory.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的特定屬性是否被正確的設(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 designation) {????????this.designation = designation;????}?????//more code here}RequiredAnnotationBeanPostProcessor是Spring中的后置處理用來驗(yàn)證被@Required 注解的bean屬性是否被正確的設(shè)置了。在使用RequiredAnnotationBeanPostProcesso來驗(yàn)證bean屬性之前宾濒,首先要在IoC容器中對(duì)其進(jìn)行注冊(cè):<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />但是如果沒有屬性被用 @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)Spring容器在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.println("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" 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注解可以用來取消Spring不能取消的bean應(yīng)用月褥。下面的示例將會(huì)在Customer的person屬性中自動(dòng)裝配person的值弛随。public class Customer{????@Autowired????private Person person;}下面我們要在配置文件中來配置Person類。<bean id="customer" class="com.howtodoinjava.common.Customer" />?<bean id="personA" class="com.howtodoinjava.common.Person" >????<property name="name" value="lokesh" /></bean>?<bean id="personB" class="com.howtodoinjava.common.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.NoSuchBeanDefinitionException:????No unique bean of type [com.howtodoinjava.common.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.在設(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)造器注入則不允許生成依賴關(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(ApplicationEvent applicationEvent)????{????????//process event????}}Spring 提供了以下5中標(biāo)準(zhǔn)的事件:1.上下文更新事件(ContextRefreshedEvent):該事件會(huì)在ApplicationContext被初始化或者更新時(shí)發(fā)布。也可以在調(diào)用ConfigurableApplicationContext 接口中的refresh()方法時(shí)被觸發(fā)年栓。2.上下文開始事件(ContextStartedEvent):當(dāng)容器調(diào)用ConfigurableApplicationContext的Start()方法開始/重新開始容器時(shí)觸發(fā)該事件拆挥。3.上下文停止事件(ContextStoppedEvent):當(dāng)容器調(diào)用ConfigurableApplicationContext的Stop()方法停止容器時(shí)觸發(fā)該事件。4.上下文關(guān)閉事件(ContextClosedEvent):當(dāng)ApplicationContext被關(guān)閉時(shí)觸發(fā)該事件某抓。容器被關(guān)閉時(shí)纸兔,其管理的所有單例Bean都被銷毀。5.請(qǐng)求處理事件(RequestHandledEvent):在Web應(yīng)用中否副,當(dāng)一個(gè)http請(qǐng)求(request)結(jié)束觸發(fā)該事件汉矿。除了上面介紹的事件以外,還可以通過擴(kuò)展ApplicationEvent 類來開發(fā)自定義的事件副编。public class CustomApplicationEvent extends ApplicationEvent{????public CustomApplicationEvent ( Object source, final String msg )????{????????super(source);????????System.out.println("Created a Custom event");????}}為了監(jiān)聽這個(gè)事件,還需要?jiǎng)?chuàng)建一個(gè)監(jiān)聽器:public class CustomEventListener implements ApplicationListener < CustomApplicationEvent >{????@Override????public void onApplicationEvent(CustomApplicationEvent applicationEvent) {????????//handle event????}}之后通過applicationContext接口的publishEvent()方法來發(fā)布自定義事件流强。CustomApplicationEvent customEvent = new CustomApplicationEvent(applicationContext, "Test message");applicationContext.publishEvent(customEvent);


24痹届、FileSystemResource和ClassPathResource有何區(qū)別?在FileSystemResource 中需要給出spring-config.xml文件在你項(xiàng)目中的相對(duì)路徑或者絕對(duì)路徑打月。在ClassPathResource中spring會(huì)在ClassPath中自動(dòng)搜尋配置文件队腐,所以要把ClassPathResource 文件放在ClassPath下。如果將spring-config.xml保存在了src文件夾下的話奏篙,只需給出配置文件的名稱即可柴淘,因?yàn)閟rc文件夾是默認(rèn)迫淹。簡(jiǎn)而言之,ClassPathResource在環(huán)境變量中讀取配置文件为严,F(xiàn)ileSystemResource在配置文件中讀取配置文件敛熬。


25、Spring 框架中都用到了哪些設(shè)計(jì)模式第股?Spring框架中使用到了大量的設(shè)計(jì)模式应民,下面列舉了比較有代表性的:?代理模式—在AOP和remoting中被用的比較多。?單例模式—在spring配置文件中定義的bean默認(rèn)為單例模式夕吻。?模板方法—用來解決代碼重復(fù)的問題诲锹。?比如. RestTemplate, JmsTemplate, JpaTemplate。?前端控制器—Srping提供了DispatcherServlet來對(duì)請(qǐng)求進(jìn)行分發(fā)涉馅。?視圖幫助(View Helper )—Spring提供了一系列的JSP標(biāo)簽归园,高效宏來輔助將分散的代碼整合在視圖里。?依賴注入—貫穿于BeanFactory / ApplicationContext接口的核心理念稚矿。?工廠模式—BeanFactory用來創(chuàng)建對(duì)象的實(shí)例庸诱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盐捷,隨后出現(xiàn)的幾起案子偶翅,更是在濱河造成了極大的恐慌,老刑警劉巖碉渡,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聚谁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滞诺,警方通過查閱死者的電腦和手機(jī)形导,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來习霹,“玉大人朵耕,你說我怎么就攤上這事×芤叮” “怎么了阎曹?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)煞檩。 經(jīng)常有香客問我处嫌,道長(zhǎng),這世上最難降的妖魔是什么斟湃? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任熏迹,我火速辦了婚禮,結(jié)果婚禮上凝赛,老公的妹妹穿的比我還像新娘注暗。我一直安慰自己坛缕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布捆昏。 她就那樣靜靜地躺著赚楚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屡立。 梳的紋絲不亂的頭發(fā)上直晨,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音膨俐,去河邊找鬼勇皇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛焚刺,可吹牛的內(nèi)容都是我干的敛摘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼乳愉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼兄淫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蔓姚,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤捕虽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后坡脐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泄私,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年备闲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晌端。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恬砂,死狀恐怖咧纠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泻骤,我是刑警寧澤漆羔,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站狱掂,受9級(jí)特大地震影響演痒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜符欠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一嫡霞、第九天 我趴在偏房一處隱蔽的房頂上張望瓶埋。 院中可真熱鬧希柿,春花似錦诊沪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挤悉,卻和暖如春渐裸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背装悲。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工昏鹃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诀诊。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓洞渤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親属瓣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子载迄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容