什么是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>