Spring 的AOP底层实现技术:JDK和CGLIB动态代理

本文介绍了Spring框架中AOP的两种动态代理实现方式:JDK动态代理技术和CGLIB动态代理技术。JDK动态代理适用于实现了接口的类,而CGLIB则可以为目标类创建子类并实现代理。文章提供了具体的接口定义、实现类和代理工厂的代码示例。

Spring 的AOP实现技术之JDK的动态代理技术实例:

接口:IUserService

 

(Spring的AOP是动态AOP,实现技术:JDK提供的动态代理和cglib代理,
cglib它可以为没有实现接口的类做代理,也可以为接口类做代理.如果有接口,使用JDK动态代理,如果没有,使用cglib动态代理.)

利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理

 

1 public interface IUserService {
2     public void login(String username,String password);
3     public void regist();
4 }

实现类

 1 public class UserServiceImpl implements IUserService {
 2     @Override
 3     public void login(String username,String password) {
 4         System.out.println("登录......");
 5     }
 6     @Override
 7     public void regist() {
 8         System.out.println("注册.......");
 9     }
10 }

代理工厂

 1 //使用jdk的proxy完成动态代理工具
 2 public class JDKProxyFactory implements InvocationHandler{
 3 //创建目标对象,将传进来的对象赋值给本类对象就代理.
 4     private Object target;
 5     public  JDKProxyFactory(Object target){
 6         this.target=target;
 7     };      
 8 //通过目标对象创建代理对象
 9     public Object createProxy(){
10         //使用Proxy完成代理对象的创建
11         //得到目标对象的classLoder
12         ClassLoader loader = target.getClass().getClassLoader();
13         //得到目标对象的interfaces
14         Class<?>[] interfaces = target.getClass().getInterfaces();
15         //实现InvocationHandler接口,this就是创建代理对象的
16         return Proxy.newProxyInstance(loader, interfaces, this);
17     }
18     @Override
19     public Object invoke(Object proxy, Method method, Object[] args)
20             throws Throwable {
21         //在代理实例上处理方法调用并返回
22         //proxy是代理对象,method是调用的方法的method方法,args是调用的方法的参数
23         System.out.println("日志文件");
24         //target=UserServiceImpl--目标对象
25         return method.invoke(target, args);
26     }

测试类

1 public class ProxyTest {
2     @Test
3     public void test1(){
4     //创建目标对象
5     IUserService userService = new UserServiceImpl();
6     //创建代理对象
7     JDKProxyFactory factory = new JDKProxyFactory(userService);
8     IUserService userServiceProxy = (IUserService) factory.createProxy();
9     userServiceProxy.login("Tom","123");}}

 Spring 的AOP实现技术之CGLIB的动态代理技术实例:

CGLIB包底层是使用一个小而快的字节码处理框架ASM

 接口IUserService

public interface IUserService {
    public void login(String username,String password);
    public void regist();
}

实现类UserService

public class UserServiceImpl /*implements IUserService*/ {
    //@Override
    public void login(String username,String password) {
        System.out.println("登录......");
    }
    //@Override
    public void regist() {
        System.out.println("注册.......");
    }
}

CglibProxyFactory 代理工厂

public class CglibProxyFactory implements MethodInterceptor  {
 //得到目标函数
 private Object target;
 //使用构造方法传递目标对象
 public CglibProxyFactory(Object target){
      this.target=target;
 }
 //创建代理对象
 public Object createProxy(){
     //1.创建enhancer
    Enhancer enhancer = new  Enhancer();
    //2.传递目标对象
    enhancer.setSuperclass(target.getClass());
    //3.设置回调参数(相当于Invocationhandler)
    enhancer.setCallback(this);
    return enhancer.create(); 
 }
@Override
//增强目标对象
public Object intercept(Object proxy, Method method, Object[] args,
        MethodProxy methodProxy) throws Throwable {
    //在代理实例上处理方法调用并返回
    System.out.println("执行目标方法前");
  Object result =method.invoke(target, args);
   System.out.println("执行目标方法后");
     return result;

测试类

public class CglibTest {
    @Test
    public void test1(){
        //创建目标
        UserServiceImpl userSerice = new UserServiceImpl();
        //创建代理类,传递目标对象
    CglibProxyFactory factory= new CglibProxyFactory(userSerice);
    //生成IUserService的代理类
    UserServiceImpl userSericeproxy = (UserServiceImpl) factory.createProxy();
    userSericeproxy.login("tom", "123");
}

 

转载于:https://www.cnblogs.com/wwwzzz/p/7900565.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值