AOPの良いアイデアは、私たちは私たちは、以前にプロキシクラス春AOPの統合による伐採コードとコード完全に別のビジネス層を、前述のような、コードのデカップリングを達成することができます。態様のクラスでは、ばねは元のエントリ・ポイントの関連情報への良好なアクセスを提供するインターフェースを介しことができます。
まず第一に、私たちはコードから続行します
ビジネス層のコードをそのStudentServiceImpl
@Service("studentService")
public class StudentServiceImpl implements StudentService {
@Override
public int addStudent(Student student) throws Exception {
System.out.println("addStudent...业务层代码执行...");
return 1;
}
@Override
public int deleteStudent(Integer id) throws Exception{
System.out.println("deleteStudent...业务层代码执行...");
int i = 1/0;
return 0;
}
}
カットクラスStudentServiceLogger
@Aspect
@Component
public class StudentServiceLogger {
@Before("execution(* com.wuwl.service.impl.StudentServiceImpl.*(..) )")
public void doBefore(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName+"方法执行前...");
System.out.println("参数为:"+ Arrays.asList(args));
}
@After("execution(* com.wuwl.service.impl.StudentServiceImpl.*(..) )")
public void doAfter(JoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName+"方法执行后...");
}
@AfterReturning(value = "execution(* com.wuwl.service.impl.StudentServiceImpl.*(..) )" , returning = "returning")
public void doReturn(JoinPoint joinPoint,Object returning){
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName+"方法返回,返回值为:"+returning);
}
@AfterThrowing(value = "execution(* com.wuwl.service.impl.StudentServiceImpl.*(..) )",throwing = "ex")
public void doThrow(JoinPoint joinPoint,Exception ex){
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName+"方法异常,异常信息为:"+ex.getMessage());
}
}
テストクラスAopTest
public class AopTest {
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
@Test
public void test1() throws Exception {
StudentService studentService = ac.getBean("studentService",StudentService.class);
studentService.addStudent(new Student());
System.out.println("==================割===============");
studentService.deleteStudent(1);
}
}
最後に、ログ出力
addStudent方法执行前...
参数为:[com.wuwl.domain.Student@7e5c856f]
addStudent...业务层代码执行...
addStudent方法执行后...
addStudent方法返回,返回值为:1
==================割===============
deleteStudent方法执行前...
参数为:[1]
deleteStudent...业务层代码执行...
deleteStudent方法执行后...
deleteStudent方法异常,异常信息为:/ by zero
ウェル内にカプセル化されたエントリポイント法、春についての関連情報org.aspectj.lang.JoinPoint
ここで注意することは、インタフェースがでていることであるorg.aopalliance.intercept
次のパッケージ、またその名前のインターフェイスを持って、誤解されることはありません。
joinPoint.getArgs()
パラメータ情報は、メソッドを返すことができる戻り値の切断方法は、トラバースを得る配列である; joinPoint.getSignature()
方法署名方法、インタフェース名などを含む署名方法情報の戻り値。
あなたがメソッドの戻り値または例外情報を通知する切断方法で取得する必要がある場合は、対応するジョブに対応するプロパティアノテーションを使用する必要があります。注釈を開く@AfterReturningすることがわかるString returning() default "";
オペレーションコード通知処理の上記の方法を参照して、パラメータを戻り値にアノテーションカット宣言され、戻り値パラメータを追加し、プロパティ。同様にあなたは注釈@AfterThrowing使用できるString throwing() default "";
属性を、あなたはカット方法がスロー異常に取得することができます。