中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring框架的小技巧

發布時間:2020-10-12 14:35:50 來源:億速云 閱讀:169 作者:小新 欄目:MySQL數據庫

這篇文章主要介紹了Spring框架的小技巧,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

Spring框架在面試中是一個必問點,里面究竟有哪些內容呢?讓我們一起來看看。這也是我在面試中經常會問到的問題,也是體現一個程序員對框架理解的能力。

介紹一下Spring框架

Spring是一種輕量級框架,旨在提高開發人員的開發效率以及系統的可維護性。

我們一般說的Spring框架就是Spring Framework,它是很多模塊的集合,使用這些模塊可以很方便地協助我們進行開發。這些模塊是核心容器、數據訪問/集成、Web、AOP(面向切面編程)、工具、消息和測試模塊。比如Core Container中的Core組件是Spring所有組件的核心,Beans組件和Context組件是實現IOC和DI的基礎,AOP組件用來實現面向切面編程。

Spring的6個特征:

  • 核心技術:依賴注入(DI),AOP,事件(Events),資源,i18n,驗證,數據綁定,類型轉換,SpEL;
  • 測試:模擬對象,TestContext框架,Spring MVC測試,WebTestClient;
  • 數據訪問:事務,DAO支持,JDBC,ORM,編組XML;
  • Web支持:Spring MVC和Spring WebFlux Web框架;
  • 集成:遠程處理,JMS,JCA,JMX,電子郵件,任務,調度,緩存;
  • 語言:Kotlin,Groovy,動態語言;

列舉一些重要的Spring模塊

下圖對應的是Spring 4.x的版本,目前最新的5.x版本中Web模塊的Portlet組件已經被廢棄掉,同時增加了用于異步響應式處理的WebFlux組件。

  • Spring Core:基礎,可以說Spring其他所有的功能都依賴于該類庫。主要提供IOC和DI功能。
  • Spring Aspects:該模塊為與AspectJ的集成提供支持。
  • Spring AOP:提供面向方面的編程實現。
  • Spring JDBC:Java數據庫連接。
  • Spring JMS:Java消息服務。
  • Spring ORM:用于支持Hibernate等ORM工具。
  • Spring Web:為創建Web應用程序提供支持。
  • Spring Test:提供了對JUnit和TestNG測試的支持。

談談自己對于Spring IOC和AOP的理解

IOC

IOC(Inversion Of Controll,控制反轉)是一種設計思想,就是將原本在程序中手動創建對象的控制權,交由給Spring框架來管理。IOC在其他語言中也有應用,并非Spring特有。IOC容器是Spring用來實現IOC的載體,IOC容器實際上就是一個Map(key, value),Map中存放的是各種對象。

將對象之間的相互依賴關系交給IOC容器來管理,并由IOC容器完成對象的注入。這樣可以很大程度上簡化應用的開發,把應用從復雜的依賴關系中解放出來。IOC容器就像是一個工廠一樣,當我們需要創建一個對象的時候,只需要配置好配置文件/注解即可,完全不用考慮對象是如何被創建出來的。在實際項目中一個Service類可能由幾百甚至上千個類作為它的底層,假如我們需要實例化這個Service,可能要每次都搞清楚這個Service所有底層類的構造函數,這可能會把人逼瘋。如果利用IOC的話,你只需要配置好,然后在需要的地方引用就行了,大大增加了項目的可維護性且降低了開發難度。

Spring時代我們一般通過XML文件來配置Bean,后來開發人員覺得用XML文件來配置不太好,于是Sprng Boot注解配置就慢慢開始流行起來。Spring框架的小技巧

AOP

AOP(Aspect-Oriented Programming,面向切面編程)能夠將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任(例如事務處理、日志管理、權限控制等)封裝起來,便于減少系統的重復代碼,降低模塊間的耦合度,并有利于未來的可擴展性和可維護性。

Spring AOP是基于動態代理的,如果要代理的對象實現了某個接口,那么Spring AOP就會使用JDK動態代理去創建代理對象;而對于沒有實現接口的對象,就無法使用JDK動態代理,轉而使用CGlib動態代理生成一個被代理對象的子類來作為代理。

