Spring詳解----個人筆記

一、spring_IOC容器

1、spring依賴庫
 * SPRING_HOME/dist/spring.jar
 * SPRING_HOME/lib/jakarta-commons/commons-logging.jar
 * SPRING_HOME/lib/log4j/log4j-1.2.14.jar

2、拷貝spring配置文件到src下


3、拷貝log4j配置文件到src下

4、在UserManagerImpl中提供構造函數或setter方法,spring將實例化好的UserDao實現注入給

我們

5、讓spring管理我們的對象創建和依賴,必須在spring配置中進行定義

6、編寫客戶端


spring Ioc容器的關鍵點:
 * 必須將被管理的對象定義到spring配置文件中
 * 必須定義構造函數或setter方法,讓spring將對象注入過來

二、spring_屬性注入 

1、spring的普通屬性注入 

什麼是屬性編輯器,作用?
 * 自定義屬性編輯器,spring配置文件中的字符串轉換成相應的對象進行注入
 spring已經有內置的屬性編輯器,我們可以根據需求自己定義屬性編輯器
 
 * 如何定義屬性編輯器?
  * 繼承PropertyEditorSupport類,覆寫setAsText()方法,參見:

UtilDatePropertyEditor.java
  * 將屬性編輯器註冊到spring中,參見:applicationContext-editor.xml
  
依賴對象的注入方式,可以採用:
 * ref屬性
 * <ref>標籤
 * 內部<bean>來定義
 
如何將公共的注入定義描述出來?
 * 通過<bean>標籤定義公共的屬性,指定abstract=true
 * 具有相同屬性的類在<bean>標籤中指定其parent屬性
 
 參見:applicationContext-other.xml


三、Bean的作用域

spring Bean的作用域:
 
scope可以取值: 
 * singleton:每次調用getBean的時候返回相同的實例
<bean id="bean1" class="com.bjsxt.spring.Bean1" scope="singleton"/>

 * prototype:每次調用getBean的時候返回不同的實例
<bean id="bean1" class="com.bjsxt.spring.Bean1" scope="prototype"/>

四、根據名稱/類型自動裝配

applicationContext.xml   標頭加default-autowire="byName"


applicationContext.xml   標頭加default-autowire="byType"


小結:
IoC就是Inversion of Control,控制反轉。在Java開發中,IoC意味着將你設計好的類交給系統

去控制,而不是在你的類內部控制。這稱爲控制反轉。將Bean及其他東東的依賴關係全部注入到

xml文件中。其相當於大型的工廠。


五、spring採用Annotation方法實現AOP

spring對AOP的只是(採用Annotation的方式)

1、spring依賴庫
 * SPRING_HOME/dist/spring.jar
 * SPRING_HOME/lib/jakarta-commons/commons-logging.jar
 * SPRING_HOME/lib/log4j/log4j-1.2.14.jar
 * SPRING_HOME/lib/aspectj/*.jar
 
2、採用Aspect定義切面

2、在Aspect定義Pointcut和Advice

4、啓用AspectJ對Annotation的支持並且將Aspect類和目標對象配置到Ioc容器中

注意:在這種方法定義中,切入點的方法是不被執行的,它存在的目的僅僅是爲了重用切入點
即Advice中通過方法名引用這個切人點

AOP:
 * Cross cutting concern
 * Aspect
 * Advice
 * Pointcut
 * Joinpoint
 * Weave
 * Target Object
 * Proxy
 * Introduction

 

六、spring對AOP的只是(採用配置文件的方式)

1、spring依賴庫
 * SPRING_HOME/dist/spring.jar
 * SPRING_HOME/lib/jakarta-commons/commons-logging.jar
 * SPRING_HOME/lib/log4j/log4j-1.2.14.jar
 * SPRING_HOME/lib/aspectj/*.jar
2、配置如下
 <aop:config>
  <aop:aspect id="security" ref="securityHandler">
   <aop:pointcut id="allAddMethod" expression="execution(*

com.bjsxt.spring.UserManagerImpl.add*(..))"/>
   <aop:before method="checkSecurity" pointcut-

ref="allAddMethod"/>
  </aop:aspect>
 </aop:config> 
  

spring對AOP的支持

Aspect默認情況下不用實現接口,但對於目標對象(UserManagerImpl.java),在默認情況下必

須實現接口
如果沒有實現接口必須引入CGLIB庫

我們可以通過Advice中添加一個JoinPoint參數,這個值會由spring自動傳入,從JoinPoint中可

以取得
參數值、方法名等等


spring對AOP的支持

1、如果目標對象實現了接口,默認情況下會採用JDK的動態代理實現AOP
2、如果目標對象實現了接口,可以強制使用CGLIB實現AOP
3、如果目標對象沒有實現了接口,必須採用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間

轉換


七、如何強制使用CGLIB實現AOP?
 * 添加CGLIB庫,SPRING_HOME/cglib/*.jar
 * 在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
 
JDK動態代理和CGLIB字節碼生成的區別?
 * JDK動態代理只能對實現了接口的類生成代理,而不能針對類
 * CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法
   因爲是繼承,所以該類或方法最好不要聲明成final 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章