一、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