眾所周知,spring有兩大特性:ioc和aop。
ioc:英文全稱是inversion of control,意為控制反轉/依賴注入。
aop:英文全稱是aspect-oriented programming,意為面向切面程式設計。
總的來說,spring是乙個輕量級的控制反轉(ioc)和面向切面程式設計(aop)的容器框架.
註解名稱
備註@controller
標註控制層
@service
標註服務層
@component
標註此類是spring管理的元件
@autowired
按型別自動裝配
@resource
按名稱自動裝配
通常我們例項化乙個物件時,都是使用類的構造方法new乙個物件,這個過程是我們自己來控制的,而ioc是把new物件的工作交給了spring容器。
依賴注入
spring依賴注入的方式主要有4個:基於註解注入方式、set注入方式、構造器注入、靜態方法注入。目前大都使用的是註解注入,配置少,比較方便。
控制層
@controller
public class userscontroller
我們可以使用@autowired或@resource來裝配bean,它們的區別在於:
@autowired預設按型別自動裝配,預設要求依賴物件必須存在,如果要允許為null,需設定required = false
@controller
public class userscontroller
@resource預設按名稱自動裝配,名稱可以通過name屬性來指定,如果不指定,當註解寫在字段上,預設取欄位名進行裝配;
如果寫在setter方法上,預設取屬性名進行裝配。當找不到與名稱相匹配的bean時,會按照型別進行裝配。
服務層
@service
public class usersserviceimpl implements usersservice
面向切面程式設計,通俗的講共有功能的實現。
比如:每個介面都會呼叫方法,我們想記錄這些呼叫返回的資訊,不需要每乙個都進行日誌或其他方式記錄,通過aop的概念,處理一次即可。
註解名稱
備註@before
前置通知,在方法呼叫前執行
@after
後置通知,在方法呼叫後執行
@around
環繞通知,包裹了被通知的方法,在被通知的方法呼叫之前之後執行自定義的行為。
@afterreturning
返回通知,目標方法成功執行後呼叫通知
@afterthrowing
異常通知,在目標方法丟擲異常後呼叫通知
任意公共方法的執行:
execution(public * *(..))
任何乙個以「set」開始的方法的執行:
execution(* set*(..))
accountservice 介面的任意方法的執行:
execution(* com.xyz.service.accountservice.*(..))
定義在service包裡的任意方法的執行:
execution(* com.xyz.service.*.*(..))
定義在service包和所有子包裡的任意類的任意方法的執行:
execution(* com.xyz.service..*.*(..))
第一步:引入依賴
org.springframework.boot
spring-boot-starter-aop
建立乙個類
@log4j2
@aspect
@component
public class aoptest
/*** 前置通知
* @param joinpoint
*/@before("aoptest()")
public void dobefore(joinpoint joinpoint)",joinpoint.getsignature().getname());
listparams=arrays.aslist(joinpoint.getargs());
log.info("輸入引數為:{}",params);
}/**
* 後置通知
* @param joinpoint
*/@after("aoptest()")
public void doafter(joinpoint joinpoint)",joinpoint.getsignature().getname());}}
寫乙個get的測試方法
輸入引數在進行輸出,呼叫檢視下效果
接下來重點介紹下@around,環繞通知,該方法可以包含@before、@after、@afterthrowing、@afterrunning。
環繞通知的功能最全面,需要攜帶proceedingjoinpoint 型別的引數,且必須有返回值,返回值為目標方法的返回值。
示例如下:
/**
* 環繞通知
* @param joinpoint
* @return
*/@around("aoptest()")
public object doaround(proceedingjoinpoint joinpoint),方法引數:{}",methodname,arrays.aslist(joinpoint.getargs()));
//執行目標方法
try ",result);
} catch (throwable throwable) ",methodname);
throwable.printstacktrace();
}//4.後置通知
log.error("後置通知*****>{}",methodname);
return result;
}
呼叫方法
可以看到環繞通知包含了4中通知方法
至此spring的兩大特性就介紹完了。
如果您覺得有用,記得關注下哦。
深入理解Spring的兩大特徵(IOC和AOP)
1.降低了元件之間的耦合性 實現了軟體各層之間的解耦 2.可以使用容易提供的眾多服務,如事務管理,訊息服務等 3.容器提供單例模式支援 4.容器提供了aop技術,利用它很容易實現如許可權攔截,執行期監控等功能 5.容器提供了眾多的輔助類,能加快應用的開發 6.spring對於主流的應用框架提供了整合...
django中queryset的兩大特性
roles roleinfo.objects.all 建立查詢集的時候,是不會訪問資料庫的,直到真正的呼叫資料的時候,才會訪問資料庫,所以 roles roleinfo.objects.all 沒有真正的進行資料庫查詢的,只是建立了乙個資料庫查詢集 呼叫資料,真正的使用資料 1 迭代 2 序列化 3...
spring兩大核心之一(ioc)
spring兩大核心之一 ioc ioc 控制反轉,依賴注入。將物件的管理權交給sping工廠管理,也就是說從以前的new物件 建立物件 到現在的將物件交給spring工廠通過配置或掃瞄 建立物件 顧名思義 就是換種方式建立物件。使用依賴注入能更好的使模組之間解耦。案例 person person ...