1. 程式人生 > >Spring歸納總結

Spring歸納總結

前言     現如今,Spring已經是一站式的開源框架解決方案,而且形成了Spring生態。作為Java程式設計師,Spring框架是必然要學習的,在工作也是無論如何繞不開的。今天重新回顧了一下Spring,在此做一個歸納總結。

Spring框架本身有四大原則    1.使用POJO進行輕量級和最小侵入式開發    2.通過依賴注入和基於介面程式設計實現鬆耦合    3.通過AOP和預設習慣進行宣告式程式設計    4.使用AOP和模板減少模式化程式碼    Spring所有功能的設計和實現都是基於此四大原則的。面試題:選擇使用Spring框架的原因(Spring框架為企業級開發帶來的好處有哪些)?

答:可以從以下幾個方面作答: - 非侵入式:支援基於POJO的程式設計模式,不強制性的要求實現Spring框架中的介面或繼承Spring框架中的類。 - IoC容器:IoC容器幫助應用程式管理物件以及物件之間的依賴關係,物件之間的依賴關係如果發生了改變只需要修改配置檔案而不是修改程式碼,因為程式碼的修改可能意味著專案的重新構建和完整的迴歸測試。有了IoC容器,程式設計師再也不需要自己編寫工廠、單例,這一點特別符合Spring的精神"不要重複的發明輪子"。 - AOP(面向切面程式設計):將所有的橫切關注功能封裝到切面(aspect)中,通過配置的方式將橫切關注功能動態新增到目的碼上,進一步實現了業務邏輯和系統服務之間的分離。另一方面,有了AOP程式設計師可以省去很多自己寫代理類的工作。 - MVC

:Spring的MVC框架是非常優秀的,從各個方面都可以甩Struts 2幾條街,為Web表示層提供了更好的解決方案。 - 事務管理:Spring以寬廣的胸懷接納多種持久層技術,並且為其提供了宣告式的事務管理,在不需要任何一行程式碼的情況下就能夠完成事務管理。 - 其他:選擇Spring框架的原因還遠不止於此,Spring為Java企業級開發提供了一站式選擇,你可以在需要的時候使用它的部分和全部,更重要的是,你甚至可以在感覺不到Spring存在的情況下,在你的專案中使用Spring提供的各種優秀的功能。

Spring中的一些概念和思想     IOC  控制反轉,將物件的建立權反轉(交給)Spring容器。實現了程式的解耦合。     DI 依賴注入,需要有IOC環境,Spring建立這個類的過程中將這個類所依賴的屬性設定進去。     依賴注入的主要目的是為了解耦,Spring IOC容器(Application Context)負責建立bean,並通過容器將功能類bean注入到你需要的bean中  Spring的相關配置

    1.bean的生命週期         xml方式         通過配置<bean>標籤上的 init-method 作為 Bean 的初始化的時候執行的方法,配置 destroy-method作為 Bean 的銷燬的時候執行的方法。         銷燬方法想要執行,需要是單例建立的 Bean 而且在工廠關閉的時候,Bean 才會被銷燬.             註解方式             @PostConstruct 相當於init-method 在物件被建立後呼叫             @PreDestroy     相當於destroy-method 在物件被銷燬後呼叫  【面試題:161、闡述Spring框架中Bean的生命週期?】   答: ① Spring IoC容器找到關於Bean的定義並例項化該Bean。 ② Spring IoC容器對Bean進行依賴注入。 ③ 如果Bean實現了BeanNameAware介面,則將該Bean的id傳給setBeanName方法。 ④ 如果Bean實現了BeanFactoryAware介面,則將BeanFactory物件傳給setBeanFactory方法。 ⑤ 如果Bean實現了BeanPostProcessor介面,則呼叫其postProcessBeforeInitialization方法。 ⑥ 如果Bean實現了InitializingBean介面,則呼叫其afterPropertySet方法。 ⑦ 如果有和Bean關聯的BeanPostProcessors物件,則這些物件的postProcessAfterInitialization方法被呼叫。 ⑧ 當銷燬Bean例項時,如果Bean實現了DisposableBean介面,則呼叫其destroy方法。     2.bean的建立及注入(兩種方式)         2.1 bean的建立            xml方式                 無引數的構造方法

  <!-- 方式一:無引數的構造方法的例項化 -->
  <bean id="bean1" class="com.spring.demo3.Bean1"></bean>

                補充:前提是該類存在無引數的構造方法,背後的原理是通過反射例項化,這種方式是實際中最常用的,除此之外還有靜態工廠例項化、 例項工廠例項化。             註解方式(首先需要在xml中開啟註解掃描)                 @Component                 @Controller                 @Service                 @Repository                 補充:目前這4個註解功能是一樣的,只是為了讓標註類的用途更加清晰。Spring在後續版本中可能會對它們進行增強,@Controller通常用於控制器,@Service通常用於業務邏輯類,@Repository通常用於倉儲類(例如我們的DAO實現類),普通的類用@Component來標註。         2.2 bean的屬性注入             xml方式                 構造方法注入                 setter方法注入                 物件型別注入(ref屬性)                 介面注入,p名稱空間注入,複雜型別的注入等...                 補充:實際開發中要麼利用value直接給出屬性值,要麼通過ref引用另一個bean。其他的幾乎不用

