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:就是使用代理对象方式将非业务代码抽取出来,通过代理对象来进行调用,这样就可以将业务代码与非业务代码隔离开,降低代码的耦合度。
在不修改业务代码的前提下,添加功能