静态代理$动态代理

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();

 

 

 



以上是关于静态代理$动态代理的主要内容,如果未能解决你的问题,请参考以下文章

代理模式(静态代理jdk动态代理CGLib动态代理)

静态代理与动态代理

Java动态代理与静态代理的定义与区别??

静态代理和动态代理

什么静态/动态代理,内容详解,只要看就会懂

Spring之静态/动态代理模式