當然也可以使用AspectJ,Spring AOP中已經集成了AspectJ,AspectJ應該算得上是Java生態系統中最完整的AOP框架了。使用AOP之后我們可以把一些通用功能抽象出來,在需要用到的地方直接使用即可,這樣可以大大簡化代碼量。我們需要增加新功能也方便,提高了系統的擴展性。日志功能、事務管理和權限管理等場景都用到了AOP。

Spring AOP和AspectJ AOP的區別

Spring AOP是屬于運行時增強,而AspectJ是編譯時增強。Spring AOP基于代理(Proxying),而AspectJ基于字節碼操作(Bytecode Manipulation)。

Spring AOP已經集成了AspectJ,AspectJ應該算得上是Java生態系統中最完整的AOP框架了。AspectJ相比于Spring AOP功能更加強大,但是Spring AOP相對來說更簡單。

如果我們的切面比較少,那么兩者性能差異不大。但是,當切面太多的話,最好選擇AspectJ,它比SpringAOP快很多。

Spring中的bean的作用域有哪些?

  1. singleton:唯一bean實例,Spring中的bean默認都是單例的。
  2. prototype:每次請求都會創建一個新的bean實例。
  3. request:每一次HTTP請求都會產生一個新的bean,該bean僅在當前HTTP request內有效。
  4. session:每一次HTTP請求都會產生一個新的bean,該bean僅在當前HTTP session內有效。
  5. global-session:全局session作用域,僅僅在基于Portlet的Web應用中才有意義,Spring5中已經沒有了。Portlet是能夠生成語義代碼(例如HTML)片段的小型Java Web插件。它們基于Portlet容器,可以像Servlet一樣處理HTTP請求。但是與Servlet不同,每個Portlet都有不同的會話。

Spring中的單例bean的線程安全問題了解嗎?

大部分時候我們并沒有在系統中使用多線程,所以很少有人會關注這個問題。單例bean存在線程問題,主要是因為當多個線程操作同一個對象的時候,對這個對象的非靜態成員變量的寫操作會存在線程安全問題。

有兩種常見的解決方案:

  1. 在bean對象中盡量避免定義可變的成員變量(不太現實)。
  2. 在類中定義一個ThreadLocal成員變量,將需要的可變成員變量保存在ThreadLocal中(推薦的一種方式)。

Spring中的bean生命周期?

  1. Bean容器找到配置文件中Spring Bean的定義。
  2. Bean容器利用Java Reflection API創建一個Bean的實例。
  3. 如果涉及到一些屬性值,利用set()方法設置一些屬性值。
  4. 如果Bean實現了BeanNameAware接口,調用setBeanName()方法,傳入Bean的名字。
  5. 如果Bean實現了BeanClassLoaderAware接口,調用setBeanClassLoader()方法,傳入ClassLoader對象的實例。
  6. 如果Bean實現了BeanFactoryAware接口,調用setBeanClassFacotory()方法,傳入ClassLoader對象的實例。
  7. 與上面的類似,如果實現了其他*Aware接口,就調用相應的方法。
  8. 如果有和加載這個Bean的Spring容器相關的BeanPostProcessor對象,執行postProcessBeforeInitialization()方法。
  9. 如果Bean實現了InitializingBean接口,執行afeterPropertiesSet()方法。
  10. 如果Bean在配置文件中的定義包含init-method屬性,執行指定的方法。
  11. 如果有和加載這個Bean的Spring容器相關的BeanPostProcess對象,執行postProcessAfterInitialization()方法。
  12. 當要銷毀Bean的時候,如果Bean實現了DisposableBean接口,執行destroy()方法。
  13. 當要銷毀Bean的時候,如果Bean在配置文件中的定義包含destroy-method屬性,執行指定的方法。Spring框架的小技巧

說說自己對于Spring MVC的了解?

談到這個問題,我們不得不提提之前Model1和Model2這兩個沒有Spring MVC的時代。

