【spring相关面试题摘录】
- 什么是bean的自動裝配,有哪些方式?
- Spring Boot、Spring MVC 和 Spring 有什么區別
- 如何重新加載Spring Boot 上的更改,而無需重新啟動服務器?
- Spring Boot 中的監視器是什么?
- 談談你對AOP的理解
- 對IOC的理解
- 簡述spring的生命周期
什么是bean的自動裝配,有哪些方式?
開啟自動裝配,只需要在xml配置文件中定義“autowire”屬性。
autowire屬性有五種裝配的方式:
no – 缺省情況下,自動配置是通過“ref”屬性手動設定 。
byName-根據bean的屬性名稱進行自動裝配。
byType-根據bean的類型進行自動裝配。
Cutomer的屬性person的類型為Person,Spirng會將Person類型通過setter方法進行自動裝配。 <bean id="cutomer" class="com.xxx.xxx.Cutomer" autowire="byType"/> <bean id="person" class="com.xxx.xxx.Person"/>constructor-類似byType,不過是應用于構造器的參數。如果一個bean與構造器參數的類型形同,則進行自動裝配,否則導致異常。
autodetect-如果有默認的構造器,則通過constructor方式進行自動裝配,否則使用byType方式進行自動裝配。
@Autowired自動裝配bean,可以在字段、setter方法、構造函數上使用。
手動裝配:以value或ref的方式明確指定屬性值都是手動裝配。
需要通過‘ref’屬性來連接bean。
Cutomer的屬性名稱是person,Spring會將bean id為person的bean通過setter方法進行自動裝配。
@Autowired自動裝配bean,可以在字段、setter方法、構造函數上使用。
Spring Boot、Spring MVC 和 Spring 有什么區別
Spring是一個輕量級的使用控制反轉(IoC)和面向切面(AOP)的J2EE容器框架,用來管理Bean
–從大小與開銷兩方面而言Spring都是輕量級的。
–通過控制反轉(IoC)的技術達到松耦合的目的
–提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務進行內聚性的開發
–包含并管理應用對象(Bean)的配置和生命周期,這個意義上是一個容器。
–將簡單的組件配置、組合成為復雜的應用,這個意義上是一個框架
spring可以很方便的整合各種框架,提供AOP機制彌補OOP的代碼重復問題、更方便將不同類不同方法中的共同處理抽取成切面、自動注入給方法執行,比如日志、異常等
springmvc是spring對web框架的一個解決方案,提供了一個總的前端控制器Servlet,用來接收請求,然后定義了一套路由策略(url到handle的映射)及適配執行handle,將handle結果使用視圖解析技術生成視圖展現給前端
springboot是spring提供的一個快速開發工具包,讓程序員能更方便、更快速的開發spring+springmvc應用,簡化了配置(約定了默認配置),整合了一系列的解決方案(starter機制)、redis、mongodb、es,可以開箱即用
Spring Boot 已經建立在現有spring 框架之上。使用spring 啟動,我們避免了之前我們必須做的所有樣板代碼和配置。因
此, Spring Boot 可以幫助我們以最少的工作量, 更加健壯地使用現有的Spring功能。
Spring Boot 的優點有:
1、減少開發,測試時間和努力。
2、使用JavaConfig 有助于避免使用XML。
3、避免大量的Maven 導入和各種版本沖突。
4、提供意見發展方法。
5、通過提供默認值快速開始開發。
6、沒有單獨的Web 服務器需要。這意味著你不再需要啟動Tomcat,Glassfish
或其他任何東西。
7、需要更少的配置因為沒有web.xml 文件。只需添加用@ Configuration 注釋的類,然后添加用@Bean 注釋的方法,Spring 將自動加載對象并像以前一樣對其進行管理。您甚至可以將@Autowired 添加到bean 方法中,以使Spring 自動裝
入需要的依賴關系中。
8、基于環境的配置使用這些屬性,您可以將您正在使用的環境傳遞到應用程序:
-Dspring.profiles.active = {enviornment}。在加載主應用程序屬性文件后,
Spring 將在(application{environment} .properties)中加載后續的應用程序屬性文件。
如何重新加載Spring Boot 上的更改,而無需重新啟動服務器?
這可以使用DEV 工具來實現。通過這種依賴關系,您可以節省任何更改,嵌入式tomcat 將重新啟動。Spring Boot 有一個開發工具(DevTools)模塊,它有助于提高開發人員的生產力。Java 開發人員面臨的一個主要挑戰是將文件更改自動部署到服務器并自動重啟服務器。開發人員可以重新加載Spring Boot 上的更改,而無需重新啟動服務器。這將消除每次手動部署更改的需要。Spring Boot 在發布它的第一個版本時沒有這個功能。這是開發人員最需要的功能。DevTools 模塊完全滿足開發人員的需求。該模塊將在生產環境中被禁用。它還提供H2 數據庫控制臺以更好地測試應用程序
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional>Spring Boot 中的監視器是什么?
Spring boot actuator 是spring 啟動框架中的重要功能之一。Spring boot 監視器可幫助您訪問生產環境中正在運行的應用程序的當前狀態。有幾個指標必須在生產環境中進行檢查和監控。即使一些外部應用程序可能正在使用這些服務來向
相關人員觸發警報消息。監視器模塊公開了一組可直接作為HTTP URL 訪問的REST 端點來檢查狀態
談談你對AOP的理解
系統是由許多不同的組件所組成的,每一個組件各負責一塊特定功能。除了實現自身核心功能之外,這些組件還經常承擔著額外的職責。例如日志、事務管理和安全這樣的核心服務經常融入到自身具有核心業務邏輯的組件中去。這些系統服務經常被稱為橫切關注點,因為它們會跨越系統的多個組件。
當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但并不適合定義從左到右的關系。例如日志功能。日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。
在OOP設計中,它導致了大量代碼的重復,而不利于各個模塊的重用。
AOP:將程序中的交叉業務邏輯(比如安全,日志,事務等),封裝成一個切面,然后注入到目標對象(具體業務邏輯)中去。AOP可以對某個對象或某些對象的功能進行增強,比如對象中的方法進行增強,可以在執行某個方法之前額外的做一些事情,在某個方法執行之后額外的做一些事情
1.應用場景 AOP適合的場景很多,包括:
·日志記錄:不需要在邏輯代碼中混雜日志代碼,在項目后期織入日志功能。可以織入的日志包括系統登錄日志、服務及方法調用日志等。
·安全控制:對系統的訪問進行登錄驗證,對請求進行權限驗證。
·參數檢驗:對請求參數進行統一轉換或驗證。 ·事務處理:統一處理數據庫事務的提交和回滾,比如在方法執行完成后自動提交事務,出現異常時自動回滾。
·統一異常處理:不需要在每個方法中使用try catch捕捉異常,使用AOP集中處理。
·緩存:使用AOP實現緩存存取和清除。
·統一發信、通知,對某些方法執行或者異常攔截發送通知。 橫向共用功能通過AOP實現后, 業務邏輯代碼變得干凈、整潔。
2. AOP的基本術語解釋如下:
·Aspect:切面,由切點和增強組成,如在Java代碼中對應一個切面類。
·JointPoint:連接點。程序執行的某個位置,如函數調用、函數執行、構造函數調用、獲取或設置變量、類初始化等。 ·Pointcut:切入點,也就是特定的連接點。一個程序有多個連接點,但并不是所有連接點都是需要關心的,找到合適的連接點進行切入。切入點就是選取的合適連接點的描述。一句話,Pointcut用來限定和描述JointPoint。
·Advice:增強。織入到目標連接點的代碼,也就是額外功能的代碼。
·Weaving:織入。將增強添加到目標連接點的過程。
·Before(前置)、After(后置)和Around(環繞):織入方位可前、 可后也可以是兩者的合集。 代理(Proxy)是實現AOP的主要技術,在代理類中包含了原始類和增強代碼的功能。
【關鍵詞:增強,代理】
對IOC的理解
談談你對IOC的理解
容器概念、控制反轉、依賴主入
ioc容器:實際上就是個map(key, value)),里存的是各種對象(在xm里配置的bean節點、@ repository.@ service…@ controller.@ component)),在項目啟動的時候會讀取配置文件里面的bean節點,根據全限定類名使用反射創建對象放到map里、掃描到打上上述注解的類還是通過反射創建對象放到map里,這個時候map里就有各種對象了,接下來我們在碼里需要用到里面的對象時,再通過DI注入( autowired、resource等注解,xml里bean節點內的ref屬性,項目啟動的時候會讀取xml節點ref屬性根據id注入,也會掃描這些注解,根據類型或id注入;id就是對象名)。
控制反轉:
沒有引入IOC容器之前,對象A依賴于對象B.那么對象A在初始化或者運行到某一點的時候,自己必須主動去創建對象B或者使用已經創建的對象B。無論是創建還使用對象B,控制權都在自己手上。
引入IOC容器之后,對象A與對象B之間失去了直接聯系,當對象A運行到需要對象B的時候,IOC容器會主動創建一個對象B注入到對象A需要的地方通過前后的對比,不難看出來:對象A獲得依賴象B的過程由主動行為變為了被動行為,控制權順倒過來了,這就是控制反轉這個名稱的由來。
全部對象的控制權全部上繳給第三方IOC容器,所以,IOC容器成了整個系統的關鍵核心,它起到了一種類似粘合劑的作用,把系統中的所有對象粘合在一起揮作用,如果沒有這個粘合劑,對象與對象之間會彼此失去聯系,這就是有人把IOC容器比喻成粘合劑的由來。
依賴注入:“獲得依賴對象的過程被反轉了”,控制反轉之后,獲得依賴對象的過程由自身管理變成了由IOC容器管理,依賴注入是實現IOC的方法,就是由IOC容器在運行期間,動態地將某種依賴關系注入到對象之中。
簡述spring的生命周期
1、解析類得到 BeanDefinition
2、如果有多個構造方法,則要推斷構造方法
3、確定好構造方法后,進行實例化得到一個對象
4、對對象中的加了@ Autowired注解的屬性進行屬性填充
5、回調 Aware方法,比如 BeanNameAware, BeanFactoryAware
6、調用 BeanPostProcessor的初始化前的方法
7、調用初始化方法
8、調用 BeanPostProcessorg的初始化后的方法,在這里會進行AOP
9、如果當前創建的bean是單例的則會把bean放入單例池
10、使用bean
11、 Spring容器關閉時調用中 destory)方法
總結
以上是生活随笔為你收集整理的【spring相关面试题摘录】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【java学习笔记】java se8的流
- 下一篇: 【数据结构】用java实现不同的七种排序