博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】spring aop 面试考点
阅读量:4983 次
发布时间:2019-06-12

本文共 1487 字,大约阅读时间需要 4 分钟。

问:Spring的AOP是怎么实现的?

解: Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。

JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。

JDK动态代理的核心是InvocationHandler接口和Proxy类。

如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。

CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

 

问:使用CGLIB动态实现功能:不改变Test类的情况下,在方法target 之前打印一句话,之后打印一句话。

public class UserServiceImpl implements UserService {    @Override    public void add() {        // TODO Auto-generated method stub        System.out.println("--------------------add----------------------");    }}
解:public class CglibProxy implements MethodInterceptor{    private Enhancer enhancer = new Enhancer();    public Object getProxy(Class clazz){      //设置需要创建子类的类      enhancer.setSuperclass(clazz);      enhancer.setCallback(this);      //通过字节码技术动态创建子类实例      eturn enhancer.create();     }     //实现MethodInterceptor接口方法    public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {      System.out.println("前置代理");      //通过代理类调用父类中的方法      Object result = proxy.invokeSuper(obj, args);      System.out.println("后置代理");      return result;    }  }  public class DoCGLib {     public static void main(String[] args) {        CglibProxy proxy = new CglibProxy();        //通过生成子类的方式创建代理类        UserServiceImpl proxyImp = (UserServiceImpl)proxy.getProxy(UserServiceImpl.class);        proxyImp.add();      }  }

 

转载于:https://www.cnblogs.com/smallwangmusk/p/11479906.html

你可能感兴趣的文章
Python_58之logging模块
查看>>
正则表达式
查看>>
楼房重建(分块优化)
查看>>
斐波那契数列(矩阵加速递推)
查看>>
HTTP笔记之一
查看>>
Gradle 学习一
查看>>
hiho #1223 不等式
查看>>
EOS多节点同步代码分析
查看>>
Synchronized关键字
查看>>
webfont 字体
查看>>
lua快速入门
查看>>
FullCalendar 官方文档翻译
查看>>
plsql 操纵表数据的2种方式
查看>>
输出日期
查看>>
hibernate中实体与数据库中属性对应的类型
查看>>
多线程池以及futures python新的线程包
查看>>
3389无法连接的5种原因分析
查看>>
C++拾遗(三)关于复合类型
查看>>
理解mvc
查看>>
WCF入门简单教程(图文) VS2010版
查看>>