1. 程式人生 > >spring 精華知識點總結

spring 精華知識點總結

1afterPropertiesSet與init-method

(1)、init-method方法,初始化bean的時候執行,可以針對某個具體的bean進行配置。init-method需要在applicationContext.xml配置文件中bean的定義裡頭寫明。例如:<bean id="TestBean" class="nju.software.xkxt.util.TestBean" init-method="init"></bean>
這樣,當TestBean在初始化的時候會執行TestBean中定義的init方法。  
(2)、afterPropertiesSet方法,初始化bean的時候執行,可以針對某個具體的bean進行配置。afterPropertiesSet 必須實現 InitializingBean介面。實現 InitializingBean介面必須實現afterPropertiesSet方法。 InitializingBean是一個介面,它僅僅包含一個方法:afterPropertiesSet()。

spring要求init-method是一個無引數的方法,如果init-method指定的方法中有引數,那麼Spring將會丟擲異常init-method指定的方法可以是public、protected以及private的,並且方法也可以是final的。
(3)、BeanPostProcessor,針對所有Spring上下文中所有的bean,可以在配置文件applicationContext.xml中配置一個BeanPostProcessor,然後對所有的bean進行一個初始化方法之前和之後的代理。BeanPostProcessor介面中有兩個方法: postProcessBeforeInitialization和postProcessAfterInitialization。前者postProcessBeforeInitialization在例項化及依賴注入完成後、在任何初始化程式碼(比如配置檔案中的init-method)呼叫之前呼叫;後者postProcessAfterInitialization在初始化程式碼呼叫之後呼叫
 postProcessBeforeInitialization方法在bean初始化之前執行, postProcessAfterInitialization方法在bean初始化之後執行。


2 proxy-target-class 作用 該屬性值預設為false,表示使用JDK動態代理織入增強;當值為true時,表示使用CGLib動態代理織入增強;但是,即使設定為false,如果目標類沒有生命介面,則spring將自動使用CGLib動態代理
當要使用實現了某個介面的類讓spring來生成bean時,無需在aop配置中新增proxy-target-class,因為它預設為false.

2 lazy-init詳解作用 該屬性值預設為false,表示ApplicationContext實現的預設行為就是在啟動時將所有singleton bean提前進行例項化(也就是依賴注入),lazy-init 設定只對scop屬性為singleton的bean起作用。

3 Spring bean作用域與生命週期

例項化。Spring通過new關鍵字將一個Bean進行例項化,JavaBean都有預設的建構函式,因此不需要提供構造引數。填入屬性。Spring根據xml檔案中的配置通過呼叫Bean中的setXXX方法填入對應的屬性。事件通知。Spring依次檢查Bean是否實現了BeanNameAware、BeanFactoryAware、ApplicationContextAware、BeanPostProcessor、InitializingBean介面,如果有的話,依次呼叫這些介面。使用。應用程式可以正常使用這個Bean了。銷燬。如果Bean實現了DisposableBean介面,就呼叫其destroy方法。

注意:如果bean的scope設為prototype時,當ctx.close時,destroy方法不會被呼叫.

原因:對於prototype作用域的bean,有一點非常重要,那就是Spring不能對一個prototype bean的整個生命週期負責:容器在初始化、配置、裝飾或者是裝配完一個prototype例項後,將它交給客戶端,隨後就對該prototype例項不聞不問了。不管何種作用域,容器都會呼叫所有物件的初始化生命週期回撥方法。但對prototype而言,任何配置好的析構生命週期回撥方法都將不會 被呼叫。清除prototype作用域的物件並釋放任何prototype bean所持有的昂貴資源,都是客戶端程式碼的職責。(讓Spring容器釋放被prototype作用域bean佔用資源的一種可行方式是,通過使用bean的後置處理器,該處理器持有要被清除的bean的引用。)談及prototype作用域的bean時,在某些方面你可以將Spring容器的角色看作是Java new 操作的替代者。任何遲於該時間點的生命週期事宜都得交由客戶端來處理。
4 BeanDefinition的載入和解析