**Model1時代:**很多學Java比較晚的后端程序員可能并沒有接觸過Model1模式下的JavaWeb應用開發。在Model1模式下,整個Web應用幾乎全部用JSP頁面組成,只用少量的JavaBean來處理數據庫連接,訪問等操作。這個模式下JSP即是控制層又是表現層。顯而易見,這種模式存在很多問題。比如將控制邏輯和表現邏輯混雜在一起,導致代碼重用率極低;又比如前端和后端相互依賴,難以進行測試并且開發效率極低。

Model2時代:學過Servlet并做過相關Demo的朋友應該了解Java Bean(Model)+JSP(View)+Servlet(Controller)這種開發模式,這就是早期的Java Web MVC開發模式。Model是系統中涉及的數據,也就是dao和bean;View是用來展示模型中的數據,只是用來展示;Controller是將用戶請求都發送給Servlet做處理,返回數據給JSP并展示給用戶。

Model2模式下還存在很多問題,Model2的抽象和封裝程度還遠遠不夠,使用Model2進行開發時不可避免地會重復造輪子,這就大大降低了程序的可維護性和可復用性。于是很多Java Web開發相關的MVC框架應運而生,比如Struts2,但是由于Struts2比較笨重,隨著Spring輕量級開發框架的流行,Spring生態圈出現了Spring MVC框架。Spring MVC是當前最優秀的MVC框架,相比于Struts2,Spring MVC使用更加簡單和方便,開發效率更高,并且Spring MVC運行速度更快。

MVC是一種設計模式,Spring MVC是一款很優秀的MVC框架。Spring MVC可以幫助我們進行更簡潔的Web層的開發,并且它天生與Spring框架集成。Spring MVC下我們一般把后端項目分為Service層(處理業務)、Dao層(數據庫操作)、Entity層(實體類)、Controller層(控制層,返回數據給前臺頁面)。

Spring MVC的簡單原理圖如下:

談談Spring MVC的工作原理

流程說明:

1.客戶端(瀏覽器)發送請求,直接請求到DispatcherServlet。

2.DispatcherServlet根據請求信息調用HandlerMapping,解析請求對應的Handler。

3.解析到對應的Handler(也就是我們平常說的Controller控制器)。

4.HandlerAdapter會根據Handler來調用真正的處理器來處理請求和執行相對應的業務邏輯。

5.處理器處理完業務后,會返回一個ModelAndView對象,Model是返回的數據對象,View是邏輯上的View。

6.ViewResolver會根據邏輯View去查找實際的View。

7.DispatcherServlet把返回的Model傳給View(視圖渲染)。

8.把View返回給請求者(瀏覽器)。

##Spring框架中用到了哪些設計模式?

  1. 工廠設計模式:Spring使用工廠模式通過BeanFactory和ApplicationContext創建bean對象。
  2. 代理設計模式:Spring AOP功能的實現。
  3. 單例設計模式:Spring中的bean默認都是單例的。
  4. 模板方法模式:Spring中的jdbcTemplate、hibernateTemplate等以Template結尾的對數據庫操作的類,它們就使用到了模板模式。
  5. 包裝器設計模式:我們的項目需要連接多個數據庫,而且不同的客戶在每次訪問中根據需要會去訪問不同的數據庫。這種模式讓我們可以根據客戶的需求能夠動態切換不同的數據源。
  6. 觀察者模式:Spring事件驅動模型就是觀察者模式很經典的一個應用。
  7. 適配器模式:Spring AOP的增強或通知(Advice)使用到了適配器模式、Spring MVC中也是用到了適配器模式適配Controller。

@Component和@Bean的區別是什么?

  1. 作用對象不同。@Component注解作用于類,而@Bean注解作用于方法。
  2. @Component注解通常是通過類路徑掃描來自動偵測以及自動裝配到Spring容器中(我們可以使用@ComponentScan注解定義要掃描的路徑)。@Bean注解通常是在標有該注解的方法中定義產生這個bean,告訴Spring這是某個類的實例,當我需要用它的時候還給我。
  3. @Bean注解比@Component注解的自定義性更強,而且很多地方只能通過@Bean注解來注冊bean。比如當引用第三方庫的類需要裝配到Spring容器的時候,就只能通過@Bean注解來實現。

