AOP的底層實現—之CGLIB的動態代理——(八)

CGLIB的動態代理

1.在src/main下創建Java源文件,創建包com.aop.demo2

在這裏插入圖片描述

2.在pom.xml內引入依賴

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>

3.創建Product類

package com.aop.demo2;

public class Product {
    public void save() {System.out.println("保存商品···");}

    public void upsate() {
        System.out.println("修改商品···");
    }

    public void delete() {
        System.out.println("刪除商品···");
    }

    public void find() {
        System.out.println("查詢商品···");
    }
}

4.創建SpringDemo2測試類

package com.aop.demo2;

import org.junit.jupiter.api.Test;

public class SpringDemo2 {
    @Test
    public void demo1(){
        Product product = new Product();

        Product proxy = (Product) new MyCglibProxy(product).createProxy();

        proxy.save();
        proxy.upsate();
        proxy.delete();
        proxy.find();
    }
}

5.創建MyCglibProxy類實現CGLIB動態代理

package com.aop.demo2;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class MyCglibProxy implements MethodInterceptor {
    private  Product product;

    public MyCglibProxy(Product product) {
        this.product = product;
    }

    public Object createProxy(){
        //1.創建核心類
        Enhancer enhancer = new  Enhancer();
        //2.設置父類
        enhancer.setSuperclass(product.getClass());
        //3.設置回調
        enhancer.setCallback(this);
        //4.生成代理
        Object proxy=enhancer.create();
        return  proxy;

    }

    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        if ("save".equals(method.getName())){
            System.out.println("權限校驗");
            return methodProxy.invokeSuper(proxy,args);
        }
        return methodProxy.invokeSuper(proxy,args);
    }
}

6.輸出結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章