目录
- 什么是aop
- 模拟aop
- 配置
什么是aop
- 什么是aop
作用 在程序运行期间,在不修改源码的情况下对方法进行功能增强
优势 减少重复代码 提高开发效率 并且便于开发
2.aop关键概念
模拟aop
- 目标接口
package com.lovely.proxy.aop;public interface TargetInterface {public abstract void save();
}
- 切点类
package com.lovely.proxy.aop;/*** @author echo lovely* @date 2020/7/28 16:07*/
public class Target implements TargetInterface {public void save() {try {System.out.println(1 / 0);} catch (Exception e) {System.out.println(e);}System.out.println("save running about aop...");}
}
- 切面类
package com.lovely.proxy.aop;import org.aspectj.lang.ProceedingJoinPoint;/*** 切面类 里面写增强方法 advice 通知方法* @author echo lovely* @date 2020/7/28 16:05*/
public class MyAspect {public void before() {System.out.println("前置增强...");}public void afterReturning() {System.out.println("后置增强...");}public Object around(ProceedingJoinPoint process) {System.out.println("环绕通知前...");Object obj = null;try {obj = process.proceed();} catch (Throwable throwable) {throwable.printStackTrace();}System.out.println("环绕通知后...");return obj;}public void afterThrowing() {System.out.println("异常拉...");}public void after() {System.out.println("最终通知...");}}
配置
<!-- 目标对象 --><bean id="target" class="com.lovely.proxy.aop.Target"></bean><!-- 切面对象 --><bean id="myAspect" class="com.lovely.proxy.aop.MyAspect"></bean><!-- aop配置 --><!-- 配置织入 被增强的方法(切点) 要进行那些增强(前置,后置) --><aop:config><!-- 声明切面--><aop:aspect ref="myAspect"><!-- 切点表达式的抽取 --><aop:pointcut id="myPointcut" expression="execution(* com.lovely.proxy.aop.*.*(..))"/><!-- 切面:通知 + 切点 --><!--<aop:before method="before" pointcut="execution(public void com.lovely.proxy.aop.Target.save())"/>--><!-- 前后置通知 --><!--<aop:before method="before" pointcut="execution(void com.lovely.proxy.aop.*.*(..))"/><aop:after-returning method="afterReturning" pointcut="execution(void com.lovely.proxy.aop.*.*(..))"/>--><!-- 环绕增强 --><!--<aop:around method="around" pointcut="execution(* com.lovely.proxy.aop.*.*(..))"/>--><!-- 抛出异常通知 --><!--<aop:after-throwing method="afterThrowing" pointcut="execution(void com.lovely.proxy.aop.*.*(..))"/>--><!-- 最终通知 --><!--<aop:after method="after" pointcut="execution(void com.lovely.proxy.aop.*.*(..))"/>--><!-- 引用切点表达式 --><aop:around method="around" pointcut-ref="myPointcut"/></aop:aspect></aop:config>