天天看點

Java Spring的IoC和AOP的知識點速記

spring簡介

spring解決的最核心的問題就是把對象之間的依賴關系轉為用配置檔案來管理,這個是通過spring的依賴注入機制實作的。

spring bean裝配

1. ioc的概念以及在spring容器中如何進行ioc的操作。

ioc:inversion of control,控制反轉。在java開發中,ioc意味着将你設計好的類交給系統去控制,而不是在你的類内部控制,這稱為控制反轉,就是被調用類的執行個體由原先的調用類控制建立、銷毀現在轉變成由spring的容器管理。

2. spring容器是如何管理bean的生命周期的(如bean的初始化方法,bean的銷毀方法)

建立:<bean name=”” class=”” 額外屬性>

初始化:配置init­-method/實作接口initializingbean

調用:context.getbean(),進行方法的調用

銷毀:配置destroy-­method/實作disposablebean接口

3. di的概念以及在spring架構注入有幾種方式。使用構造注入對象,必須要注意什麼問題?

注入方式:

構造注入[構造方法注入]

屬性注入[屬性的set/get]

方法注入[工廠注入]

Java Spring的IoC和AOP的知識點速記
Java Spring的IoC和AOP的知識點速記

使用構造函數依賴注入時,spring保證所有一個對象所有依賴的對象先執行個體化後,才執行個體化這個對象。使用set方法依賴注入時,spring首先執行個體化對象,然後才執行個體化所有依賴的對象。

4. 使用di注入時,property代表什麼意思,如果property引用的是其他bean的話,如何注入,如果引用是字元串的話,如何設定。

使用di注入時,property代表注入類的屬性,如果應用其他的bean用ref屬性來表明被引用bean的名稱,如果是引用字元串的話,用value屬性。如:

5. bean的作用域

所有spring bean的預設都是單例,即scope=”singleton”

幾種作用域:

singleton:在每一個spring容器中,一個bean定義隻有一個對象執行個體。

prototype:bean的定義可以被執行個體化任意次(每次調用都建立一個執行個體)。

request:在一次http 請求中,每個bean定義對應一個執行個體。該作用域僅在基于web的spring上下文(如spring mvc)中才有效。

session:在一個http session中,每個bean定義對應一個執行個體。該作用域僅在基于web的spring上下文(如spring mvc)中才有效。

global-session:在一個全局http session中,每個bean定義對應一個執行個體。該作用域僅在portlet上下文中才有效。

6. di自動裝配(autowiring)

 spring中提供了自動裝配依賴對象的機制,但是在實際應用中并不推薦使用自動裝配,因為自動裝配會産生未知情況,開發人員無法預見最終的裝配結果。

自動裝配是在配置檔案中實作的,如下:

隻需要配置一個@autowired屬性即可完成自動裝配,不用再配置檔案中寫<property>,但是在類中還是要生成依賴對象的setter方法。

autowire的屬性值有如下幾個:

1)byname 按名稱裝配,可以根據屬性的名稱(或者id)在容器中查詢與該屬性名稱(或者id)相同的bean,如果沒有找到,則屬性值為null;

2)bytype 按類型裝配,可以根據屬性類型,在容器中尋找該類型比對的bean,如有多個,則會抛出異常,如果沒有找到,則屬性值為null;如果有多個,使用bean的primary屬性,注意:這個預設就是true,需要把非候選的bean的primary的屬性設定為false。排除某些bean,設定某些bean的autowire-candidate屬性為false。

3)constructor 與bytype方式相似,不同之處在與它應用于構造器參數,如果在容器中沒有找到與構造器參數類型一緻的bean,那麼将抛出異常;

4)autodetect 通過bean類的自省機制(introspection)來決定是使用constructor還是bytype的方式進行自動裝配。首先嘗試使用constructor 進行自動裝配。如果失敗,再嘗試使用bytype的方式。

可選的自動裝配:預設情況下,@autowired具有強契約特性,其所标注的屬性或參數必須是可裝配的,如果沒有,則自動裝配失敗(抛出nosuchbeandefinitionexception)。屬性不一定要裝配,null值也是可以接受的,使用@autowired(required=false)來配置是可選的。

限定歧義性的依賴:使用@qualifier(“bean id”),通過制定bean的id把選擇範圍縮小到隻剩下一個bean。

注意:顯式的指定依賴,比如property和constructor-arg元素,總會覆寫自動裝配。自動裝配的行為可以和依賴檢查結合使用,依賴檢查會在自動裝配完成後發生。

7. di自動檢測(autodiscovery)

配置spring自動檢測bean的定義和自動裝配bean:

<context:component-scan base-package="com.spring.test"/>

預設情況下,<context:component-scan>查找使用構造型注解所标注的類,這些注解如下:

@component 通用的構造型注解,辨別該類為spring元件。

@controller 辨別該類為spring mvc controller。

@repository 辨別該類為資料倉庫,一般作為dao層的注解。

@service 辨別該類為服務,一般作為服務層的注解。

使用@component标注的任意自定義注解。

spring aop

aop的概念以及使用aop機制有什麼好處。

aop的概念是aspect oriented programming面向切面程式設計。

好處:aop将程式分解成各個方面或者說關注點,這使得可以子產品化,相當橫向上分切了。它可以解決oop和過程化方法不能夠很好解決的橫切(cross-cutting)問題,如:事務、安全、日志等橫切關注。

spring+aspectj 實作aop的2種方式:

1) 使用注解(@aspectj)實作aop:

Java Spring的IoC和AOP的知識點速記
Java Spring的IoC和AOP的知識點速記

開啟注解掃描:

注意的是 proxy-target-class="true" 屬性,它的預設值是 false,預設隻能代理接口(使用 jdk 動态代理),當為 true 時,才能代理目标類(使用 cglib 動态代理)。

2)另一種xml配置方式:

Java Spring的IoC和AOP的知識點速記
Java Spring的IoC和AOP的知識點速記

配置:

Java Spring的IoC和AOP的知識點速記
Java Spring的IoC和AOP的知識點速記

使用 <aop:config> 元素來進行 aop 配置,在其子元素中配置切面,包括增強類型、目标方法、切點等資訊。

參考:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/index.html

http://oss.org.cn/ossdocs/framework/spring/zh-cn/beans.html

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

http://www.cnblogs.com/luxiaoxun/p/4625238.html