Spring-AOP注解与方法规则实例

一、前言

在实际开发中,我们非常多操作须要拦截来解决这个问题。比如我们老生常谈的日志和方法操作的一些统计。我这里做一个aop样例。以供自己和大家有用起来方便。

本文主要有两种方式解决aop:1、有用注解 2、有用方法规则方法

两种方式都是基于java文件的。为什么没有基于xml。由于xml已经out于太繁琐,比較不是全项目的拦截,所以不用xml配置。

项目链接地址:点击打开链接   https://github.com/yangchangyong0/springaopTest

二、使用注解实现aop

2.1 首先编写注解类

package com.ycy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by ycy on 16/4/8.
 * 编写拦截的注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Action {
    String name();
}

2.2 对须要拦截方法加注解

package com.ycy.annotation;

import org.springframework.stereotype.Service;

/**
 * Created by ycy on 16/4/8.\
 * 对须要注解的方法加上注解
 */
@Service
public class DemoAnnotationService {
    @Action(name = "注解连接add方法操作")
    public void add(){
        System.out.println("DemoAnnotationService运行add方法");
    }
}

三、用法规则实现aop


3.1 直接编写类(不须要不论什么其它操作)

package com.ycy.method;

import org.springframework.stereotype.Service;

/**
 * Created by ycy on 16/4/8.
 * 直接编写类,不须要其它不论什么操作
 */
@Service
public class DemoMethodService {
    public void add(){
        System.out.println("DemoMethodService运行add方法");
    }
}

四、aop切面编写

在切面中。我们使用after 与before 。将两种拦截切面都做了拦截。


package com.ycy.aop;

import com.ycy.annotation.Action;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
//
/**
 * Created by ycy on 16/4/8.
 */
@Aspect//1
@Component//2
public class LogAspect {
    /*拦截累切点编写*/
    @Pointcut("@annotation(com.ycy.annotation.Action)")//3
    public  void annotationPointCut(){
        System.out.println("開始拦截--可是不打印");
    }
    /*使用注解方法拦截*/
    @After("annotationPointCut()")
    public void after(JoinPoint joinPoint){
        MethodSignature signature=(MethodSignature)joinPoint.getSignature();
        Method method=signature.getMethod();
        Action action=method.getAnnotation(Action.class);
        System.out.println("注解拦截方式:"+action.name());//5
    }

    /*用法规则拦截*/
    @Before("execution(* com.ycy.method.DemoMethodService.*(..))")//6
    public void before(JoinPoint joinPoint){
        MethodSignature signature=(MethodSignature)joinPoint.getSignature();
        Method method=signature.getMethod();
        System.out.println("方法规则拦截方式:"+method.getName());
    }
}


在使用spring框架配置AOP的时候,无论是通过XML配置文件还是注解的方式都须要定义pointcut"切入点"
比如定义切入点表达式 execution(* com.sample.service.impl..*.*(..))
execution()是最经常使用的切点函数,其语法例如以下所看到的:
 整个表达式能够分为五个部分:
 1、execution(): 表达式主体。
 2、第一个*号:表示返回类型,*号表示全部的类型。
 3、包名:表示须要拦截的包名。后面的两个句点表示当前包和当前包的全部子包。com.sample.service.impl包、子孙包下全部类的方法。
 4、第二个*号:表示类名,*号表示全部的类。
 5、*(..):最后这个星号表示方法名。*号表示全部的方法,后面括弧里面表示方法的參数,两个句点表示不论什么參数。



五、測试代码

package com.ycy.main;

import com.ycy.annotation.DemoAnnotationService;
import com.ycy.method.DemoMethodService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * Created by ycy on 16/4/8.
 * 1使用扫描注解方法建立context
 * 然后运行我们的两个測试方法
 */
@Configuration
@ComponentScan("com.ycy")
@EnableAspectJAutoProxy//1
public class AopconfigTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopconfigTest.class);
        DemoAnnotationService demoAnnotationService = context.getBean(DemoAnnotationService.class);

        DemoMethodService demoMethodService = context.getBean(DemoMethodService.class);

        demoAnnotationService.add();

        demoMethodService.add();
    }
}

測试结果输出
DemoAnnotationService运行add方法
注解拦截方式:注解连接add方法操作
方法规则拦截方式:add
DemoMethodService运行add方法

Process finished with exit code 0





posted @ 2017-07-18 10:08  jzdwajue  阅读(153)  评论(0编辑  收藏  举报