AOPとは何ですか
AOPを意味し、アスペクト指向プログラミングのための略語です:アスペクト指向プログラミングを、春には、ビジネスロジックとシステムレベルのサービスの分離による凝集アプリケーションの開発を可能に、アスペクト指向プログラミングのための豊富なサポートを提供します。
なぜAOP
何よりも - ビジネスロジックを完了するために - Applicationオブジェクトは、彼らが行う必要があります実現しています。AOPは、ビジネスロジックは、部品間の結合の程度を低減簡素化し、開発の効率を向上させるためのプログラム、コードの再利用性を向上させるように、ビジネス・ロジックの各部分を分離するために使用することができます。あなたがAOPを使用しない場合は、例えば、以下のビジネス・ロジック・コード:
package cn.jingpengchong.calculator.service;
import org.springframework.stereotype.Service;
@Service
public class CalculatorService implements ICalculatorService {
public int div(int a, int b) {
System.out.println("日志:The div method begins");
System.out.println("日志:The div method args:["+a+","+b+"]");
return a/b;
}
}
この実施例は、Spring AOP機能を使用しないので、唯一の主な方法は、「/ B戻り、」ログ情報を印刷するために、しかし、このいずれかを、それは、コードの2行を取る特にバルキーです。私たちは、その後拡大し、乗算機能している場合、あなたはまだ非常に面倒である2行のコードを、記述する必要があります。それでは、どのような複雑なものを解決するには?もちろん、それは春が提供するAOP機能を使用することです。
使用注釈:AOPを使用する方法
現在のプロジェクトに必要なjarパッケージの後、最初にXML構成ファイル「<AOP:AspectJの-自動プロキシ/>」に充電ビジネスプロセスは、(独立したカッティングモジュール(また、セクションとも呼ばれる)、エントリポイントを必要とするブロックの調製に続いてタグ法)、「@Aspect」注釈を追加したクラス前IOCコンテナ別注釈モジュールにスキャンすることができ、追加の注釈は、従来の方法では、エントリポイントに対応する方法の処理、すなわち
エントリポイントの前に備考には、次のとおりです。
- @Before(値=「」):前処理、マッチングアノテーションの方法を実行する前にいくつかの操作のために、
- @After(値=「」):後処理、マッチングアノテーションの方法の実行中にいくつかの操作を実行します。
- (値=「」、復帰=「」)@AfterReturning:方法でいくつかの動作を実行するための復帰処理は、マッチング注釈の結果を返します。
- (値=「」、投げを=「」)@AfterThrowing:復帰後注釈マッチング方法の例外処理、何らかの異常。
- @Around(値=「」):サラウンド処理は、オンデマンドでコード自己関連リンクで処理することができます。
注意:
- 処理すべき属性値を一致させるための方法。
- 戻り値の属性を受信するための手段を返します。
- 例外オブジェクトを受信するための属性を投げます。
- @Afterと@AfterReturning違い:
- 注釈付きメソッドは、メソッド@AfterReturningアノテーション前に行わ@After。
- @例外の顔には、まだ注釈付き実行しますが、後の方法は、注釈付き@AfterReturning方法はありません。
例:使用した@前、後@、@ AfterReturning @Around注釈及び処理方法上記サービス層のすべての側面を行います
1、サービスレイヤコード印刷ログの方法は、削除しました
package cn.jingpengchong.calculator.service;
import org.springframework.stereotype.Service;
@Service
public class CalculatorService implements ICalculatorService {
public int div(int a, int b) {
return a/b;
}
}
2、春のXMLファイルにラベルを追加:自動プロキシ
<aop:aspectj-autoproxy/>
3、に新しいファイル「CalculatorService.java」新しい独立したモジュール「cn.jingpengchong.aspect」、次のように:
package cn.jingpengchong.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class CalculatorAspect {
//前置处理
@Before("execution(public int cn.jingpengchong.calculator.service.CalculatorService.*(..))")
public void before(JoinPoint jp) {
Object[] args = jp.getArgs();
Signature signature = jp.getSignature();
String name = signature.getName();
System.out.println("日志:The " + name + " method begins");
System.out.println("日志:The " + name + " method args:[" + args[0] + "," + args[1] + "]");
}
//后置处理
@After("execution(public int cn.jingpengchong.calculator.service.CalculatorService.*(..))")
public void after(JoinPoint jp) {
Signature signature = jp.getSignature();
String name = signature.getName();
System.out.println("日志:The " + name + " method ends");
}
//返回处理
@AfterReturning(value = "execution(public int cn.jingpengchong.calculator.service.CalculatorService.*(..))", returning = "result")
public void afterReturning(JoinPoint jp, Object result) {
Signature signature = jp.getSignature();
String name = signature.getName();
System.out.println("日志:The " + name + " method result:" + result);
}
//异常处理
@AfterThrowing(value = "execution(public int cn.jingpengchong.calculator.service.CalculatorService.*(..))", throwing = "e")
public void afterThrowing(JoinPoint jp, Exception e) {
Signature signature = jp.getSignature();
String name = signature.getName();
System.out.println("日志:The " + name + " method exception:" + e);
}
}
4、試験の種類の調製:
package cn.jingpengchong.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.jingpengchong.calculator.service.ICalculatorService;
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
ICalculatorService calculatorService = applicationContext.getBean(ICalculatorService.class);
System.out.println(calculatorService.div(6, 2));
applicationContext.close();
}
}
結果は以下の通りであります:
添付ファイル:
1、それぞれの方法では、上記の「CalculatorService.java」ファイルが、長い引数でメモを書く必要があり、我々はこれらのアノテーションのパラメータを抽出するために、カットオフポイントでファイルを定義することができます。
@Pointcut("execution(public int cn.jingpengchong.calculator.service.CalculatorService.*(..))")
public void pointCut() {
}
この場合、上記のコメントのパラメータは、さらに、コードを簡略化するために、「ポイントカット()」を書き込むことができます。
2、その方法があまりにもあれば面倒なあなたは一つの方法でカプセル化された「@Around」注釈プロセスを使用することができ、「CalculatorService.java」ファイルでは4を定義します。
//环绕处理
@Around("pointCut()")
public Object around(ProceedingJoinPoint pjp) {
Object result = null;
Object[] args = pjp.getArgs();
String name = pjp.getSignature().getName();
try {
try {
//前置处理
System.out.println("The " + name + " method begins");
System.out.println("The " + name + " method args:[" + args[0] + "," + args[1] + "]");
result = pjp.proceed();
}finally {
//后置处理
System.out.println("The " + name + " method ends");
}
//返回处理
System.out.println("The " + name + " method result:" + result);
} catch (Throwable e) {
//异常处理
System.out.println("The " + name + " method exception:" + e);
}
return result;
}
AOPを使用する方法:春を使用してXML設定ファイル
また、現在のプロジェクトに必要なjarパッケージを必要とします
例として図1に示すように、依然としてログ処理サービスレイヤー法:
package cn.jingpengchong.calculator.service;
import org.springframework.stereotype.Service;
@Service
public class CalculatorService implements ICalculatorService {
public int div(int a, int b) {
return a/b;
}
}
2、に新しいファイル「LogAspect.java」新しい独立したモジュール「cn.jingpengchong.aspect」、次のように:
package cn.jingpengchong.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
public class LogAspect {
public void before(JoinPoint jp) {
Object[] args = jp.getArgs();
Signature signature = jp.getSignature();
String name = signature.getName();
System.out.println("日志:The " + name + " method begins");
System.out.println("日志:The " + name + " method args:[" + args[0] + "," + args[1] + "]");
}
}
3、次の構成Spring XML構成ファイル:
<?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/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.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<context:component-scan base-package="cn.jingpengchong"></context:component-scan>
<bean id = "logAspect" class = "cn.jingpengchong.aspect.LogAspect"/>
<aop:config>
<!--该标签是为了简化代码,指定一个id来表示该表达式,下面再引用时,直接用该id就行了-->
<aop:pointcut expression="execution(public int cn.jingpengchong.calculator.service.CalculatorService.*(..))" id="pointCut"/>
<aop:aspect ref="logAspect">
<!--以前置处理为例,其他处理类似-->
<aop:before method="before" pointcut-ref="pointCut"/>
</aop:aspect>
</aop:config>
</beans>
4、試験の種類の調製:
package cn.jingpengchong.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.jingpengchong.calculator.service.ICalculatorService;
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
ICalculatorService calculatorService = applicationContext.getBean(ICalculatorService.class);
System.out.println(calculatorService.div(6, 2));
applicationContext.close();
}
}
結果は以下の通りであります: