动态代理

1.什么是代理?

通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现)  ,AOP核心技术面向切面编程。

 代理应用场景

安全代理 可以屏蔽真实角色

远程代理 远程调用代理类RMI

延迟加载 先加载轻量级代理类,真正需要在加载真实

2.代理分类

静态代理(静态定义代理类)

动态代理(动态生成代理类)

Jdk自带动态代理

Cglib 、javaassist(字节码操作库)

1.静态代理

静态代理需要自己生成代理类

public class XiaoMing implements Hose {

@Override

public void mai() {

System.out.println("我是小明,我要买房啦!!!!haha ");

}

}

class Proxy  implements Hose {

private XiaoMing xiaoMing;

public Proxy(XiaoMing xiaoMing) {

this.xiaoMing = xiaoMing;

}

public void mai() {

System.out.println("我是中介 看你买房开始啦!");

xiaoMing.mai();

System.out.println("我是中介 看你买房结束啦!");

}

public static void main(String[] args) {

Hose proxy = new Proxy(new XiaoMing());

proxy.mai();

}

}

2.

JDK动态代理(不需要生成代理类)

实现InvocationHandler 可以了。

public interface Hose {

 

/**

 * 功能描述:(买房代理)

 */

public void mai();

 

}

 

public class XiaoMing implements Hose {

 

@Override

public void mai() {

System.out.println("我是小明,我要买房啦!!!!haha ");

}

 

}

 

public class JDKProxy implements InvocationHandler {

private Object tarjet;

 

public JDKProxy(Object tarjet) {

this.tarjet = tarjet;

}

 

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

System.out.println("我是房产中介.....开始监听你买房啦!");

Object oj = method.invoke(tarjet, args);

System.out.println("我是房产中介.....结束监听你买房啦!");

return oj;

 

}

 

}

 

class Test2 {

public static void main(String[] args) {

XiaoMing xiaoMing = new XiaoMing();

JDKProxy jdkProxy = new JDKProxy(xiaoMing);

Hose hose=(Hose) Proxy.newProxyInstance(xiaoMing.getClass().getClassLoader(), xiaoMing.getClass().getInterfaces(), jdkProxy);

hose.mai();

}

 

}

 

CGLIB动态代理

实现

 

import java.lang.reflect.Method;

 

import net.sf.cglib.proxy.Enhancer;

import net.sf.cglib.proxy.MethodInterceptor;

import net.sf.cglib.proxy.MethodProxy;

 

public class Cglib implements MethodInterceptor {

 

@Override

public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {

System.out.println("我是买房中介 , 开始监听你买房了....");

Object invokeSuper = methodProxy.invokeSuper(o, args);

System.out.println("我是买房中介 , 开结束你买房了....");

return invokeSuper;

 

}

 

}

 

class Test {

public static void main(String[] args) {

Cglib cglib = new Cglib();

Enhancer enhancer = new Enhancer();

enhancer.setSuperclass(XiaoMing.class);

enhancer.setCallback(cglib);

Hose hose = (Hose) enhancer.create();

hose.mai();

}

}

 

 

CGLIB与JDK动态代理区别

区别:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值