面試題——SSM面試題

 
樹木叢生紅火火
微信公衆號:Java全棧開發大聯盟
原文地址:https://note.youdao.com/ynoteshare1/index.html?id=3f81baea7217dc78829ae49050f1b4cf&type=note
 
1.什麼是Spring框架?
spring是爲java應用程序開發提供基礎性服務的一套框架,其目的是用於簡化企業級應用程序開發,它使得程序員只須要關心業務需求。常見的配置方式有三種:基於XML的配置、基於註解的配置、基於Java的配置。
主要有如下幾個模塊組成:
Spring Core:核心類庫,提供IOC服務;
Spring Context:提供框架式的Bean訪問方式(可使用配置文件)以及企業級功能(JNDI,定時任務等);
Spring AOP:AOP服務;
Spring DAO:對JDBC抽象,簡化了數據訪問異常處理;
Spring ORM:提供對現有ORM框架的支持;
Spring Web:提供了基本的面向Web的綜合特性,例如多方文件上傳;
Spring MVC:提供了面向Web應用的Model-View-Controller實現。
 
2. Spring的優勢?
1)低侵入式設計,代碼污染極低;
2)IOC將對象之間的依賴關係交由框架處理,下降組件的耦合性;
3)AOP支持容許將一些通用任務如安全、事務、日誌等進行集中式管理,從而提供了更好的複用;
4)對主流的框架提供了很好的集成支持。
 
3. 什麼是DI或者IOC?請解釋下Spring IOC。
IOC:即「控制反轉」,是一種設計思想,是指建立對象的控制權的轉移,之前建立對象的主動權和建立時機是由本身把控的,而如今這種權力轉移到容器,對象與對象之間鬆散耦合,也利於功能複用,更重要的是使得程序的整個體系結構變得很是靈活。DI(依賴注入)和控制反轉是同一個概念的不一樣角度描述,所謂依賴注入就是應用程序依賴於IoC容器,在運行時須要IoC容器來動態提供對象須要的外部資源。
Java中依賴注入有如下三種實現方式:構造器注入、Setter方法注入、接口注入。
 
四、BeanFactory和ApplicationContext有什麼區別?
BeanFactory 能夠理解爲含有bean集合的工廠類。BeanFactory 包含了種bean的定義,以便在接收到客戶端請求時將對應的bean實例化。BeanFactory還能在實例化對象時生成協做類之間的關係。此舉將bean自身與bean客戶端的配置中解放出來。BeanFactory還包含了bean生命週期的控制,調用客戶端的初始化方法和銷燬方法。
從表面上看,application context如同bean factory同樣具備bean定義、bean關聯關係的設置,根據請求分發bean的功能。但application context在此基礎上還提供了其餘的功能。
A.提供了支持國際化的文本消息;
B.統一的資源文件讀取方式;
C.已在監聽器中註冊的bean的事件。
如下是三種較常見的 ApplicationContext 實現方式:
一、ClassPathXmlApplicationContext:從classpath的XML配置文件中讀取上下文,並生成上下文定義。應用程序上下文從程序環境變量中取得。 
ApplicationContext context = new ClassPathXmlApplicationContext(「bean.xml」);
二、FileSystemXmlApplicationContext :由文件系統中的XML配置文件讀取上下文,須要指定完整路徑。
ApplicationContext context = new FileSystemXmlApplicationContext(「bean.xml」);
三、XmlWebApplicationContext:由Web應用的XML文件讀取上下文,在web.xml中配置。
 
5. Spring AOP
OOP引入封裝、繼承、多態等概念來創建一種對象層次結構,OOP容許開發者定義縱向的關係,但並不適合定義橫向的關係,例如日誌功能。日誌代碼每每橫向地散佈在全部對象層次中,而與它對應的對象的核心功能毫無關係對於其餘類型的代碼,如安全性、異常處理和透明的持續性也都是如此,這種散佈在各處的無關的代碼被稱爲橫切(cross cutting),在OOP設計中,它致使了大量代碼的重複,而不利於各個模塊的重用。
AOP技術偏偏相反,它利用一種稱爲"橫切"的技術,將那些影響了多個類的公共行爲封裝到一個可重用模塊,並將其命名爲"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻爲業務模塊所共同調用的邏輯或責任封裝起來,便於減小系統的重複代碼,下降模塊之間的耦合度,並有利於將來的可操做性和可維護性。
使用"橫切"技術,AOP把軟件系統分爲兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特色是,他們常常發生在覈心關注點的多處,而各處基本類似,好比權限認證、日誌、事務。AOP的做用在於分離系統中的各類關注點,將核心關注點和橫切關注點分離開來
 
