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);
}
}