事前通知

SpringでAspectJ アノテーションサポート有効にする

春の用途のAspectJ 注釈しなければならないクラスパス に含まれているのAspectJ ライブラリ:aopalliance.jar aspectj.weaver.jar 春-aspects.jarを

aop スキーマ<beans> ルート要素に追加します

春IOC コンテナを有効にAspectJの 注釈のサポートを限り豆の中の空の設定ファイルの定義のXML 要素< :AspectJの-自動プロキシAOP >

とき春IOCのコンテナが検出された豆の設定ファイル< AOP:AspectJの-自動プロキシ> 要素と自動的にAspectJの 部分一致Beanのプロキシを作成します

AspectJ アノテーションを使用してアスペクトを宣言する

春の声明のAspectJ セクションのみIOC 文のカットコンテナへのBean インスタンスときに春IOCの初期化コンテナAspectJの カットの後、春IOCのコンテナは、とのそれらのためになるのAspectJ と一致するセクションBeanのプロキシを作成します

AspectJ 注釈ちょうどでカット@Aspectは、注釈付きのJava クラスを

通知は、なんらかの注釈が付けられた単純なJava メソッドです。

AspectJ 5 種類の通知アノテーションをサポートします

@Before:事前通知メソッド実行の前に実行

@After:メソッドの実行後実行される通知通知

@ AfterReturning 戻り通知メソッドが結果を返した後実行されます

@ AfterThrowing 異常の通知後の方法でスロー

@アラウンド:サラウンド通知アラウンドメソッドを実行

事前通知

事前通知メソッドが実行される前に実行される通知

使用前通知@Beforeのノートノートの値の表現として値とエントリポイント

メソッドシグネチャを使用AspectJ ポイントカット式記述

最も一般的なポイントカット式は、メソッドのシグネチャに従ってさまざまなメソッドに一致します

実行* com.atguigu.spring.ArithmeticCalculator *(..):マッチArithmeticCalculator すべてのメソッド宣言第一改質剤及び*は任意の戻り値を表している第二*は任意の方法を表す.. 任意の数と一致しますパラメータターゲットクラスと同じパッケージ内のインタフェースセクション場合はパッケージ名を省略することができます

execution public * ArithmeticCalculator。*(..):ArithmeticCalculator インターフェースのすべてのpublicメソッドに一致ます

実行public double ArithmeticCalculator。*(..):ArithmeticCalculatorでdouble 型の値返す方法一致

実行public double ArithmeticCalculator。*(double、..):最初のパラメーターの型がdoubleであるメソッドに一致ます.. 任意の型の任意の数のパラメーターに一致します

実行公共ダブルArithmeticCalculator *(。ダブルダブル):タイプのマッチングパラメータダブル、ダブルタイプの方法

ポイントカット式をマージする

ではAspectJの 事業者によるポイントカット表現&&、|| ,! コンバインド

現在の接続ポイントの詳細に通知します

タイプの通知方法で宣言できジョインポイントの パラメータそして、あなたは細部へのリンクにアクセスすることができますメソッド名とパラメータ値

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
	
	<!-- 开启注解扫描 -->
	<context:component-scan base-package="com.learn.spring.aspectJ"></context:component-
scan>
	
	<!-- 基于注解开发开启aop自动代理-->
	<aop:aspectj-autoproxy/>
</beans>
package com.learn.spring.aspectJ;

public interface ArithmeticCalculator {
	public  int add(int i, int j );
	public  int sub(int i, int j );
	public  int mul(int i, int j );
	public  int div(int i, int j );
} 
package com.learn.spring.aspectJ;

import org.springframework.stereotype.Component;

@Component
public class ArithmeticCalculatorImpl implements ArithmeticCalculator {

	@Override
	public int add(int i, int j) {
		int result = i + j ;
		return result;
	}

	@Override
	public int sub(int i, int j) {
		int result = i - j ;
		return result;	
	}

	@Override
	public int mul(int i, int j) {
		int result = i * j ;
		return result;
	}

	@Override
	public int div(int i, int j) {
		int result = i / j ;
		return result;
	}
	
}
package com.learn.spring.aspectJ;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 日志切面
 */
@Component  //标识为组件
@Aspect  //标识为切面
@Order(3)  //指定切面的优先级. 值越小,优先级越高. 标注@Order的切面比不标注@Order切面的优先级高
public class LoggingAspect {

	/**
	 * 通知:  前置   后置   返回   异常  环绕
	 */	
		
	/**
	 * 前置通知: 在方法执行之前执行.
	 * JoinPoint:连接点对象  包含了连接点相关的信息:方法名   方法的参数等....
	 */
	//@Before("execution(public int com.learn.spring.aspectJ.ArithmeticCalculator.add(int,int))")
	//@Before("execution(public int com.learn.spring.aspectJ.ArithmeticCalculator.*(int,int))")
	//任意修饰符任意返回值  com.learn.spring.aspectJ包下的任意类的任意方法   任意参数
	//@Before("execution(* com.learn.spring.aspectJ.*.*(..))")
	@Before("suibian()")
	public void beforeMethod(JoinPoint joinPoint){
		//获取方法名:
		String methodName = joinPoint.getSignature().getName();
		//获取参数
		Object [] args = joinPoint.getArgs();
		System.out.println("The method "+methodName+" begins with "+ Arrays.asList(args));
	}
	
}

package com.learn.spring.aspectJ;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
	public static void main(String[] args) {
		ApplicationContext ctx = 
				new ClassPathXmlApplicationContext("spring-aspectJ.xml");
		ArithmeticCalculator ac = 
				(ArithmeticCalculator)ctx.getBean("arithmeticCalculatorImpl");
		System.out.println(ac.getClass().getName());
		int result = ac.div(2, 1);
		System.out.println("AspectJ-result====>:"+result);
	}
}

 

 

 

 

 

 

元の記事2545件を公開 賞賛 された66件 表示回数21万回

おすすめ

転載: blog.csdn.net/Leon_Jinhai_Sun/article/details/105570132