面向切面拦截,主要分为基于注解的拦截与基于方法规则的拦截。
一:添加Spring和AOP相关的依赖
<properties> <java.version>1.7</java.version> <spring-framework.version>4.1.5.RELEASE</spring-framework.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-framework.version}</version> </dependency> <!-- spring aop支持 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring-framework.version}</version> </dependency> <!-- aspectj支持 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.6</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.5</version> </dependency>
二:编写拦截规则的注解(配置此注解的地方都会被拦截)
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Action { String name(); }
三:编写使用注解的被拦截类
import org.springframework.stereotype.Service; @Service public class DemoAnnotationService { @Action(name="注解式拦截的add操作") public void add(){} }
四:编写基于方法规则被拦截的类
import org.springframework.stereotype.Service; @Service public class DemoMethodService { public void add(){} }
五:编写切面
import java.lang.reflect.Method; 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; @Aspect //声明一个切面 @Component public class LogAspect { @Pointcut("@annotation(com.flysun.Action)") //声明切点,为配置Action注解的地方都会拦截 public void annotationPointCut(){}; @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()); //通过反射获得注解上的属性,然后做日志记录相关操作 } @Before("execution(* com.flysun.DemoMethodService.*(..))") //拦截DemoMethodService下的所有方法 public void before(JoinPoint joinPoint){ MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); System.out.println("方法规则式拦截,"+method.getName()); } }
六:配置类
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; @Configuration @ComponentScan("com.flysun") @EnableAspectJAutoProxy //开启Spring对AspectJ代理的支持 public class AopConfig { }
七:运行:
import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class); DemoAnnotationService demoAnnotationService = context.getBean(DemoAnnotationService.class); DemoMethodService demoMethodService = context.getBean(DemoMethodService.class); demoAnnotationService.add(); demoMethodService.add(); context.close(); } }
结果如下: