Spring基於註解的零配置方式的面向切面程式設計

2021-08-08 02:25:36 字數 4223 閱讀 2950

一、概述

spring在此只是使用了和aspectj一樣的註解,但並沒有使用aspectj的編譯器或者織入器,底層依然使用的是spring aop,依然是在執行時動態生成aop**,並不依賴aspectj的編譯器或者織入器。

二、例子與注釋

1、定義aspect與@before增強處理

package com.aspect.service;

//定義乙個介面

public

inte***ce hello

定義乙個切面bean

當啟動@aspect支援後,只要在spring容器配置乙個帶@aspect註解的bean,spring會自動識別該bean,並將該bean作為切面處理

package com.aspect.service;

import org.aspectj.lang.annotation.after;

import org.aspectj.lang.annotation.aspect;

import org.aspectj.lang.annotation.before;

import org.aspectj.lang.annotation.pointcut;

//定義乙個切面類,用@aspect修飾,表示這個為切入類

@aspect

public

class authaspect

//@before增強處理,指定切入點

@before("select()")

public

void

authority()

@before("select()")

public

void

init()

@after("select()")

public

void

destory()

}目標方法:

package com.aspect.service.impl;

import org.springframework.stereotype.component;

import com.aspect.service.hello;

@component("helloimpl") //注入bean

public

class helloimpl implements hello

public

void

adduser(string name, string pass)

}配置檔案:

base-package="com.aspect.service,com.aspect.service.impl,com.home.bean,com.home.model">

"annotation" expression="org.aspectj.lang.annotation.aspect"/>

"regex" expression=".*teacherconfig"/>

"assignable" expression="org.springframework.context.support.resourcebundlemessagesource"/>

"regex" expression="com.home.model.c*"/>

測試類:

package com.aspect.service.impl;

public

class implhellotest

}輸出如下:

啟動測試

模擬執行許可權檢查

執行hello元件的sayhello()方法

結束測試後

執行hello元件的adduser新增使用者:xieyongxue

模擬方法結束後釋放資源...

2.其他幾個增強處理具體示例

1.before:前置通知(應用:各種校驗)

在方法執行前執行,如果通知丟擲異常,阻止方法執行

2.afterreturning:後置通知(應用:常規資料處理)

方法正常返回後執行,如果方法中丟擲異常,通知無法執行

必須在方法執行後才執行,所以可以獲得方法的返回值。

3.around:環繞通知(應用:十分強大,可以做任何事情) 【掌握】

方法執行前後分別執行,可以阻止方法的執行。要求必須手動的執行目標方法。

4.afterthrowing:丟擲異常通知(應用:包裝異常資訊)

方法丟擲異常後執行,如果方法沒有丟擲異常,無法執行

5.after:最終通知(應用:清理現場)

方法執行完畢後執行,無論方法中是否出現異常

package com.aspect.service;

import org.aspectj.lang.annotation.after;

import org.aspectj.lang.annotation.afterreturning;

import org.aspectj.lang.annotation.afterthrowing;

import org.aspectj.lang.annotation.aspect;

@aspect

public

class

logaspect

@afterthrowing(throwing="ex",pointcut="execution(* *.adduser(..))")

public

void

throwmsg(throwable ex)

@after("execution(* *.adduser(..))")

public

void

release()

}package com.aspect.service;

import org.aspectj.lang.proceedingjoinpoint;

import org.aspectj.lang.annotation.around;

import org.aspectj.lang.annotation.aspect;

@aspect

public

class

txaspect

//以改變後的引數去執行目標方法,並儲存目標方法執行後的引數

object rvt=jp.proceed(args);

system.out.println("執行目標方法後,模擬結束事務。。。。");

//如果rvt的型別是integer,將rvt改為它的平方,用於改變目標方法的返回值

if(rvt!=null && rvt instanceof integer)

return rvt;

}}package com.aspect.service.impl;

import org.springframework.stereotype.component;

import com.aspect.service.hello;

@component

public

class

world

implements

hello

public

void

adduser(string name, string pass)

}public

intadduser(int rvt)

return rvt;

}public

intaddpersons(int rvt)

}測試類:

package com.aspect.service.impl;

public

class

worldtest

}輸出:

執行帶返回值的adduser方法:20

獲取目標方法返回值:20

模擬記錄日誌功能...

模擬方法結束後釋放資源...

執行hello元件的adduser的方法

模擬方法結束後釋放資源...

執行目標方法之前開始模式事務....

執行帶返回值的addperson()方法:20

執行目標方法後,模擬結束事務。。。。

執行目標方法之前開始模式事務....

執行帶返回值的addperson()方法:20

執行目標方法後,模擬結束事務。。。。

addpersons的返回值為:400

spring 基於註解的spring配置

spring是乙個基於ioc和aop的結構j2ee系統的框架 ioc 反轉控制 是spring的基礎,inversion of control 簡單說就是建立物件由以前的程式設計師自己new 構造方法來呼叫,變成了交由spring建立物件 di 依賴注入 dependency inject.簡單地說...

基於註解配置spring

1 對 bean 的標註基於註解方式有3個註解 2 想要 spring 獲得基於註解的bean 需要配置 進行掃瞄,並從註解中獲得配置資訊。3 自動裝配 bean 使用 autowired 註解實現 bean 的依賴注入。autowired 預設按照型別匹配 bytype 的方式在容器中查詢匹配的b...

Spring 基於註解的配置

從 spring 2.5 開始就可以使用註解來配置依賴注入。而不是採用 xml 來描述乙個 bean 連線,你可以使用相關類,方法或字段宣告的註解,將 bean 配置移動到元件類本身。在 xml 注入之前進行註解注入,因此後者的配置將通過兩種方式的屬性連線被前者重寫。註解連線在預設情況下在 spri...