码迷,mamicode.com
首页 > 其他好文 > 详细

静态代理$动态代理

时间:2017-07-30 23:34:59      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:width   nal   业务逻辑   cat   目标   逻辑操作   增强   test   参数   

什么是静态代理?

静态代理就是代理模式,给真实类做了个增强的方法

 

比如你有个房源,你还有代理人那么这个代理人就会给你的怎是房源的基础上,夸大点让你的房源增加人脉。。。

就要用到增强方法,就在代理类中给你的方法增强

//静态代理模式
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();

 

 

 



静态代理$动态代理

标签:width   nal   业务逻辑   cat   目标   逻辑操作   增强   test   参数   

原文地址:http://www.cnblogs.com/hualishu/p/7260772.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!