SpringAOP基本概念
AOP:(Aspect Oriented Programming)面向切面编程,一种在已存在代码段中动态嵌入其他代码段的技术,用来在不改变原有代码的情况下添加一些新的通用功能,如记录日志、参数预处理等。
**通知Advice
:**需要在原有程序中新增的功能;
**连接点JoinPoint
:**程序中可以接入通知的点,包括类、方法等;
**切入点PointCut
:**程序运行过程中实际接入通知的点,是一种特殊的连接点;
**切面Aspect
:**是一个类,在这个类中定义切入点和通知;
AOP简单实例
-
原程序如下
@Service public class AopTestService { @CutPointAnno public void test(){ System.out.println("测试方法执行"); } @CutPointAnno public void testThrowable(){ throw new RuntimeException(); } } //此注解标注的方法被标记为切面 public @interface CutPointAnno { }
-
切面,包括以注解形式定义的切入点和通知,这里定义了SpringAOP提供的四种通知类型(前置通知,后置通知,环绕通知,异常通知)其中,异常通知在程序抛出异常时执行
@Aspect @Component public class SimpleAspect { @Pointcut("@annotation(cn.sunyog.aop.CutPointAnno)") public void pointCut(){} @Before("pointCut()") public void doBefore(JoinPoint joinPoint) { System.out.println("前置通知"); } @After("pointCut()") public void doAfter(JoinPoint joinPoint){ System.out.println("后置通知"); } @Around("pointCut()") public void doAround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("环绕通知,前段"); joinPoint.proceed();//程序执行 System.out.println("环绕通知,后段"); } @AfterThrowing("pointCut()") public void doThrowing(JoinPoint joinPoint){ System.out.println("异常通知"); } }
-
启动Aop代理配置
@Configuration @ComponentScan("cn.sunyog.aop")//包扫描,扫描此包中所有的Bean,注册到容器中 @EnableAspectJAutoProxy//启用SpringAOP代理,包括jdk动态代理和cglib代理两种形式 public class AopConfig { }
-
启动容器,测试Aop是否成功
public class AOPTest { private ApplicationContext ctx; @Before public void doBefore(){ ctx=new AnnotationConfigApplicationContext(AopConfig.class); } @After public void doAfter(){ } @Test public void test(){ AopTestService service = ctx.getBean(AopTestService.class); service.test(); System.out.println(); service.testThrowable(); } }
-
打印结果
环绕通知,前段 前置通知 测试方法执行 后置通知 环绕通知,后段 环绕通知,前段 前置通知 异常通知 后置通知
可见,通知的执行顺序为: