AOP(Aspect Oriented Programing) 称为:面向切面编程,主要是基于代理对象,对原来目标对象来创建代理对象,主要是在不修改原来代码的前提下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强,它是一种编程思想。
AOP的应用场景
场景一:记录日志
场景二:监控方法运行时间(监控性能)
场景三:权限控制
场景四:缓存优化(第一次调用查询数据库,将查询结果放入到内存中,第二次调用,直接从内存对象返回,不需要查询数据库)
场景五:事务管理(调用方法前开启事务,调用方法后提交关闭事务)
在逻辑上是一组操作,开启事务,操作数据,关闭(提交)事
AspectJ 切面编程(xml)
AspectJ的不同通知类型
主要的步骤:
第一步:目标确定
第二步:通知/增强(编写)
第三步:配置切面(包含切入点和切面的结合)
接口
package cn.cyp.customerService;
/**
* @Author:cyp
* @date:2019/10/15 17:03
* @Desc:
*/
public interface CustomerService {
public void save();
public void findCount();
}
实现类
package cn.cyp.customerServiceImpl;
import cn.cyp.customerService.CustomerService;
/**
* @Author:cyp
* @date:2019/10/15 17:05
* @Desc:
*/
public class CustomerServiceImpl implements CustomerService {
@Override
public void save() {
System.out.println("用户保存!!!");
}
@Override
public void findCount() {
System.out.println("用户查找!!!");
}
}
普通类
package cn.cyp.productService;
/**
* @Author:cyp
* @date:2019/10/15 17:07
* @Desc:
*/
public class ProductService {
public void save(){
System.out.println("商品保存!!!");
}
public void findCount(){
System.out.println("商品查找!!!");
int a=1/0;
}
}
1.确定目标.xml
<!--配置目标对象-->
<bean id="productService" class="cn.cyp.productService.ProductService"></bean>
<bean id="CustomerService" class="cn.cyp.customerServiceImpl.CustomerServiceImpl"></bean>
2.编写before前置的,after后置的advice的增强
3.配置通知的bean
进行配置切入点和切面
进行测试代码
配置xml,可以增强多次
各种通知的应用
before 前置增强
主要是权限控制
编写一个增强类
AfterReturning 后置增强
特点:在目标方法运行后,返回值后执行增强代码逻辑。
应用场景:与业务相关的,如网上营业厅查询余额后,自动下发短信。
Around环绕通知
在方法的前后增加拦截器
需求:日志,缓存,权限和性能监控”事务管理“
AfterThrowing抛出通知
有异常就执行,没有就不执行
需求:处理异常,一般不可预知,记录日志,通知管理员
After最终通知
作用:不管目标方法是否发生异常,最终通知都会执行(类似于finally代码功能)
应用场景:释放资源 (关闭文件、 关闭数据库连接、 网络连接、 释放内存对象 )
关于各种方法可以接受的参数和返回值小结
@Aspectj注解配置切面编程
2.编写通知,配置切面
1)编写通知类,在通知类 添加@Aspect 注解,代表这是一个切面类,并将切面类交给spring管理(能被spring扫描到@Component)。
2)在通知方法上面加
例如前置通知
使用@Pointcut 定义切入点
问题:如果直接在通知注解中写切入点表达式,会发生重复编写,后期不便于维护
解决:
在实际开发中,切入点都是单独定义维护的,如:
使用xml定义切入点aop:pointcut
使用注解单独定义切入点@Pointcut
语法要求:
切入点方法:必须是 private void 无参数方法,方法名为切点名
使用切入点,引入上面的切入点方法(前置,后置,,,都可以用)
一个通知方法如何使用多个切入点表达式
如:@Before(value=”mypointcut1()|| mypointcut2()”)