javascript
加上项目路径 spring security忽略不生效_Spring 常见面试题「收藏」
Spring 常見面試題
1 Spring框架是什么?它的主要模塊有哪些?
Spring框架是一個Java平臺,提供全面的基礎(chǔ)設(shè)施支持開發(fā)Java應(yīng)用程序。Spring處理基礎(chǔ)設(shè)施部分,這樣你就可以專注于應(yīng)用程序部分。Spring框架內(nèi),把一級對象通過設(shè)計模式封裝起來,您可以放心的集成到您自己的應(yīng)用程序而不用關(guān)注他們?nèi)绾卧诤笈_工作。
目前,Spring框架由功能組織成大約20個模塊。這些模塊分為核心容器、數(shù)據(jù)訪問/集成、Web,AOP(面向切面的編程)、instrument(支持和類加載器的實現(xiàn)來在特定的應(yīng)用服務(wù)器上使用)、消息、和測試,如下列圖所示。
2 使用Spring框架的好處是什么?
下面是一些使用Spring框架的好處的列表:
通過依賴注入(DI)方式,在構(gòu)造方法或者java bean屬性上,依賴關(guān)系是明確的和明顯的。
IoC容器往往是輕量級的,特別是與EJB容器相比。這是有利于在有限的內(nèi)存和CPU資源的計算機(jī)上開發(fā)和部署應(yīng)用程序。
Spring不重新發(fā)明輪子,相反,它利用一些現(xiàn)有的技術(shù)如幾個ORM框架,日志框架,JEE,quartz和JDK計時器,其他視圖技術(shù)等。
Spring是模塊化的。盡管包和類很重要,你只關(guān)心你需要的模塊,忽略其它模塊。
在Spring測試應(yīng)用程序很簡單,因為依賴環(huán)境的代碼被移入到框架本身。此外,通過使用JavaBean-style pojo方式,使用依賴注入注入測試數(shù)據(jù)變得更容易。
Spring的web框架是一個設(shè)計良好的web MVC框架,它可以很好的替代其它web框架如struts或者其它web框架。
Spring提供了一致的事務(wù)管理界面,可以管理小到一個本地事務(wù)(例如,使用一個數(shù)據(jù)庫)和大到全局事務(wù)(例如,使用JTA)。
3 什么是控制反轉(zhuǎn)(IoC)和依賴項注入?
依賴注入和控制反轉(zhuǎn)是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。
依賴注入是從應(yīng)用程序的角度在描述,可以把依賴注入描述完整點:應(yīng)用程序依賴容器創(chuàng)建并注入它所需要的外部資源;
而控制反轉(zhuǎn)是從容器的角度在描述,描述完整點:容器控制應(yīng)用程序,由容器反向的向應(yīng)用程序注入應(yīng)用程序所需要的外部資源。
在Java中,依賴注入可能發(fā)生三種方法:
構(gòu)造方法注入
setter方法注入
接口注入
4 Spring框架的IOC是怎么樣的?
org.springframework.beans和org.springframework.context包是Spring框架IoC容器的基礎(chǔ)。
BeanFactory接口提供了一個高級的配置機(jī)制來管理任意屬性的對象。
ApplicationContext接口基于BeanFactory構(gòu)建的(是一個子接口)并添加其他功能,如Spring的AOP功能,信息資源處理(用于國際化)、事件傳播和應(yīng)用程序?qū)拥奶囟ㄉ舷挛娜缭趙eb應(yīng)用程序中使用WebApplicationContext。
org.springframework.beans.factory.BeanFactory是Spring IoC容器真是展現(xiàn),負(fù)責(zé)管理上述bean。BeanFactory接口是Spring IoC容器接口的核心。
5 BeanFactory和ApplicationContext之間的區(qū)別?
一個BeanFactory就像包含bean集合的工廠類。BeanFactory在內(nèi)部持有多個Bean的定義,當(dāng)客戶端請求bean時,將bean進(jìn)行實例化。
初始化時BeanFactory能夠保持對象的依賴關(guān)系。這減輕了負(fù)擔(dān)從bean本身和bean客戶機(jī)的配置。BeanFactory在一個bean的生命周期也能其作用,它可以調(diào)用bean的自定義初始化和銷毀方法。
表面上看,applicationContext和BeanFactory是一樣。同樣加載bean定義,將bean連接在一起,分發(fā)bean。但applicationContext還提供:
一種解析消息的手段,包括對國際化的支持。
一個更通用的加載文件資源的方法。
bean事件注冊為監(jiān)聽器。
三個常用的ApplicationContext實現(xiàn)是:
ClassPathXmlApplicationContext:它從classpath路徑下的一個XML文件加載context的,將Context作為classpath下的資源。加載應(yīng)用程序classpath下的context使用的代碼如下:ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);FileSystemXmlApplicationContext:它從文件系統(tǒng)的一個XML文件加載上下文定義的。從文件系統(tǒng)加載應(yīng)用程序上下文通過如下代碼實現(xiàn)。ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);XmlWebApplicationContext:它從一個web應(yīng)用程序中包含的XML文件加載context。
6 將Spring配置應(yīng)用程序的方式有哪些呢?
配置spring到您的應(yīng)用程序有三種方式:
基于XML的配置
基于注解的配置
基于java的配置
7 基于xml的Spring配置是什么樣子的?
在Spring框架中,bean所需的依賴和服務(wù)在定義在配置文件中,配置文件通常是XML格式。通常這些配置文件都以標(biāo)簽開始,含有大量的bean定義和特定于應(yīng)用程序的配置選項。Spring XML配置的主要目標(biāo)是讓所有spring組件通過使用XML配置文件。
這意味著不會出現(xiàn)任何其他類型的Spring配置(如通過Java類注釋或配置)。Spring XML配置中使用Spring命名空間提供的XML標(biāo)記中使用的配置;Spring命名空間主要有:context、bean、jdbc、tx, aop, mvc等。
? ?????????????最簡單的讓您的應(yīng)用程序加載配置文件和配置運行時組件方式是在web.xml文件中配置DispatcherServlet,如下所示:
Archetype Created Web Applicationspring org.springframework.web.servlet.DispatcherServlet 1spring/????????8 基于java的Spring配置是什么樣子的?
在支持spring的新java配置組件中,@Configuration注解的類和@Bean注解的方法是核心組件。
@Bean注解用于通過方法來實例化,配置和初始化一個新的由Spring IoC容器管理的對象。@Bean注解和元素扮演相同的角色。
在一個類上使用@Configuration注解,其主要用途是作為bean定義的來源。此外, 在同一個類中@Configuration類允許inter-bean定義通過簡單地調(diào)用實現(xiàn)依賴關(guān)系。最簡單的@Configuration注解類如下:
@Configurationpublic class AppConfig{ @Bean public MyService myService() { return new MyServiceImpl(); }}上面注解類等價于基于XML配置文件如下:
為了使這樣的配置能生效,需要使用AnnotationConfigApplicationContext的幫助。
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); MyService myService = ctx.getBean(MyService.class); myService.doStuff();}為使組件掃描生效,只需要@Configuration類注解如下:
@Configuration@ComponentScan(basePackages = "com.howtodoinjava")public class AppConfig { ...}在上面的示例中com.howtodoinjava包將被掃描,尋找任何帶注解@Component的類,這些類將在容器內(nèi)登記為Spring bean。
如果你使用以上的方式配置一個web應(yīng)用程序,那么需要AnnotationConfigWebApplicationContext類來使之生效。AnnotationConfigWebApplicationContext的使用可以通過配置Spring ContextLoaderListener的servlet listener,Spring MVC DispatcherServlet等。
contextClass org.springframework.web.context.support.AnnotationConfigWebApplicationContext contextConfigLocationcom.howtodoinjava.AppConfigorg.springframework.web.context.ContextLoaderListenerdispatcherorg.springframework.web.servlet.DispatcherServletcontextClass org.springframework.web.context.support.AnnotationConfigWebApplicationContext contextConfigLocationcom.howtodoinjava.web.MvcConfigdispatcher/app/*9 基于Spring注解的配置是什么樣子的?
從Spring 2.5就可以使用注解來配置依賴注入。而不是使用XML來描述一個bean的注入,你可以通過使用注解相關(guān)的類,方法或字段聲明將bean配置的移到注解類本身。
注釋注入執(zhí)行XML注入之前,因此后者配置將會覆蓋前者屬性連接通過這兩種方法。
默認(rèn)情況下,spring容器沒有打開自動注解功能。所以在使用具有spring注解之前,我們需要在我們的Spring配置文件啟用它。如果你想在Spring應(yīng)用程序中使用的自動注解,考慮配置文件上加上下面的配置。
???一旦配置了,表明在Spring中您可以開始使用屬性,方法和構(gòu)造函數(shù)的自動注入。
一些重要的注解:
@required: @ required注解適用于bean屬性setter方法。
@autowired: @ autowired注解可以適用于bean屬性setter方法,non-setter方法、構(gòu)造函數(shù)和屬性。
@qualifier: @ qualifier注解加上@ autowired可以用來消除多個bean混亂來保證唯一的bean注入。
jsr - 250注釋:Spring支持基于jsr - 250的注解如@Resource、@PostConstruct和@PreDestroy。
10 請解釋一下Spring Bean的生命周期?
一個Spring bean的生命周期很容易理解。當(dāng)一個bean實例化時可能需要執(zhí)行一些初始化動作進(jìn)入使bean達(dá)到一個可用的狀態(tài)。同樣,當(dāng)不再需要bean時,將bean從容器中移除,可能需要銷毀。
Spring beanFactory通過Spring容器負(fù)責(zé)管理bean的生命周期。bean的生命周期包括可以大體分類為兩類的回調(diào)方法
初始化后的回調(diào)方法
銷毀前的回調(diào)方法
Spring框架提供了以下四種方法控制bean的生命周期事件:
InitializingBean和DisposableBean回調(diào)接口
其他知道接口為特定的行為
定制的init()和destroy()方法在bean配置文件
@PostConstruct和@PreDestroy注解
例如, customInit()和 customDestroy()方法生命周期方法的例子。
11 Spring Bean的作用域scope有哪些?
spring容器中的bean有5中scope,分別是:
單例singleton:默認(rèn)情況下都是單例的,它要求在每個spring 容器內(nèi)不論你請求多少次這個實例,都只有一個實例。單例特性是由beanfactory本身維護(hù)的。
原型prototype:這個bean的實例和單例相反,一個新的請求產(chǎn)生一個新的bean實例。
請求request:在一個請求內(nèi),將會為每個web請求的客戶端創(chuàng)建一個新的bean實例。一旦請求完成后,bean將失效,然后被垃圾收集器回收掉。
會話session:就像請求范圍,這樣可以確保每個用戶會話bean的一個實例。當(dāng)用戶結(jié)束其會話,bean失效。
全局會話global-session:應(yīng)用到Portlet應(yīng)用程序。基于Servlet的應(yīng)用程序和會話相同。
12 spring的內(nèi)部Bean是什么?
在Spring框架中,當(dāng)一個bean只用于一個特定屬性,建議將它聲明為一個內(nèi)在的bean。內(nèi)部bean同時支持setter注入屬性和構(gòu)造函數(shù)注入“constructor-arg”。
例如,假設(shè)一個Customer類的引用Person類。在我們的應(yīng)用程序中,我們將只創(chuàng)建一個Person類的實例,并在Customer使用它。
public class Customer{ private Person person; //Setters and Getters}public class Person{ private String name; private String address; private int age; //Setters and Getters}現(xiàn)在內(nèi)部bean聲明是這樣的:
13 在Spring框架中,單例bean是線程安全的嗎?
Spring框架不對單例的bean做任何多線程的處理。單例的bean的并發(fā)問題和線程安全是開發(fā)人員的責(zé)任。
而實際上,大多數(shù)spring bean沒有可變狀態(tài)(例如服務(wù)和DAO的類),這樣的話本身是線程安全的。但如果您的bean有可變狀態(tài)(例如視圖模型對象),這就需要你來確保線程安全。
這個問題最簡單和明顯的解決方案是改變bean Scope,可變的bean從“單例”到“原型”。
14 如何在Spring里注入Java集合?請給個例子好嗎?
Spring提供了四種類型的配置元素集合,如下:
:幫助注入一組值,允許重復(fù)。
:幫助注入一組值,不允許重復(fù)。
< map>:幫助注入一個K-V的集合,名稱和值可以是任何類型的。
:幫助注入一個名稱-值對集合,名稱和值都是字符串。
讓我們看看每種類型的例子。
INDIAPakistanUSAUKINDIAPakistanUSAUKadmin@nospam.comsupport@nospam.com15 如何將一個java.util.屬性注入到Spring Bean ?
第一個方法是使用標(biāo)記如下。
admin@nospam.comsupport@nospam.com也可以使用“util:“名稱空間創(chuàng)建bean的屬性文件,并使用bean的setter方法注入。
16 解釋一下Spring Bean的自動注入是怎么樣的?
在spring框架中,在配置文件中設(shè)置bean的依賴是一個很好的辦法,但spring容器也能夠自動注入不同bean之間的關(guān)系。這意味著,通過檢查BeanFactory的內(nèi)容它可以為您的bean自動注入其他bean。
可以為每個bean指定是否自動注入,因此可以支持一些Bean支持自動注入,而一些bean不會自動注入。
下面從XML配置文件摘錄了自動根據(jù)名稱注入的bean。
除了提供的自動裝配模式bean配置文件,也可以在bean類中指定自動裝配使用 @Autowired注釋。
注意:在bean類使用@Autowired注解,您必須在spring應(yīng)用程序中先啟用下面的注解。
也可以通過在配置文件使用AutowiredAnnotationBeanPostProcessorbean來完成。
現(xiàn)在,當(dāng)注釋配置已經(jīng)啟用,您可以自由使用@Autowired來自動注入bean依賴關(guān)系,以你喜歡的方式。
@Autowiredpublic EmployeeDAOImpl ( EmployeeManager manager ) { this.manager = manager;}17 請解釋一下不同的bean自動注入模式?
在Spring有五個自動注入模式。讓我們逐個討論。
no:默認(rèn)情況下,spring框架的自動注入選項,即默認(rèn)情況不開啟自動注入。這意味著你必須使用標(biāo)簽在bean定義中顯式地設(shè)置依賴項。
byName:這個選項使基于bean的名稱的依賴項注入。當(dāng)自動裝配在bean屬性,用屬性名搜索匹配的bean定義配置文件。如果找到這樣的bean,注入屬性。如果沒有找到這樣的bean,就會產(chǎn)生一個錯誤。
byType:該選項允許基于bean的類型的依賴項注入。當(dāng)在bean屬性需要自動注入時,使用屬性類的類型來搜索匹配的bean定義配置文件。如果找到這樣的bean,注入屬性。如果沒有找到這樣的bean,就會產(chǎn)生一個錯誤。
constructor:構(gòu)造方法類似于byType自動注入,但適用于構(gòu)造方法的參數(shù)。在自動注入bean時,它在所有構(gòu)造函數(shù)參數(shù)類型中尋找匹配的構(gòu)造函數(shù)的類類型參數(shù),然后進(jìn)行自動注入,。請注意,如果在容器中沒有一個bean構(gòu)造函數(shù)參數(shù)類型滿足,會拋出一個致命錯誤。
autodetect:自動偵測使用兩種模式即構(gòu)造函數(shù)或byType模式的自動注入。首先它將試圖尋找有效的構(gòu)造方法參數(shù),如果發(fā)現(xiàn)構(gòu)造方法模式則選擇。如果沒有構(gòu)造方法中定義bean,或者明確的默認(rèn)無參構(gòu)造方法,則選擇byType模式自動注入。
18 怎么打開基于注釋的自動注入的?
要啟用@Autowired,你必須注冊AutowiredAnnotationBeanPostProcessor,你可以用兩種方式。
1. 在bean配置文件使用。
2. 直接將AutowiredAnnotationBeanPostProcessor放到bean配置文件。
19 能否用例子解釋一下@ required注解嗎?
在大規(guī)模的應(yīng)用程序中,IoC容器中可能會有成百上千的bean聲明,以及它們之間的依賴關(guān)系通常是非常復(fù)雜的。
setter注入的缺點之一是,很難給你檢查出所需的所有屬性是否已經(jīng)注入。
為了克服這個問題,您可以設(shè)置bean的“dependency-check”屬性,可以設(shè)置四個屬性的其中之一即 none, simple, objects or all (沒有一個是默認(rèn)選項)。
在現(xiàn)實生活中應(yīng)用程序中,您將不會感興趣檢查所有上下文中的bean屬性配置文件。而你想要檢查一些特定的bean是否已設(shè)置特定的屬性。在這種情況下,Spring的依賴項檢查功能將不再適用。
為了解決這個問題,您可以使用@Required注解。在bean屬性使用@Required注解的setter方法類文件如下:
public class EmployeeFactoryBean extends AbstractFactoryBean{ private String designation; public String getDesignation() { return designation; } @Required public void setDesignation(String designation) { this.designation = designation; } //more code here}RequiredAnnotationBeanPostProcessor是一個spring bean后置處理程序,檢查@Required注解的所有的bean屬性是否已設(shè)置。使用這個bean屬性檢查后置處理程序,您必須注冊在Spring IoC容器中。
如果@Required注解的任何屬性沒有設(shè)置,這個bean的處理器會拋出一個BeanInitializationException異常。
20 能否用例子解釋一下@ autowired注解嗎?
@Autowired注解提供了更細(xì)粒度的控制,以及應(yīng)該如何完成自動注入。@Autowired注解和@Required注解一樣,可用于bean的自動注入,它可以作用于構(gòu)造方法,屬性或具有任意名稱和/或多個參數(shù)的方法。
例如,您可以使用@Autowired注解的setter方法來代替在XML配置文件中的元素。當(dāng)Spring找到一個@Autowired注解的方法,它嘗試使用byType自動注入的方法。
您可以將@Autowired應(yīng)用到構(gòu)造方法。一個構(gòu)造方法使用@Autowired注解表明,即使在XML文件沒有配置bean的元素,當(dāng)創(chuàng)建bean時,構(gòu)造方法也會自動注入。
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ù)的配置。
21 能否用例子講解一下@qualifier注解嗎?
@Qualifier限定哪個bean應(yīng)該被自動注入。當(dāng)Spring無法判斷出哪個bean應(yīng)該被注入時,@Qualifier注解有助于消除歧義bean的自動注入。
參見下面的例子,
public class Customer{ @Autowired private Person person;}我們有兩個bean定義為Person類的實例。
Spring 知道哪個bean應(yīng)該自動注入?不。當(dāng)您運行上面的例子時,拋出如下異常:
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 哪個bean應(yīng)該被autowired的。
public class Customer{ @Autowired @Qualifier("personA") private Person person;}22 構(gòu)造方法注入和setter注入之間的區(qū)別嗎?
有以下幾點明顯的差異:
在Setter注入,可以將依賴項部分注入,構(gòu)造方法注入不能部分注入,因為調(diào)用構(gòu)造方法如果傳入所有的參數(shù)就會報錯。
如果我們?yōu)橥粚傩蕴峁㏒etter和構(gòu)造方法注入,Setter注入將覆蓋構(gòu)造方法注入。但是構(gòu)造方法注入不能覆蓋setter注入值。顯然,構(gòu)造方法注入被稱為創(chuàng)建實例的第一選項。
使用setter注入你不能保證所有的依賴都被注入,這意味著你可以有一個對象依賴沒有被注入。在另一方面構(gòu)造方法注入直到你所有的依賴都注入后才開始創(chuàng)建實例。
在構(gòu)造函數(shù)注入,如果A和B對象相互依賴:A依賴于B,B也依賴于A,此時在創(chuàng)建對象的A或者B時,Spring拋出ObjectCurrentlyInCreationException。所以Spring可以通過setter注入,從而解決循環(huán)依賴的問題。
23 spring框架的事件類型有哪些?
Spring的ApplicationContext具有代碼層上支持事件和監(jiān)聽器的功能。我們可以創(chuàng)建bean監(jiān)聽通過ApplicationContext發(fā)布的事件。ApplicationContext里的事件處理通過提供ApplicationEvent類和ApplicationListener接口來完成。所以如果一個bean實現(xiàn)了ApplicationListener接口,當(dāng)一個ApplicationEvent發(fā)布到ApplicationContext時,該bean將接到通知。
public class AllApplicationEventListener implements ApplicationListener < ApplicationEvent >{ @Override public void onApplicationEvent(ApplicationEvent applicationEvent){ //process event }}Spring提供了以下5標(biāo)準(zhǔn)事件:
ContextRefreshedEvent:當(dāng)ApplicationContext初始化或刷新時發(fā)布這個事件。這個事件也可以通過ConfigurableApplicationContext接口的refresh()方法來觸發(fā)。
ContextStartedEvent:當(dāng)ApplicationContext被ConfigurableApplicationContext接口的start()方法啟動時發(fā)布這個事件。你可以在收到這一事件后查詢你的數(shù)據(jù)庫或重啟/啟動任何停止的應(yīng)用程序。
ContextStoppedEvent:當(dāng)ApplicationContext被ConfigurableApplicationContext接口的stop()方法關(guān)閉時發(fā)布這個事件。你可以在收到這一事件后做一些清理工作。
ContextClosedEvent:當(dāng)ApplicationContext時被ConfigurableApplicationContext接口的close()方法關(guān)閉時發(fā)布這個事件。一個終結(jié)的上下文達(dá)到生命周期結(jié)束;它不能刷新或重啟。
RequestHandledEvent:這是一個網(wǎng)絡(luò)自身的事件,告訴所有bean:HTTP請求服務(wù)已經(jīng)處理完成。
除了上面的事件,您可以通過擴(kuò)展ApplicationEvent類創(chuàng)建自定義事件。如:
public class CustomApplicationEvent extends ApplicationEvent{ public CustomApplicationEvent ( Object source, final String msg ){ super(source); System.out.println("Created a Custom event"); }}監(jiān)聽這個事件,創(chuàng)建一個監(jiān)聽器是這樣的:
public class CustomEventListener implements ApplicationListener < CustomApplicationEvent >{ @Override public void onApplicationEvent(CustomApplicationEvent applicationEvent) { //handle event }}發(fā)布這個事件:
CustomApplicationEvent customEvent = new CustomApplicationEvent( applicationContext, "Test message" );applicationContext.publishEvent ( customEvent );24 FileSystemResource和ClassPathResource之間的區(qū)別嗎?
在FileSystemResource中你需要給出spring-config.xml(Spring配置)文件相對于您的項目的相對路徑或文件的絕對位置。
在ClassPathResource中Sping查找文件使用ClassPath,因此spring-config.xml應(yīng)該包含在類路徑下。
一句話,ClassPathResource在類路徑下搜索和FileSystemResource在文件系統(tǒng)下搜索。
25 列舉一下Spring框架使用的一些設(shè)計模式?
有很多不同的設(shè)計模式,但有一些明顯的:
代理——在AOP大量使用,還有遠(yuǎn)程模塊。
單例——spring配置文件中定義的bean默認(rèn)是單例的。
模板方法——廣泛使用處理重復(fù)邏輯的代碼。例如RestTemplate, JmsTemplate, JpaTemplate.
前端控制器——Spring提供了DispatcherServlet,確保傳入請求被分派到你的控制器。
視圖助手——Spring有許多定制JSP標(biāo)記,和velocity宏,協(xié)助在視圖層分離展示代碼。
依賴注入——BeanFactory / ApplicationContext的核心概念。
工廠模式——BeanFactory創(chuàng)建一個對象的實例。
參考文獻(xiàn):https://howtodoinjava.com/interview-questions/top-spring-interview-questions-with-answers關(guān)于Spring 常見面試題,你了解了多少?歡迎在關(guān)注評論!
總結(jié)
以上是生活随笔為你收集整理的加上项目路径 spring security忽略不生效_Spring 常见面试题「收藏」的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux sqlserver_SQL
- 下一篇: gradle idea java ssm