6. spring bean的生命週期
1) 實例化Bean
對於BeanFactory容器,當客戶向容器請求一個還沒有初始化的bean時,或初始化bean的時候須要注入另外一個還沒有初始化的依賴時,容器就會調用createBean進行實例化。對於ApplicationContext容器,當容器啓動結束後,便實例化全部的bean。容器經過獲取BeanDefinition對象中的信息進行實例化。而且這一步僅僅是簡單的實例化,並未進行依賴注入。實例化對象被包裝在BeanWrapper對象中,BeanWrapper提供了設置對象屬性的接口,從而避免了使用反射機制設置屬性。
2)設置對象屬性(依賴注入)
實例化後的對象被封裝在BeanWrapper對象中,而且此時對象仍然是一個原生的狀態,並無進行依賴注入。 緊接着,Spring根據BeanDefinition中的信息進行依賴注入。 而且經過BeanWrapper提供的設置屬性的接口完成依賴注入。
3) 處理Aware接口
緊接着,Spring會檢測該對象是否實現了xxxAware接口,並將相關的xxxAware實例注入給bean。
3.1)若是這個Bean實現了BeanNameAware接口,會調用它實現的 (String beanId)方法,此處傳遞的是Spring配置文件中Bean的ID。
3.2)若是這個Bean實現了BeanFactoryAware接口,會調用它實現的setBeanFactory(),傳遞的是Spring工廠自己。
3.3)若是這個Bean實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文。
4)BeanPostProcessor
當通過上述幾個步驟後,bean對象已經被正確構造,但若是你想要對象被使用前再進行一些自定義的處理,就能夠經過BeanPostProcessor接口實現。
5)InitializingBean與init-method
在Bean的所有屬性設置成功後執行的初始化方法,這一階段也能夠在bean正式構造完成前增長咱們自定義的邏輯,但它與前置處理不一樣,因爲該函數並不會把當前bean對象傳進來,所以在這一步沒辦法處理對象自己,只能增長一些額外的邏輯。若要使用它,咱們須要讓bean實現該接口,並把要增長的邏輯寫在該函數中。而後Spring會在前置處理完成後檢測當前bean是否實現了該接口,並執行afterPropertiesSet函數。
6)DisposableBean和destroy-method
和init-method同樣,經過給destroy-method指定函數,就能夠在bean銷燬前執行指定的邏輯。
 
 
7. Spring Bean的做用域之間有什麼區別?
1)singleton:默認,每一個容器中只有一個bean的實例
2)prototype:爲每個bean請求提供一個實例
3)request:爲每個網絡請求建立一個實例
4)session:與request範圍相似,確保每一個session中有一個bean的實例,在session過時後,bean會隨之失效。
5) global-session:global-session和Portlet應用相關
 
8.Spring框架中的單例Beans是線程安全的麼?
Spring框架並無對單例bean進行任何多線程的封裝處理。關於單例bean的線程安全和併發問題須要開發者自行去搞定。但實際上,大部分的Spring bean並無可變的狀態(好比Service類和DAO類),因此在某種程度上說Spring的單例bean是線程安全的。若是你的bean有多種狀態的話(好比 View Model 對象),就須要自行保證線程安全。最淺顯的解決辦法就是將多態bean的做用域由「singleton」變動爲「prototype」.
9. spring的自動裝配?
自動裝配:在spring中,對象無需本身查找或建立與其關聯的其餘對象,容器負責把須要相互協做的對象引用賦予各個對象,使用autowire來配置自動裝載模式。
xml中5種自動裝配模式,基於配置的方式。
1)no:默認的方式是不進行自動裝配,經過手工設置ref 屬性來進行裝配bean。
2)byName:經過參數名自動裝配,若是一個bean的name 和另一個bean的 property 相同,就自動裝配。
3)byType:經過參數的數據類型自動自動裝配。
4)construct:構造函數進行裝配,而且構造函數的參數經過byType進行裝配。
5)autodetect :若是有構造方法,經過 construct的方式自動裝配,不然使用 byType的方式自動裝配。
基於註解的方式自動裝配:
除了bean配置文件中提供的自動裝配模式,還可使用@Autowired註解來自動裝配指定的bean。在使用@Autowired註解以前須要在按照以下的配置方式在Spring配置文件進行配置纔可使用<context:annotation-config />。在啓動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor後置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查找須要的bean,並裝配給該對象的屬性。
在使用@Autowired時,首先在容器中查詢對應類型的bean,     若是查詢結果恰好爲一個,就將該bean裝配給@Autowired指定的數據;     若是查詢的結果不止一個,那麼@Autowired會根據名稱來查找;     若是上述查找的結果爲空,那麼會拋出異常。解決方法時,使用required=false。
 
