1.重新定义SomeService接口和SomeServiceImpl类
package com.bjpowernode.ba05;
public interface SomeService {
void doSome(String name,Integer age);
String doOther(String name,Integer age);
String doFirst(String name,Integer age);
void doSecond();
void doThird();
}
package com.bjpowernode.ba05;
//目标类
public class SomeServiceImpl implements SomeService {
@Override
public void doSome(String name,Integer age) {
//给doSome方法增加一个功能,在doSome()执行之前,输出方法执行的时间
System.out.println("====目标方法doSome()执行====");
}
@Override
public String doOther(String name, Integer age) {
System.out.println("====目标方法doOther()执行====");
return "abcd";
}
@Override
public String doFirst(String name, Integer age) {
System.out.println("====业务方法doFirst()执行====");
return "doFirst";
}
@Override
public void doSecond() {
System.out.println("====业务方法doSecond()执行====" + (10/0));
}
@Override
public void doThird() {
System.out.println("====业务方法doThird()执行====");
}
}
2.写切面类
package com.bjpowernode.ba05;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
/**
* @Aspect : 是aspectj框架中的注解。
* 作用:表示当前类是切面类。
* 切面类:是用来给业务方法增加功能的类,在这个类中有切面的功能代码
* 位置:在类定义的上面
*/
@Aspect
public class MyAspect {
/**
* 最终通知方法的定义格式
* 1.public
* 2.没有返回值
* 3.方法名称自定义
* 4.方法没有参数, 如果还有是JoinPoint,
*/
/**
* @After :最终通知
* 属性: value 切入点表达式
* 位置: 在方法的上面
* 特点:
* 1.总是会执行
* 2.在目标方法之后执行的
*
* try{
* SomeServiceImpl.doThird(..)
* }catch(Exception e){
*
* }finally{
* myAfter()
* }
*
*/
@After(value = "execution(* *..SomeServiceImpl.doThird(..))")
public void myAfter(){
System.out.println("执行最终通知,总是会被执行的代码");
//一般做资源清除工作的。
}
}
3.写测试类