java框架-spring面試題 丨【奔跑吧!JAVA】(java spring框架面試題)
Spring概述
什么是Spring?
Spring是一個輕量級Java開發框架,最早有Rod Johnson創建,目的是為了解決企業級應用開發的業務邏輯層和其他各層的耦合問題。它是一個分層的JavaSE/JavaEE full-stack (一站式)輕量級開源框架,為開發Java應用程序提供全面的基礎架構支持。Spring負責基礎架構,因此Java開發者可以專注于應用程序的開發。
Spring最根本的使命是解決企業級應用開發的復雜性,即簡化Java開發。
Spring可以做很多事情,它為企業級開發提供給了豐富的功能,但是這些功能的底層都依賴于它的兩個核心特性,也就是依賴注入(dependency injection,DlI)*和*面向切面編程(aspect-orientedprogramming,AOP)。
為了降低Java開發的復雜性,Spring采取了以下4種關鍵策略·
基于POJO的輕量級和最小侵入性編程;
通過依賴注入和面向接口實現松耦合;
基于切面和慣例進行聲明式編程;
通過切面和模板減少樣板式代碼。
Spring框架的設計目標,設計理念,和核心是什么?
Spring設計目標: Spring為開發者提供一個一站式輕量級應用開發平臺;
Spring設計理念:在JavaEE開發中,支持POJO和JavaBean開發方式,使應用面向接口開發,充分支持00(面向對象)設計方法;Spring通過loC容器實現對象耦合關系的管理,并實現依賴反轉,將對象之間的依賴關系交給loC容器,實現解耦;
Spring框架的核心: loC容器和AOP模塊。通過loC容器管理POJO對象以及他們之間的耦合關系;通過AOP以動態非侵入的方式增強服務。
Spring的主要核心是:
(1)控制反轉(OC):傳統的java 開發模式中,當需要一個對象時,我們會自己使用new或者getInstance等直接或者間接調用構造方法創建一個對象,而在Spring 開發模式中,Spring容器使用了工廠模式為我們創建了所需要的對象,我們使用時不需要自己去創建,直接調用Spring為我們提供的對象即可,這就是控制反轉的思想。實例化一個java對象有三種方式:使用類構造器,使用靜態工廠方法,使用實例工廠方法,當使用spring時我們就不需要關心通過何種方式實例化一個對象, spring通過控制反轉機制自動為我們實例化一個對象。(底層原理是反射)
(2)依賴注入(DI): Spring使用Java Bean對象的Set 方法或者帶參數的構造方法為我們在創建所需對象時將其屬性自動設置所需要的值的過程就是依賴注入的基本思想。
(3)面向切面編程(AOP):在面向對象編程(OOP)思想中,我們將事物縱向抽象成一個個的對象。而在面向切面編程中,我們將一個個對象某些類似的方面橫向抽象成一個切面,對這個切面進行一些如權限驗證,事物管理記錄日志等公用操作處理的過程就是面向切面編程的思想。(底層原理是動態代理)
IoC 和 DI 的區別
IoC 控制反轉,指將對象的創建權,反轉到 Spring 容器 , DI 依賴注入,指 Spring 創建對象的過程中,將對象
依賴屬性通過配置進行注入
spring 支持構造器注入和 setter 方法注入構造器注入,通過
在 Spring 中,所有管理的對象都是 JavaBean 對象,而 BeanFactory 和 ApplicationContext 就是 spring 框架的兩個 IOC 容器,現在一般使用 ApplicationContext,其不但包含了 BeanFactory 的作用,同時還進行更多的擴展。
Spring Bean 生命周期
1.Spring 容器 從 XML 文件中讀取 Bean 的定義,并實例化 Bean。
2.Spring 根據 Bean 的定義填充所有的屬性。
3.如果 Bean 實現了 BeanNameAware 接口,Spring 傳遞 bean 的 ID 到 setBeanName 方法。
4.如果 Bean 實現了 BeanFactoryAware 接口, Spring 傳遞 beanfactory 給 setBeanFactory 方法。
5.如果有任何與 bean 相關聯的 BeanPostProcessors,Spring 會在 postProcesserBeforeInitialization()方法內調用
它們。
6.如果 bean 實現 IntializingBean 了,調用它的 afterPropertySet 方法,如果 bean 聲明了初始化方法,調用此初始化方法。
7.如果有 BeanPostProcessors 和 bean 關聯,這些 bean 的 postProcessAfterInitialization() 方法將被調用。
8.如果 bean 實現了 DisposableBean,它將調用 destroy()方法。
注意:
有兩個重要的 bean 生命周期方法,第一個是 setup() , 它是在容器加載 bean 的時候被調用。第二個方法是 teardown() 它是在容器卸載類的時候被調用。 The bean 標簽有兩個重要的屬性 init-method 和 destroy-method。使用它們你可以自己定制初始化和注銷方法。它們也有相應的注解@PostConstruct 和@PreDestroy。
springbean 的作用域
四種,singleton(默認值),prototype,request,session
SpringMVC
1. SpringMVC 的工作原理
a. 用戶向服務器發送請求,請求被 springMVC 前端控制器 DispatchServlet 捕獲;
b. DispatcherServle 對請求 URL 進行解析,得到請求資源標識符(URL),然后根據該 URL 調用 HandlerMapping
將請求映射到處理器 HandlerExcutionChain;
c. DispatchServlet 根據獲得 Handler 選擇一個合適的 HandlerAdapter 適配器處理;
d. Handler 對數據處理完成以后將返回一個 ModelAndView()對象給 DisPatchServlet;
e. Handler 返回的 ModelAndView()只是一個邏輯視圖并不是一個正式的視圖,DispatcherSevlet 通過 ViewResolver 試圖解析器將邏輯視圖轉化為真正的視圖 View;
h. DispatcherServle 通過 model 解析出 ModelAndView()中的參數進行解析最終展現出完整的 view 并返回給 客戶端
SpringMVC 常用注解都有哪些?
@requestMapping 用于請求 url 映射。
@RequestBody 注解實現接收 http 請求的 json 數據,將 json 數據轉換為 java 對象。
@ResponseBody 注解實現將 controller 方法返回對象轉化為 json 響應給客戶。
Spring 中的設計模式
1.代理模式—Spring 中兩種代理方式,若目標對象實現了若干接口,spring 使用 JDK 的 java.lang.reflect.Proxy 類代理,若目標對象沒有實現任何接口,spring 使用 CGLIB 庫生成目標對象的子類。Spring的AOP功能用到了JDK的動態代理和CGLIB字節碼生成技術。
2.單例模式—在 spring 配置文件中定義的 bean 默認為單例模式。
3.模板方法模式—用來解決代碼重復的問題。
比如: RestTemplate, JmsTemplate, JpaTemplate,redistemplate。
4.前端控制器模式—Srping 提供了 DispatcherServlet 來對請求進行分發。
5.視圖幫助(View Helper )—Spring 提供了一系列的 JSP 標簽,高效宏來輔助將分散的代碼整合在視圖里。
6.依賴注入—貫穿于 BeanFactory/ApplicationContext 接口的核心理念。
7.工廠模式—在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,并且是通過使用一個共同的接口 來指向新創建的對象。Spring 中使用 BeanFactory 用來創建對象的實例。BeanFactory就是簡單工廠模式的體現,用來創建對象的實例;
Spring 注解
Spring 在 2.5 版本以后開始支持用注解的方式來配置依賴注入。可以用注解的方式來替代 XML 方式的 bean 描 述,可以將 bean 描述轉移到組件類的內部,只需要在相關類上、方法上或者字段聲明上使用注解即可。注解 注入將會被容器在 XML 注入之前被處理,所以后者會覆蓋掉前者對于同一個屬性的處理結果。
注解裝配在 Spring 中是默認關閉的。所以需要在 Spring 文件中配置一下才能使用基于注解的裝配模式。如果 你想要在你的應用程序中使用關于注解的方法的話,請參考如下的配置。
幾種比較重要的注解類型:
@Component :標識了一個受 Spring 管理的組件,泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注
@Respository: 標識持久層,數據訪問組件,即 DAO 組件
@Service: 標識業務層組件
@Controller :標識表現層,控制層組件
(1)@RequestMapping
@RequestMapping 是用來處理請求地址映射的注解,可用于類或方法上。用在類上,表示類中所有的響應的
方法都是以該地址作為父路徑來訪問,用在方法上表示該方法的訪問的路徑;兩者結合起來的訪問的路徑為完
整的訪問某個方法的路徑。
@RequestMapping 注解的屬性:
value:指定請求的實際的地址,指定的地址可以是 URI Template 模式;method:指定訪問的方法
consumes:指定處理請求的內容類型,比如 aplication/json;text/html
produces:指定返回的內容的類型
params:指定 request 中必須包含某些參數值時,才讓該方法處理請求
headers:指定 request 中必須包含指定的 header 值,才能讓該方法處理請求
@Resource 和@Autowired
@Resource 和@Autowired 都是做 bean 的注入時使用,都可以寫在字段上,或者是 setter 方法上
@Autowired 注解是按照類型(byType)裝配依賴對象(由 Spring 提供)
如果在此基礎上想通過 byName 來裝配,可以結合@Qualifier 注解來一起使用。
@Resource 默認按照 byName 自動注入
@Resource 有兩個重要的屬性,name 和 type
@Resource 如果寫屬性 name,則按照 byName 來裝配,如果屬性為 type,則按照 byType 來裝配,不寫按照 默認的方式來裝配(byName)
Spring 事務
Spring 支持兩種類型的事務管理:
1.編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。
2.聲明式事務管理:這意味著你可以將業務代碼和事務管理分離,你只需用注解和 XML 配置來管理事務。
Spring 事務配置示例(使用 tx 標簽配置的-)
spring 的事務傳播行為
spring 事務的傳播行為說的是,當多個事務同時存在的時候,spring 如何處理這些事務的行為。
① PROPAGATION_REQUIRED:如果當前沒有事務,就創建一個新事務,如果當前存在事務,就加入該事務, 該設置是最常用的設置。
② PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就 以非事務執行。
③ PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務, 就拋出異常。
④ PROPAGATION_REQUIRES_NEW:創建新事務,無論當前存不存在事務,都創建新事務。
⑤ PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
⑥ PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。
⑦ PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則按 REQUIRED 屬性執行。
Spring 如何處理線程并發問題
在一般情況下,只有無狀態的 Bean 才可以在多線程環境下共享,在 Spring 中,絕大部分 Bean 都可以聲明為 singleton 作用域,因為 Spring 對一些 Bean 中非線程安全狀態采用 ThreadLocal 進行處理,解決線程安全問題
SpringMVC 的執行流程
1、 用戶發送請求至前端控制器DispatcherServlet
2、 DispatcherServlet收到請求調用HandlerMapping處理器映射器。
3、 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器-(如果有則生成)一并返回給DispatcherServlet。
4、 DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
5、 執行處理器(Controller,也叫后端控制器)。
6、 Controller執行完成返回ModelAndView
7、 HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
8、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
9、 ViewReslover解析后返回具體View
10、 DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
11、 DispatcherServlet響應用戶
使用Spring有哪些方式?
作為一個成熟的Spring Web應用程序。
作為第三方Web框架,使用Spring Frameworks 中間層。
作為企業級Java Bean,它可以包裝現有的POJO(Plain Old Java Objects)。·用于遠程使用。
Spring能幫我們做什么?
Spring 能幫我們根據配置文件創建及組裝對象之間的依賴關系。
Spring根據配置文件來進行創建及組裝對象間依賴關系,只需要改配置文件即可Spring面向切面編程能幫助我們無耦合的實現日志記錄,性能統計,安全控制。
Spring面向切面編程能提供一種更好的方式來完成,一般通過配置方式,而且不需要在現有代碼中添加任何額外代碼,現有代碼專注業務邏輯。
Spring能非常簡單的幫我們管理數據庫事務。
采用Spring,我們只需獲取連接,執行SQL,其他事物相關的都交給Spring來管理了。Spring還能與第三方數據庫訪問框架(如Hibernate、JPA)無縫集成,而且自己也提供了一套JDBC
Spring 如何設計容器的,BeanFactory和ApplicationContext的關系詳解
BeanFactory ? ? ?ApplicationContext
BeanFactory簡單粗暴,可以理解為就是個HashMap,Key是BeanName,Value是Bean實例。通常只提供注冊(put),獲取(get)這兩個功能。我們可以稱之為“低級容器"。
ApplicationContext可以稱之為“高級容器"。因為他比BeanFactory 多了更多的功能。他繼承了多個接口。因此具備了更多的功能。例如資源的獲取,支持多種消息(例如JSP tag的支持),對BeanFactory多了工具級別的支持等待。所以你看他的名字,已經不是BeanFactory之類的工廠了,而是"應用上下文",代表著整個大容器的所有功能。該接口定義了一個refresh方法,此方法是所有閱讀Spring 源碼的人的最熟悉的方法,用于刷新整個容器,即重新加載/刷新所有的bean。
當然,除了這兩個大接口,還有其他的輔助接口,這里就不介紹他們了。
BeanFactory和ApplicationContext的關系
為了更直觀的展示“低級容器"和“高級容器"的關系,這里通過常用的ClassPathXmlApplicationContext類來展示整個容器的層級UML關系。
【奔跑吧!JAVA】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/265241
Java Spring
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。