當出現裝配歧義性(即一個接口出多個實現類),解決方法:
1)首先加上註解@Qualifier用來注入指定名字的實例(經過在實現接口的類上經過value屬性去命名不一樣的名稱,對於@Repository、@Service 和 @Controller 和 @Component四個註解都有相似value屬性能夠設置)。
2)由於一個接口存在兩個以上的實現類,也能夠經過標識首選哪一個bean,來解決歧義性問題。
@Component @Primary public class UserServiceImpl implements IUserService{}
@Autowired可用於:構造函數、成員變量、Setter方法
注:@Autowired和@Resource之間的區別
(1)、@Autowired默認是按照類型裝配注入的,默認狀況下它要求依賴對象必須存在(能夠設置它required屬性爲false)。
(2)、@Resource默認是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean纔會按照類型來裝配注入。
@Autowired通常會和組件掃描搭配實現自動配置
組件掃描須要配置<context:component-scan base-package="cn.itcast" />(包含了<context:annotation-config />),以後spring就會自動尋找@Component、@Service、@Controller、@Repository註解的類,並把這些類放入Spring容器管理
 
10. Spring框架中有哪些不一樣類型的事件?
Spring 提供瞭如下5種標準的事件:
1)上下文更新事件(ContextRefreshedEvent):在調用ConfigurableApplicationContext 接口中的refresh()方法時被觸發。
2)上下文開始事件(ContextStartedEvent):當容器調用ConfigurableApplicationContext的Start()方法開始/從新開始容器時觸發該事件。
3)上下文中止事件(ContextStoppedEvent):當容器調用ConfigurableApplicationContext的Stop()方法中止容器時觸發該事件。
4)上下文關閉事件(ContextClosedEvent):當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的全部單例Bean都被銷燬。
5)請求處理事件(RequestHandledEvent):在Web應用中,當一個http請求(request)結束觸發該事件。
若是一個bean實現了ApplicationListener接口,當一個ApplicationEvent 被髮布之後,bean會自動被通知。
 
11 .spring的設計模式?
1)工廠模式,BeanFactory用來建立對象的實例。
2) 代理模式,在Aop實現中用到了JDK的動態代理。
3) 單例模式,這個好比在建立bean的時候。
4) 模板方法,用來解決代碼重複的問題。好比. RestTemplate, JmsTemplate, JpaTemplate。
 
12. spring中的BeanFactory與ApplicationContext的做用有哪些?
1. BeanFactory負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關係
2. ApplicationContext除了提供上述BeanFactory所能提供的功能以外,還提供了更完整的框架功能:
a. 國際化支持
b. 資源訪問:Resource rs = ctx. getResource(」classpath:config.properties」), 「file:c:/config.properties」
c. 事件傳遞:經過實現ApplicationContextAware接口
 
SpringMVC
1.SpringMVC的工做流程?
一、用戶發送請求至前端控制器DispatcherServlet;
二、DispatcherServlet收到請求調用HandlerMapping處理器映射器;
三、處理器映射器找到具體的處理器,生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet;
四、DispatcherServlet調用HandlerAdapter處理器適配器;
五、HandlerAdapter通過適配調用具體的處理器(Controller,也叫後端控制器);
六、Controller執行完成返回ModelAndView;
七、HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet;
八、DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器;
九、ViewReslover解析後返回具體View;
十、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中);
十一、DispatcherServlet響應用戶。
 
2. SpringMVC經常使用的註解有哪些?
@RequestMapping:用於請求url映射。
@RequestBody:註解實現接收http請求的json數據,將json轉換爲java對象。
@ResponseBody:註解實現將conreoller方法返回對象轉化爲json對象響應給客戶。
 
