AOP实现方法

利用Proxy实现AOP的功能:

采用Proxy类方法,基本流程为:主函数->代理->目标对象的方法。对Proxy类有一个使用前提,就是目标对象必须要实现接口,否则不能使用这个方法。实现AOP的步骤如下:

  • 创建接口: StudentInterface.java
  • 创建接口实现类: Student.java
  • 创建代理工厂类: ProxyFactory.java

1. 创建接口: StudentInterface.java

public interface StudentInterface {
    public void print();
}

2. 创建接口实现类: Student.java

public class Student implements StudentInterface{
    private String name;

    public Student() {
    }

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        System.out.println("Hello World");
    }
}

3. 创建代理工厂类: ProxyFactory.java

public class ProxyFactory implements InvocationHandler {
    private Object stu;

    public Object createStudentProxy(Object stu){
        this.stu = stu;
        return Proxy.newProxyInstance(stu.getClass().getClassLoader(), stu.getClass().getInterfaces(), this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Student s = (Student) stu;
        Object object = null;
        if(s.getName() != null){
            object = method.invoke(stu, args);
        }else {
            System.out.println("Empty name. Proxy class takes interception");
        }
        return object;
    }
}

总结:

  1. 目标对象必须实现接口。
  2. 返回创建的代理对象。
  3. 重写invoke()方法。
  4. 限制条件放在invoke()方法中。

利用CGLib实现AOP功能

CGLib(Code Generation Library)是一个开源项目,它是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。实现AOP功能的步骤如下所示:

  • 引入相关的Maven
  • 创建实体类
  • 创建CGLib代理类
  • 创建入口类进行测试

1. 引入相关的Maven

        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.3.0</version>
        </dependency>

2.创建实体类

public class Student{
    private String name;

    public Student() {
    }

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        System.out.println("Hello World");
    }
}

3. 创建CGLib代理类

public class ProxyFactory implements InvocationHandler {
    private Object stu;

    public Object createStudentProxy(Object stu){
        this.stu = stu;
        return Proxy.newProxyInstance(stu.getClass().getClassLoader(), stu.getClass().getInterfaces(), this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Student s = (Student) stu;
        Object object = null;
        if(s.getName() != null){
            object = method.invoke(stu, args);
        }else {
            System.out.println("Empty name. Proxy class takes interception");
        }
        return object;
    }
}

4.创建入口类进行测试

public class Main {
    public static void main(String[] args) {
        Student s1
                = (Student)(new CGLibProxyFactory()).createStudent(new Student());
        Student s2
                = (Student)(new CGLibProxyFactory()).createStudent(new Student("Lemon"));
        s1.print();
        s2.print();
    }
}

使用CGLib和Proxy的区别:
Proxy实现的代理对象和目标对象必须实现接口。使用CGLib不需要实现接口。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 如果你开始阅读这篇文章,说明你对AOP的概念并不陌生,当然这只是我个人的一个期望,因为只是介绍AOP的概念就能写很...
    iPolaris阅读 2,104评论 0 5
  • 本学习笔记将尽可能的将AOP的知识讲解的通俗易懂,先从一个典型的问题出发,引入AOP这个概念,介绍AOP的基本概念...
    jwfy阅读 25,933评论 1 24
  • 代理可以分为静态代理、动态代理,动态代理又可以分为 jvm的动态代理 和 cglib的动态代理。像spring框架...
    路远处幽阅读 354评论 0 1
  • Java的三种代理模式(Spring动态代理对象) Java的三种代理模式 1.代理模式 代理(Proxy)是一种...
    552163671414阅读 250评论 0 0
  • ⑴讲点开心的? 今天运动会正式结束啦。 怎么说呢,有笑有泪阿噗哈哈。 足球绕杆,一分钟跳绳和立定跳远我没看,估计也...
    黑怕少女_阅读 148评论 0 0