其实现在对于很多有相关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一些知识问答,请继续关注本站消息。