SpringAOP的注解实现

  作者:记性不好的阁主

环境依赖


spring基础包
 commons-logging-1.1.3.jar
 spring-beans-4.0.0.RELEASE.jar
 spring-context-4.0.0.RELEASE.jar
 spring-core-4.0.0.RELEASE.jar
 spring-expression-4.0.0.RELEASE.jar
面向切面包
 spring-aop-4.0.0.RELEASE.jar
 spring-aspects-4.0.0.RELEASE.jar
加强版面向切面包
 com.springsource.net.sf.cglib-2.2.0.jar
 com.springsource.org.aopalliance-1.0.0.jar
 com.springsource.org.aspectj.weaver-1.6.4.RELEASE.jar


计算器日志例


1、定义接口:


public interface Calculator {
    public int add(int a,int b);
    public int sub(int a,int b);
    public int mul(int a,int b);
    public int div(int a,int b);
}


2、定义实现类:


@Service
public class MyCalculator implements Calculator{


    @Override
    public int add(int a, int b) {
        return a+b;
    }

    @Override
    public int sub(int a, int b) {
        return a-b;
    }

    @Override
    public int mul(int a, int b) {
        return a*b;
    }

    @Override
    public int div(int a, int b) {
        return a/b;
    }
}


3、定义切面类:


@Aspect
@Component
public class LogUtils {


    //想在执行目标方法之前
    //写切入点表达式 execution(访问权限符 返回值类型 方法签名)
    @Before('execution(public int comm.myaop.Calculator.MyCalculator.*(int,int))') //*表示所有方法
    public static void LogStart(){
        System.out.println('【xxx】方法开始执行');
    }
    //想在目标方法正常执行之后
    @AfterReturning('execution(public int comm.myaop.Calculator.MyCalculator.*(int,int))')
    public static void LogReturn(){
        System.out.println('【xxx】方法正常执行完成');
    }
    //想在目标方法异常之后执行
    @AfterThrowing('execution(public int comm.myaop.Calculator.MyCalculator.*(int,int))')
    public static void LogException(){
        System.out.println('【xxx】方法出现异常,异常信息是:');

    }
    //想在目标方法结束之后执行
    @After('execution(public int comm.myaop.Calculator.MyCalculator.*(int,int))')
    public static void End(){
        System.out.println('【xxx】方法结束了');
    }
}


4、配置SpringIOC容器


<!--    扫描包下的注解(Component Controller Service Repository)-->
        <context:component-scan base-package='comm.myaop'></context:component-scan>

<!-- 开启注解对AOP的支持-->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

    

5、测试


public class Test01 {
    private static ApplicationContext ioc = new ClassPathXmlApplicationContext('applicationContext.xml');

    public static void main(String[] args) {

// 1、从ioc容器中拿到目标对象,注意如果想要用类型,一定用它的接口,不要用它本类
        Calculator bean = ioc.getBean(Calculator.class);
        bean.add(1,2);
// 2、从ioc容器中拿到目标对象,使用组件id(类名首字母小写)
        // Calculator bean2 = (Calculator)ioc.getBean('myCalculator');
        // System.out.println(bean2);
        // System.out.println(bean2.getClass());
        //bean.add(1,2);
    }
}



切入点表达式

1、匹配全类下有两个int参数的方法

execution(public int comm.myaop.Calculator.MyCalculator.*(int,int))

2、匹配全类下第一个是Int第二个是任意类型的方法

execution(public int comm.myaop.Calculator.MyCalculator.*(int,*)

3、匹配类名以My开头r结尾的两个Int参数的方法

execution(public int comm.myaop.Calculator.My*r.*(int,int))

4、匹配任意个参数任意类型的方法

execution(public int comm.myaop.Calculator.MyCalculator.*(..))

5、匹配一层路径下的所有带两个int参数的方法

execution(public int comm.myaop.Calculator.*.*(int,int))

6、匹配多层路径下的所有带两个int参数的方法

execution(public int comm.myaop.Calculator..*(int,int))

还支持"&&"、"||"、“|”等逻辑匹配



相关推荐

评论 抢沙发

表情

分类选择