Spring源码之AOP说明

1 什么是AOP

面向切面编程, 利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

2 AOP原理

1 底层使用动态代理

1 JDK动态代理

有接口存在, 通过创建接口实现类代理对象,增加类的方法

接口类

interface UserDao {
    public void login();
}

实现类

class UserDaoImpl implements UserDao {
    public void login(){
        // 增强处理
    }
}
2 CGLIB动态代理

没有接口,就基于子类的代理对象

class User{
    public void add{
        ...
    }
}

子类

class Person extends User{
    public void add(){
        super.add();
        // 增强处理
    }
}

3 JDK动态代理Demo

1 使用 JDK 动态代理,使用 Proxy 类里面的方法创建代理对象

2 编写JDK动态代理

1 创建接口

public interface UserDao {
 public int add(int a,int b);
 public String update(String id);
}

2 接口实现类

public class UserDaoImpl implements UserDao {
 @Override
 public int add(int a, int b) {
 return a+b;
 }
 @Override
 public String update(String id) {
 return id;
 }
}

3 使用Proxy创建代理对象

public class JDKProxy {
 public static void main(String[] args) {
      //创建接口实现类代理对象
// Class[] interfaces = {UserDao.class};
// Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, 
// new InvocationHandler() {
// @Override
// public Object invoke(Object proxy, Method method, Object[] args) 
// throws Throwable {
// return null;
// }
// });
     
 UserDaoImpl userDao = new UserDaoImpl();
 UserDao dao = 
(UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, 
new UserDaoProxy(userDao));
     int result = dao.add(1, 2);
 System.out.println("result:"+result);
 }
}

代理对象

// 创建代理对象代码
class UserDaoProxy implements InvocationHandler {
 // 1 把创建的是谁的代理对象,把谁传递过来
 // 有参数构造传递
 private Object obj;
 public UserDaoProxy(Object obj) {
 this.obj = obj;
 }
 // 增强的逻辑
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws 
Throwable {
 // 方法之前
 System.out.println("方法之前执行...."+method.getName()+" :传递的参
数..."+ Arrays.toString(args));
 // 被增强的方法执行
 Object res = method.invoke(obj, args);
 // 方法之后
 System.out.println("方法之后执行...."+obj);
 return res;
 }
}

4 AOP说明

1 连接点

类里面哪些方法可以被增强, 这些方法称为连接点

2 切入点

实际被真正增强的方法,称为切入点

3 通知

1 实际增强的逻辑部分称为通知

2 通知类型

  • 前置通知
  • 后置通知
  • 环绕通知
  • 异常通知
  • 最终通知

4 切面

切面动作: 把通知应用到切入点过程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值