對IoC容器來說,這個載入過程,相當於把定義的BeanDefinition在IoC容器中轉化成一個Spring內部表示的資料結構的過程。IoC容器對Bean的管理和依賴注入功能的實現,是通過對其持有的BeanDefinition進行各種相關操作來完成的。這些BeanDefinition資料在IoC容器中通過一個HashMap來保持和維護。當然這只是一種比較簡單的維護方式,如果需要提高IoC容器的效能和容量,完全可以自己做一些擴充套件。

IoC容器的初始化入口,也就是看一下refresh方法。這個方法的最初是在FileSystemXmlApplicationContext的建構函式中被呼叫的,它的呼叫標誌著容器初始化的開始,
這些初始化物件就是Bean. 

4 Spring容器初始化過程

spring的IoC容器初始化包括:Bean定義資原始檔的定位、載入和註冊3個基本過程。當 BeanDefinition 註冊完畢以後, Spring Bean 工廠就可以隨時根據需要進行例項化了。對於 XmlBeanFactory 來說,例項化預設是延遲進行的,也就是說在 getBean 的時候才會;而對於 ApplicationContext 來說,例項化會在容器啟動後通過AbstractApplicationContext 中 reflash 方法自動進行,主要經過方法鏈: reflesh()   à finishBeanFactoryInitialization (factory) à DefaultListableBeanFactory.preInstantiateSingletons (), 在這裡會根據註冊的 BeanDefinition 資訊依此呼叫 getBean(beanName) 。而真正例項化的邏輯和 BeanFactory 是“殊途同歸”的,所有有關 Bean 例項化都可以從 getBean(beanName) 入手。IoC容器和上下文初始化一般不包含Bean依賴注入的實現。一般而言,依賴注入傳送在應用第一次通過getBean方法向容器獲取Bean時。但是有個特例是:IoC容器預例項化配置的lazyinit屬性,如果某個Bean設定了lazyinit屬性,則該Bean的依賴注入在IoC容器初始化時就預先完成了

5 如何啟動spring容器:在Web專案中,啟動Spring容器的方式有三種,ContextLoaderListener、ContextLoadServlet、ContextLoaderPlugin。

5 ApplicationContext和beanfactory區別:BeanFacotry是spring中比較原始的Factory。如XMLBeanFactory就是一種典型的BeanFactory。原始的BeanFactory無法支援spring的許多外掛,如AOP功能、Web應用等。 ApplicationContext介面,它由BeanFactory介面派生而來,因而提供BeanFactory所有的功能

 6 spring如何跟struts2: struts2-spring-plugin.jar這個外掛重寫了struts的物件工廠,當建立一個action類時,它會根據struts的配置檔案的class屬性的值與spring配置檔案中的id屬性的值相匹配

 7 spring如何跟mybatis:Mybatis-Spring給我們封裝了一個SqlSessionFactoryBean,這個物件包含了3個必備屬性,分別是資料來源、掃描xml和掃描dao層用的

[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
  2.               <propertyname="dataSource"ref="dataSource"/>
  3.               <propertyname="mapperLocations"
  4.                      value="classpath:com/tiantian/ckeditor/mybatis/mappers/*Mapper.xml"/>
  5.               <propertyname="typeAliasesPackage"value="com.tiantian.ckeditor.model"/>
  6. </bean>
save_snippets.png
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
              <property name="dataSource" ref="dataSource" />
              <property name="mapperLocations"
                     value="classpath:com/tiantian/ckeditor/mybatis/mappers/*Mapper.xml" />
              <property name="typeAliasesPackage" value="com.tiantian.ckeditor.model" />
</bean>

mapperLocations:它表示我們的Mapper檔案存放的位置,當我們的Mapper檔案跟對應的Mapper介面處於同一位置的時候可以不用指定該屬性的值。

configLocation:用於指定Mybatis的配置檔案位置。如果指定了該屬性,那麼會以該配置檔案的內容作為配置資訊構建對應的SqlSessionFactoryBuilder,但是後續屬性指定的內容會覆蓋該配置檔案裡面指定的對應內容。

 typeAliasesPackage:它一般對應我們的實體類所在的包,這個時候會自動取對應包中不包括包名的簡單類名作為包括包名的別名。多個package之間可以用逗號或者分號等來進行分隔。