Spring学习笔记(三)-AOP-传统方法面临的问题
Spring学习笔记(三)-AOP-传统方法面临的问题
传统开发方式面临的问题:
-
定义一个接口与实现类,该类中除了要实现接口中的方法外,还要再写两个非业务的方法(daTransaction:用于事务管理,daLog用于日志管理),再使用接口方法进行调用
-
@Override public List<Account> findAllAccount() { try { //1.开启事务 txManager.beginTransaction(); //2.执行操作 List<Account> accounts = accountDao.findAllAccount(); //3.提交事务 txManager.commit(); //4.返回结果 return accounts; }catch (Exception e){ //5.回滚操作 txManager.rollback(); throw new RuntimeException(e); }finally { //6.释放连接 txManager.release(); } }
-
繁琐、重复、耦合高、对于业务的拓展、维护、更改非常不友好
-
一个解决思路:使用动态代理对方法进行增强
-
IProducer proxyProducer = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.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; //1.获取方法执行的参数 Float money = (Float)args[0]; //2.判断当前方法是不是销售 if("saleProduct".equals(method.getName())) { returnValue = method.invoke(producer, money*0.8f); } return returnValue; } });
AOP面向切面编程
- Aspect Orient Programming,给业务增加功能为切面,一般为非业务功能,k可复用如:日志、事务管理、权限检查、参数检查、信息统计... ...
- oop:以对象为核心,考虑对象的属性、对象的交互
- aop:以切面为核心,在设计项目时,就需要找出切面的功能,安排切面执行的时间,以及执行的位置
- AOP的作用:
- 让切面功能复用
- 使开发专注逻辑,提高效率
- 实现业务功能与非业务功能的解耦合
- 给与存在的功能以增强
- JoinPoint连接点:连接切面的-业务方法,在该业务方法执行时,会同时执行切面的功能
- Pointcut切入点:一个或多个连接点的集合,在这些方法执行时都能够增加切面的功能,是切面执行的位置
- target目标对象:给谁增加切面功能,谁就是目标对象
- Advice通知/增强:表示切面执行的时机
- AOP最重要的三要素:Aspect、Pointcut、Advice,在Advice时机于Pointcut位置执行Aspect