<bean id="" class="">
   <property name="" value=""> 或者 <property name="" ref="">
</bean>

            註解方式(首先需要在xml中開啟註解掃描)                 @Value :用於注入普通型別.                 @Autowired 預設按照型別注入,但是,如果匹配多個型別一致的物件,將無法選擇具體注入哪一個物件。解決方法:可以結合@Qualifier進行名稱注入,告訴spring容器自動裝配哪個名稱的物件             

      @Autowired // 自動裝配
      @Qualifier("car1") // 指定裝載名為 car1 的物件
      private Car car;

                @Resource 預設按照名稱注入,如果找不到才按照型別注入。實際開發中,注入應該是確定的,那麼按照名稱注入,應該是首選。                 

 @Resource(name="car1") // 手動注入,指定注入哪個名稱的物件
 private Car car;

  2.3 bean的作用範圍

           通過@Scope配合來宣告可選項有如下幾種(實際開發中singleton和prototype最常用)                         singleton :預設值,單例,一個Spring容器中只有一個bean的例項全容器共享一個例項                         prototype :多例,每次呼叫都會新建一個bean的例項                         request :web專案中,給每一個http request新建一個bean例項                         session:web專案中,給每一個http session新建一個bean例項                         globalsession :同一個全域性session共享一個bean 

面試題:

依賴注入時如何注入集合屬性? 答:可以在定義Bean屬性時,通過<list> / <set> / <map> / <props>分別為其注入列表、集合、對映和鍵值都是字串的對映屬性。

Spring中的自動裝配有哪些限制? 答: - 如果使用了構造器注入或者setter注入,那麼將覆蓋自動裝配的依賴關係。 - 基本資料型別的值、字串字面量、類字面量無法使用自動裝配來注入。 - 優先考慮使用顯式的裝配來進行更精確的依賴注入而不是使用自動裝配。

此時到這裡,你會發現spring中有兩種方式進行配置,xml和註解配置,xml結構清晰,註解開發方便。實際開發中,我們通常會選用兩種結合的方式。基本配置比如資料庫配置使用xml方式,開事務 配置bean通常選擇註解方式。

關於AOP AOP可以在不修改原始碼的情況下,對程式進行增強。AOP的實現,一種橫向抽取機制,依賴於動態代理模式。AOP 可以進行許可權校驗,日誌記錄,效能監控,事務控制.         Spring中AOP的概念             Spring能夠為容器中管理的物件生成動態代理物件,以前我們需要自己手動生成,現在由spring幫我們生成代理物件。         Spring實現AOP的原理             動態代理(有介面的情況下優先使用)                 被代理物件必須要實現介面,才能產生代理物件,如果沒有介面將不能使用動態代理技術             cglib代理(沒有介面時使用)                 第三方代理技術,可以對任何類生成代理,其原理是對目標物件進行繼承代理,如果目標物件被final修飾,那麼該類無法被cglib代理。          SpringAop一些概念:             join point(連線點): 連線點.所有可以增強的方法             point cut (切入點): 需要|已經增強的方法             advice(通知/增強): 需要增強的程式碼.             weaving(織入): 將通知應用到切點的過程.             target(目標物件): 被代理物件.             proxy(代理):    將通知織入到目標物件之後,形成代理物件             aspect(切面): 切入點+通知             Introduction(引介):引介是一種特殊的通知在不修改類程式碼的前提下, Introduction 可以在執行期為類動態地新增一些方法或 Field.【面試題】

解釋一下什麼叫AOP(面向切面程式設計)? 答:AOP(Aspect-Oriented Programming)指一種程式設計範型,該範型以一種稱為切面(aspect)的語言構造為基礎,切面是一種新的模組化機制,用來描述分散在物件、類或方法中的橫切關注點(crosscutting concern)。

你是如何理解"橫切關注"這個概念的? 答:"橫切關注"是會影響到整個應用程式的關注功能,它跟正常的業務邏輯是正交的,沒有必然的聯絡,但是幾乎所有的業務邏輯都會涉及到這些關注功能。通常,事務、日誌、安全性等關注就是應用中的橫切關注功能。

Spring整合JDBC     Spring提供了很多模板類整合DAO技術     Spring的事務管理     編碼式     xml配置(aop)     註解配置(aop)         用的最多的就是基於註解的方式

 Spring與web整合     簡單的說就是在web.xml中去配置一個監聽器,然後指定Spring的配置檔案即可。     整合原理:     每一個WEB專案,都存在一個ServletContext物件,而我們配置的監聽器就是對它進行監聽,監聽器會載入Spring的配置檔案,把建立的物件放到ServletContext域(也就是setAttribute方法),獲取物件的時候直接getAttribute即可!