aop cglib的底层实现原理是什么?实现方式

TheDisguiser 2020-04-14 17:37:29 java常见问答 8636

Java开发的小伙伴们相信都知道aop和cglib吧,今天我们就来了解一下SpringAOP和cglib的底层实现原理。

AOP简介

AOP又被称为:面向切面编程,它是一种编程思想。AOP 是 OOP的思想延续

AOP通过采取横向抽取机制,已经完全取代了传统纵向继承体系重复性代码的编写方式

AOP核心思想

基于代理思想,对原来目标对象,创建一个代理对象,会在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,来对原有业务方法进行功能增强

切面:需要代理一些方法和增强代码

AOP的应用场景

场景1:记录日志

场景2:监控方法运行时间 

场景3: 权限控制,

场景4: 缓存优化,第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库。

场景5: 事务管理,调用方法前开启事务, 调用方法后提交或者回滚、关闭事务。

Spring AOP编程两种方式

方式1:Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类植入增强代码

方式2:Spring 2.0 之后支持第三方 AOP框架,实现另一种 AOP编程

AOP编程相关术语

1.Aspect: 是通知和切入点的结合,通知和切入点共同定义了关于切面的全部内容---它的功能、在何时和何地完成其功能

2.joinpoint:所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.

3.Pointcut:所谓切入点是指我们要对哪些joinpoint进行拦截的定义.通知定义了切面的”什么”和”何时”,切入点就定义了”何地”.

4.Advice:所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)

5.Target:代理的目标对象

6.Weaving:是指把切面应用到目标对象来创建新的代理对象的过程.切面在指定的连接点织入到目标对象

7.Introduction:在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.

AOP编程底层实现机制

AOP 就是要对目标进行代理对象的创建, Spring AOP是基于动态代理的,分别基于两种动态代理机制: JDK动态代理和CGLIB动态代理

JDK动态代理:只能对实现了接口的类产生代理

package com.spring.aop.demo1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkProxy implements InvocationHandler
{
    private UserDao userDao;
    public JdkProxy(UserDao userDao)
    {
        this.userDao = userDao;
    }
    /*
     * 产生UserDao代理的方法
     */
    public UserDao createProxy()
    {
        UserDao userDaoProxy = (UserDao)
        Proxy.newProxyInstance(userDao.getClass()
            .getClassLoader()
            , userDao.getClass()
            .getInterfaces(), this);
        return userDaoProxy;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws
    Throwable
    {
        //判断方法名是不是save
        if ("save".equals(method.getName()))
        {
            //增强
            System.out.println("===权限校验===");
            return method.invoke(userDao, args);
        }
        return method.invoke(userDao, args);
    }
}

Cglib动态代理:对没有实现接口的类产生代理对象,生成子类对象

package com.spring.aop.demo2;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
/*
 * Cglib代理
 */
public class CglibProxy implements MethodInterceptor
{
    private CustomerDao customerDao;
    public CglibProxy(CustomerDao customerDao)
    {
        this.customerDao = customerDao;
    }
    /*
     * 使用cglib产生代理的方法
     */
    public CustomerDao createProxy()
    {
        //1。创建cglib的核心类
        Enhancer enhancer = new Enhancer();
        //2.设置父类:
        enhancer.setSuperclass(customerDao.getClass());
        //3.设置回调,类似于(InvocationHandler对象)
        enhancer.setCallback(this);
        CustomerDao proxy = (CustomerDao) enhancer.create();
        return proxy;
    }
    @Override
    public Object intercept(Object proxy, Method method, Object[] args
        , MethodProxy methodProxy) throws Throwable
    {
        //判断方法是都为save:
        if ("save".equals(method.getName()))
        {
            //增强
            System.out.println("======权限校验======");
            return methodProxy.invokeSuper(proxy, args);
        }
        return methodProxy.invokeSuper(proxy, args);
    }
}

关于aop的实现原理就是这些了,更多关于Java一些知识问答的小知识请持续关注本站吧。