主流框架二:Spring(5)Spring中的 AOP
一、AOP 与 Spring中的AOP
- AOP 概述
AOP:全称是 Aspect Oriented Programming 即:面向切面编程。
简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。
2.AOP 的作用及优势
作用:
在程序运行期间,不修改源码对已有方法进行增强。
优势:
(1)减少重复代码
(2)提高开发效率
(3)维护方便
3.AOP 的实现方式
使用动态代理技术来把我们程序重复的代码抽取出来,对已有方法进行增强。
例如:动态代理实现事务的控制(Spring(4))
二、Spring中的AOC
我们学习 spring 的 aop,就是通过统一配置的方式,实现程序重复的代码抽取出来。
通过是否实现接口来决定是 基于接口的动态代理(至少实现一个接口) 与 基于子类的动态代理(被代理类不能是最终类)
1.AOP 相关术语
(1)第一组
Joinpoint( 连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。即业务层接口所有的方法。
Pointcut( 切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截(加强)的定义。
例如:在创建service代理对象的factory中,test()没有被加强
所以对于业务层接口中,void test(); //它只是连接点,不是切入点,因为没有被增强,而其他的findAllAccount()等,则既是连接点也是切入点(被加强过的点)
public IAccountService getAccountService() {
return (IAccountService) Proxy.newProxyInstance(accountService.getClass().getClassLoader(),
accountService.getClass().getInterfaces(),
new InvocationHandler() {
/**
* 添加事务的支持
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue = null;
if("test".equals(method.getName())) {
return method.invoke(accountService, args);
}
.....
}
/**
* 账户的业务层接口
*/
public interface IAccountService {
/**
* 查询所有
* @return
*/
List<Account> findAllAccount();
/**
* 转账
* @param souceName 转出账户名称
* @param targetName 转入账户名称
* @param money 转账金额
*/
void transfer(String souceName,String targetName,Float money);
void test(); //它只是连接点,不是切入点,因为没有被增强
}
(2)第二组
Advice( 通知/ 增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。
例如:在创建代理对象的factory中,添加事务控制即是通知(增强)
Introduction( 引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方
法或 Field。
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue = null;
if("test".equals(method.getName())) {
return method.invoke(accountService, args);
}
try {
//1.开启事务
transactionManager.beginTransaction();
//2.执行操作
returnValue = method.invoke(accountService, args);
//3.提交事务
transactionManager.commit();
//4.返回结果
return returnValue;