您的位置:首页 > 编程语言 > Java开发

初探Spring之动态代理的使用

2017-07-23 15:24 260 查看

1.介绍

AOP全称是Aspect Oriented Programming 可以理解为面向切面编程,通过预编译的形式和运行动态代理实现程序功能的统一维护的一种技术。

2.实现方式:

预编译:

AspectJ

动态代理:

JDK动态代理 ,Cglib 动态代理

3.主要的功能有:

日志记录,性能统计,安全控制,事务处理,异常处理等等;



4.动态代理

[b]1)jdk动态代理[/b]

jdk是面向接口的,所以一定要写一个接口。

代码结构



接口的方法:

public void productBm();
public void productBc();
public void productAd();


实现类

public void productBm() {
System.out.println("生产了宝马");
}
public void productBc() {
System.out.println("生产了奔驰");
}
public void productAd() {
System.out.println("生产了奥迪");
}


代理类 实现InvocationHandler:

private Object obj;

public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("销售前");
//代理的方法注入参数 args
Object result=method.invoke(obj, args);method.invoke(obj, args);
System.out.println("销售后");
return result;
}


测试类:

//创建目标
IcarImpl a=new IcarImpl();
//创建代理
CarProxy cr=new CarProxy();
//设置代理关系
cr.setObj(a);

Icar car = (Icar)     Proxy.newProxyInstance(a.getClass().getClassLoader(), a.getClass().getInterfaces(), cr);
car.productBm();


执行结果:

销售前

生产了宝马

销售后


[b]2)Cglib动态代理[/b]

Cglib不是面向接口的 ,所以不用写接口。这个类继承了 MethodInterceptor 。

这次的目标类和上边的一样

代理类:

public class CglibProxy implements MethodInterceptor {

@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("销售前");
//方法注入参数
Object result=arg3.invokeSuper(arg0, arg2);
System.out.println("销售后");
return result;
}
}


测试类:

//创建目标
IcarImpl icarImpl = new IcarImpl();
//创建代理
CglibProxy cglibProxy = new CglibProxy();
//设置个中介 将两个联系在一起
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(icarImpl.getClass());
enhancer.setCallback(cglibProxy);
//生成了目标的对象
IcarImpl  ic= (IcarImpl) enhancer.create();
//调用方法
ic.productBc();


大家有问题还望多多提出,共同进步!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring aop
相关文章推荐