AOP
概念:面向切面编程,对业务逻辑与非业务逻辑进行隔离,从而降低耦合,提高程序的可重用性。
好处:减少重复,专注业务。
原理:使用动态代理在执行方法前后或出现异常时加入相关逻辑。
术语解释:
连接点:可增强的方法
切入点:实际被增强的方法
通知:增强的功能
切面:通知加入切入点的过程
目标:切入点所在的类
代理:应用通知时创建的代理对象
AspectJ
AOP框架,支持注解开发,简单方便快捷,
Java实现方式
XML
1.导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2.将通知抽取出来
3.配置通知与切入点的关系
<!--配置aop-->
<bean id="CommonUtil" class="com.ffyc.spring.util.CommonUtil"></bean>
<aop:config>
<!--配置切入点-->
<!--
execution是表达式的主体
第一个*是返回的类型*代表所有类型
.就是包下的层级关系
.后面可以跟*表示该包下的
方法也可用*号代替,表示所有的方法
方法括号中为参数 ..表示任意参数
-->
<aop:pointcut id="insertAdmin" expression="execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))"/>
<aop:aspect ref="CommonUtil">
<!--前置通知,在方法执行前被调用-->
<!--<aop:before method="saveLog" pointcut-ref="allMethod"/>-->
<!--后置通知,在方法执行完成后被调用 在后置通知前方法出现异常就不再调用-->
<!--<aop:after-returning method="saveLog" pointcut-ref="allMethod"></aop:after-returning>-->
<!--最终通知 无论方法是否出现异常都会在最终调用-->
<!--<aop:after method="saveLog" pointcut-ref="allMethod"></aop:after>-->
<!--异常通知 只有出现异常才会调用-->
<!--<aop:after-throwing method="saveLog" pointcut-ref="allMethod" throwing="e"></aop:after-throwing>-->
<!--<aop:after-throwing method="saveLog" pointcut-ref="allMethod"></aop:after-throwing>-->
<!--环绕通知-->
<aop:around method="saveLog" pointcut-ref="insertAdmin"></aop:around>
</aop:aspect>
</aop:config>
注解
1.导入依赖
2.开启自动代理
<!--开启自动代理-->
<aop:aspectj-autoproxy />
3.注解
//@Before("execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))")
//@After("execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))")
//@AfterReturning("execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))")
//@AfterThrowing(value = "execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))",throwing = "e")
@Around(value = "execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))")
public void saveLog(Throwable e){
System.out.println("保存时间"+new Date()+"异常信息:"+e.getMessage());
}
aop:就是使用代理对象方式将非业务代码抽取出来,通过代理对象来进行调用,这样就可以将业务代码与非业务代码隔离开,降低代码的耦合度。
在不修改业务代码的前提下,添加功能