3.2
AOP的应用场景:
场景一: 记录日志
场景二: 监控方法运行时间 (监控性能)
场景三: 权限控制
场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
场景五: 事务管理 (调用方法前开启事务, 调用方法后提交或者回滚、关闭事务 )
Aop相关术语:
Aspect(切面): 就是一个java类,里面写的是 在执行的时候可增强的方法。
joinpoint(连接点):是一些要进行增强的方法
Pointcut(切入点):在什么时候加增强方法 在执行之前还是之后。 拦截那些bean的方法
advice(通知): 指的是拦截到 切入点 之后要做的事情 就是通知
通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
添加注解对象bean扫描
<!-- 1: aop配置切面类 -->
<bean id = "log" class="com.igeek.aop.aspect.Log"></bean>
<bean id = "transaction" class="com.igeek.aop.aspect.Tramsaction"></bean>
<!-- 2: aop配置切面(包括切入点),让切入点关联通知 -->(那些点加入功能)
<aop:config>
<!-- 3:pointcut切入点: 拦截那些bean的方法
execution(*包.类.方法(..))
任意返回值 任意参数类型 -->
<aop:pointcut id="pcut" expression="execution(*com.igeek.aop.service.impl.ItemServiceImpl.*。*(..))"></aop:pointcut>
<!-- 4:配置通知 --> 把配置的功能 关联到切入点
<aop:aspect ref="log">
<!--
? Before 前置通知,相当于BeforeAdvice
? AfterReturning 后置通知,相当于AfterReturningAdvice
? AfterThrowing抛出通知,相当于ThrowAdvice
? After 最终final通知,不管是否异常,该通知都会执行
-->
<aop:after-returning method="log" pointcut-ref="pcut"/>
</aop:aspect>
</beans> </aop:config>
------------aop XML格式
<context:component-scan base-package="com.igeek.aop"></context:component-scan>
<bean id = "log" class="com.igeek.aop.aspect.Log"></bean>
<aop:config>
<!-- 切入点-->
<aop:pointcut id="tcut " expression=" execution(*包.类.方法(..))"></aop:pointcut>
<!-- 配置通知--> execution(* com.igeek.aop.service.impl.*.add*(..))"></aop:pointcut>
<aop:aspect ref="transaction">
<aop:before method=" " pointcut-ref="tcut"/>
<aop:after-returning method=" " pointcut-ref="tcut"/>
<aop:after-throwing method=" " throwing= " " pointcut-ref="tcut"/>
</aop:aspect>
</aop:config>
--------------aop 注解配置格式
在切面类内部配置:
首先XML文件配置 <!-- 注解对象bean扫描 -->
<context:component-scan base-package="com.igeek.aop"></context:component-scan>
<!-- 在spring容器中开启AspectJ 注解自动代理机制
使用<aop:aspectj-autoproxy/> -->
<aop:aspectj-autoproxy/>
A: 1、设置切面标识
@Component
@Aspect
2、添加切入点
@Pointcut( "execution(* com.igeek.aop.service.impl.*.*(..))")
public void pcut() { } //定义普通方法 - 配置切入点
3、把增强方法关联到切入点
@AfterReturning(pointcut="pcut()") //pointcut=方法名()
B :每个增强方法前都直接加直接
@Before("execution(* com.igeek.aop.service.impl.*.deleteItem*(..)) or\r\n" +
" execution(* com.igeek.aop.service.impl.*.save*(..)) or\r\n" +
" execution(* com.igeek.aop.service.impl.*.insert*(..)) or\r\n" +
" execution(* com.igeek.aop.service.impl.*.update*(..)) or\r\n" +
" execution(* com.igeek.aop.service.impl.*.modify*(..)) or\r\n" +
" execution(* com.igeek.aop.service.impl.*.add*(..))")
A方法比B方法的好处在于 提高代码的复用性 更清晰些