aop cglib的底层实现原理是?示例

XIAO 2020-04-19 11:25:14 java常见问答 5339

其实现在对于很多有相关java软件开发经验的朋友来说,面向对象思想的运用已经是无比的熟练了,那么面向切面的思想,aop其实也是非常常用的,其中的动态代理,cglib更是值得一提,下面就跟小编一起来看看 aop cglib的底层实现原理吧。

cglib是针对类来实现代理的,原理是对指定的业务类生成一个子类,并覆盖其中业务方法实现代理。因为采用的是继承,所以不能对final修饰的类进行代理。

首先定义业务类,无需实现接口(当然,实现接口也可以,不影响的):

public class BookFacadeImpl1
{
    public void addBook()
    {
        System.out.println("新增图书...");
    }
}

实现MethodInterceptor方法代理接口,创建代理类:

public class BookFacadeCglib implements MethodInterceptor
{
    private Object target; //业务类对象,供代理方法中进行真正的业务方法调用
    //相当于JDK动态代理中的绑定
    public Object getInstance(Object target)
    {
        this.target = target; //给业务对象赋值
        Enhancer enhancer = new Enhancer(); //创建加强器,用来创建动态代理类
        enhancer.setSuperclass(this.target.getClass()); //为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)
        //设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行拦
        enhancer.setCallback(this);
        // 创建动态代理类对象并返回
        return enhancer.create();
    }
    // 实现回调方法
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable
    {
        System.out.println("预处理——————");
        proxy.invokeSuper(obj, args); //调用业务类(父类中)的方法
        System.out.println("调用后操作——————");
        return null;
    }
 }

其中,Object obj:被代理的原对象,Method method:被调用的当前方法,Object[] args:该方法的参数集合,MethodProxy proxy:被调用方法的代理,它可以和method完成同样的事情,但是它使用FastClass机制非反射执行方法,效率高。

创建业务类和代理类对象,然后通过 代理类对象.getInstance(业务类对象) 返回一个动态代理类对象。最后通过动态代理类对象进行方法调用。

public static void main(String[] args)
{
    BookFacadeImpl1 bookFacade = new BookFacadeImpl1();
    BookFacadeCglib cglib = new BookFacadeCglib();
    BookFacadeImpl1 bookCglib = (BookFacadeImpl1) cglib.getInstance(bookFacade);
    bookCglib.addBook();
}

好了,以上就是aop cglib的底层有关实现了,还想了解更多java一些知识问答,请继续关注本站消息。