静态代理$动态代理
Posted liuzhe01
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态代理$动态代理相关的知识,希望对你有一定的参考价值。
什么是静态代理?
静态代理就是代理模式,给真实类做了个增强的方法
比如你有个房源,你还有代理人那么这个代理人就会给你的怎是房源的基础上,夸大点让你的房源增加人脉。。。
就要用到增强方法,就在代理类中给你的方法增强
//静态代理模式
public class Progects {
/*
@Test
public void dd() {
//真实代理
Subject jk=new Real();
//代理对象
Proxy hj=new Proxy();
//调度代理对象(jk)方法增强
hj.setSubject(jk);
hj.add();
}
*/
接下来就是
JDK动态代理实现:
@Test
public void dds() {
///JDk动态代理
final IUserDao jk=new UserDaoimpl();
三个参数
new出一个代理的实例
类加载器,类接口最后一个是接口的实现类
IUserDao poxy=(IUserDao)Proxy.newProxyInstance(jk.getClass().getClassLoader(), jk.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("事务已经开启");
调度这个方法里的invoke对象的jk
method.invoke(jk,args);
* @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.
return null;
}
});
//最后代理方法当然要开启
poxy.add();
poxy.edit();
}
动态代理的AOP底层实现,有接口自动用的是JDK动态代理
CGLib动态代理
@Test
public void ddss() {
///CGLIb动态代理
final UserService service=new UserService();
//Enhancer对象 有了这个对象就能事项动态代理
Enhancer enhancer=new Enhancer();
//在内存中构建业务类的子类
enhancer.setSuperclass(service.getClass());
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// 前置的业务逻辑操作
System.out.println("事务已开启");
/*
* @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.
*/
methodProxy.invoke(service,objects);
//invoke调用了对象里的方法
// 调用被代理类的方法,传入参数args,得到返回
// 后置的业务逻辑操作
System.out.println("---结束");
return null;
}
});
UserService proxy=new UserService();
proxy.delete();
}
抽象主题:Subject:接口
目标对象(原始对象):RealSubject(要增强的对象) implements
代理对象:Proxy(植入目标对象) 实现了接口
before code block
business xxx.invoke()
after code block
动态代理 AOP底层实现:有接口自动应用的就是JDK动态代理
1)JDK 在运行时运行时注入
本质:在内存中构建出接口的实现类
特点:被代理对象,必须有接口
Proxy.newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
InvocationHandler调度处理器
public interface InvocationHandler {
}
------------------------Code--------------
final IUSerDao dao=new UserDaoImpl();
import java.lang.reflect.Proxy;
InvocationHandler ih=new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object[] args){
==================前置===================
Object result=method.invoke(dao,args);
==================后置===================
return result;
}
};
IUSerDao proxy=(IUSerDao)Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHanlder){
};
proxy.add();
2)Cglib 底层,注入,编译期已经注入了
本质:在内存中生成被代理类(目标类)的【子类】
特点:可以在没有接口的情况下代理
对于不使用接口的业务类,无法使用JDK动态代理,cglib采用非常底层的字节码技术,可以为一个类创建子类,解 题
Enhancer xxx=yyy;
UserDaoImpl proxy=(UserDaoImpl)enhancer.create();
proxy.add();
以上是关于静态代理$动态代理的主要内容,如果未能解决你的问题,请参考以下文章