@Bean注解的使用示例:

@Configurationpublic class AppConfig {    @Bean    public TransferService transferService() {        return new TransferServiceImpl();    }}復制代碼

上面的代碼相當于下面的XML配置:

<beans>    <bean id="transferService" class="com.common.TransferServiceImpl"/></beans>復制代碼

下面這個例子是無法通過@Component注解實現的:

@Beanpublic OneService getService(status) {    case (status)  {        when 1:                return new serviceImpl1();        when 2:                return new serviceImpl2();        when 3:                return new serviceImpl3();    }}復制代碼

將一個類聲明為Spring的bean的注解有哪些?

我們一般使用@Autowired注解去自動裝配bean。而想要把一個類標識為可以用@Autowired注解自動裝配的bean,可以采用以下的注解實現:

  1. @Component注解。通用的注解,可標注任意類為Spring組件。如果一個Bean不知道屬于哪一個層,可以使用@Component注解標注。
  2. @Repository注解。對應持久層,即Dao層,主要用于數據庫相關操作。
  3. @Service注解。對應服務層,即Service層,主要涉及一些復雜的邏輯,需要用到Dao層(注入)。
  4. @Controller注解。對應Spring MVC的控制層,即Controller層,主要用于接受用戶請求并調用Service層的方法返回數據給前端頁面。

Spring事務管理的方式有幾種?

  1. 編程式事務:在代碼中硬編碼(不推薦使用)。
  2. 聲明式事務:在配置文件中配置(推薦使用),分為基于XML的聲明式事務和基于注解的聲明式事務。

Spring事務中的隔離級別有哪幾種?

在TransactionDefinition接口中定義了五個表示隔離級別的常量:

**ISOLATION_DEFAULT:**使用后端數據庫默認的隔離級別,Mysql默認采用的REPEATABLE_READ隔離級別;Oracle默認采用的READ_COMMITTED隔離級別。

**ISOLATION_READ_UNCOMMITTED:**最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致臟讀、幻讀或不可重復讀。

**ISOLATION_READ_COMMITTED:**允許讀取并發事務已經提交的數據,可以阻止臟讀,但是幻讀或不可重復讀仍有可能發生

**ISOLATION_REPEATABLE_READ:**對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發生。

**ISOLATION_SERIALIZABLE:**最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。

Spring事務中有哪幾種事務傳播行為?

在TransactionDefinition接口中定義了八個表示事務傳播行為的常量。

支持當前事務的情況:

**PROPAGATION_REQUIRED:**如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。

PROPAGATION_SUPPORTS: 如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。

PROPAGATION_MANDATORY: 如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。(mandatory:強制性)。

不支持當前事務的情況:

PROPAGATION_REQUIRES_NEW: 創建一個新的事務,如果當前存在事務,則把當前事務掛起。

PROPAGATION_NOT_SUPPORTED: 以非事務方式運行,如果當前存在事務,則把當前事務掛起。

PROPAGATION_NEVER: 以非事務方式運行,如果當前存在事務,則拋出異常。

###其他情況:

PROPAGATION_NESTED: 如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于PROPAGATION_REQUIRED。

感謝你能夠認真閱讀完這篇文章,希望小編分享Spring框架的小技巧內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節
推薦閱讀:
  1. Helm小技巧
  2. PHP 小技巧

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

休宁县| 江山市| 视频| 义乌市| 邵武市| 盱眙县| 桦川县| 司法| 开平市| 长治县| 威海市| 富蕴县| 云霄县| 雷州市| 天柱县| 开鲁县| 蓬溪县| 合阳县| 道真| 锡林浩特市| 会同县| 随州市| 平舆县| 成武县| 竹溪县| 深州市| 高台县| 大悟县| 乌鲁木齐市| 北辰区| 澄城县| 苏尼特左旗| 交城县| 沾化县| 和田市| 海宁市| 和政县| 调兵山市| 砚山县| 岫岩| 察哈|