3. 如何解決get和post亂碼問題?
解決post請求亂碼:咱們能夠在web.xml裏邊配置一個CharacterEncodingFilter 過濾器。設置爲utf-8。
解決get請求亂碼有兩種方法個:
1)修改tomcat配置文件添加編碼和工程編碼一致;
2) 另外一種方法對參數進行從新編碼;
String username = new String(Request.getParameter("userName").getBytes("ISO8859-1"),"utf-8")。
 
4. springmvc的優勢?
1)能夠支持各類視圖技術,而不只僅侷限於JSP;
2)與Spring框架集成(如IoC容器、AOP等);
3) 清晰的角色分配:前端控制器(dispatcherServlet) , 請求處處理器映射(handlerMapping), 處理器適配器(HandlerAdapter), 視圖解析器(ViewResolver)。
 
5. 什麼是springmvc?
SpringMVC是一種基於Java的實現了MVC設計模式的請求驅動類型的輕量級Web框架,即便用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型。MVC: Model View Controller 模型-視圖-控制器 。
視圖:展現給用戶的視圖;
模型:表示數據和業務處理規則。模型返回的數據是獨立的,這樣的一個模式可以爲多個視圖提供數據,這樣一來模型的代碼只須要寫一次便可以被多個視圖重用,減小了代碼的重複性;
控制器:接受用戶的輸入並調用相應的模型和視圖來完成用戶的需求。
 
6.SpringMVC怎麼樣設定重定向和轉發的?
在返回值前面加"forward:"就可讓結果轉發,譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可讓返回值重定向,譬如"redirect:http://www.baidu.com"。
 
七、Spring MVC的主要組件?
(1)前端控制器 DispatcherServlet(不須要程序員開發)
做用:接收請求、響應結果 至關於轉發器,有了DispatcherServlet 就減小了其它組件之間的耦合度。
(2)處理器映射器HandlerMapping(不須要程序員開發)
做用:根據請求的URL來查找Handler
(3)處理器適配器HandlerAdapter
注意:在編寫Handler的時候要按照HandlerAdapter要求的規則去編寫,這樣適配器HandlerAdapter才能夠正確的去執行Handler。
(4)處理器Handler(須要程序員開發)
(5)視圖解析器 ViewResolver(不須要程序員開發)
做用:進行視圖的解析 根據視圖邏輯名解析成真正的視圖(view)
(6)視圖View(須要程序員開發jsp)
View是一個接口, 它的實現類支持不一樣的視圖類型(jsp,freemarker,pdf等等)
八、Spring MVC的異常處理 ?
答:能夠將異常拋給Spring框架,由Spring框架來處理;咱們只須要配置簡單的異常處理器,在異常處理器中添視圖頁面便可。
九、SpringMvc的控制器是否是單例模式,若是是,有什麼問題,怎麼解決?
答:是單例模式,因此在多線程訪問的時候有線程安全問題,不要用同步,會影響性能的,解決方案是在控制器裏面不能寫字段。
十、SpingMvc中的控制器的註解通常用那個,有沒有別的註解能夠替代?
答:通常用@Conntroller註解,表示是表現層,不能用別的註解代替。
十一、 @RequestMapping註解用在類上面有什麼做用?
答:是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的全部響應請求的方法都是以該地址做爲父路徑。
十二、若是在攔截請求中,我想攔截get方式提交的方法,怎麼配置?
答:能夠在@RequestMapping註解裏面加上method=RequestMethod.GET。
1三、若是前臺有不少個參數傳入,而且這些參數都是一個對象的,那麼怎麼樣快速獲得這個對象?
答:直接在方法中聲明這個對象,SpringMvc就自動會把屬性賦值到這個對象裏面。
1四、SpringMvc中函數的返回值是什麼?
答:返回值能夠有不少類型,有String, ModelAndView,但通常用String比較好。
1五、SpringMvc用什麼對象從後臺向前臺傳遞數據的?
答:經過ModelMap對象,能夠在這個對象裏面用put方法,把對象加到裏面,前臺就能夠經過el表達式拿到。
 
1六、註解原理
註解本質是一個繼承了Annotation的特殊接口,其具體實現類是Java運行時生成的動態代理類。而咱們經過反射獲取註解時,返回的是Java運行時生成的動態代理對象。經過代理對象調用自定義註解的方法,會最終調用AnnotationInvocationHandler的invoke方法。該方法會從memberValues這個Map中索引出對應的值。而memberValues的來源是Java常量池。
相關文章
相關標籤/搜索