美文网首页
【济南校区】静态代理和动态代理的使用

【济南校区】静态代理和动态代理的使用

作者: keaiai | 来源:发表于2018-05-13 22:39 被阅读0次

     【济南校区】静态代理和动态代理的使用

     1.静态代理类是由程序员创建或者特定工具自动生成的代码,然后再进行编译的.在程序运行前代理类的.class文件已经存在了.

    2.

    动态代理类是在程序运行时,通过反射机制动态创建的.

    静态代理的实现

              01.

    用户管理类

    public classUserServiceImp implements UserService {

    public void addUser(String username, String passsword) {

    // TODO Auto-generated method stub

    System.out.println("UserServiceImp.addUser");

    }

    public void deleUser(String userId) {

    // TODO Auto-generated method stub

    System.out.println("UserServiceImp.deleUser");

    }

    }

               02.代理类--代理用户管理实现类

    public classUserServiceImplProxy implements UserService {

    private UserService userService;

    public UserServiceImplProxy(UserService userSservice){

    this.userService = userSservice;

    }

    public void addUser(String username, String passsword) {

    try {

    //

    添加打印功能

    System.out.println("start-addUser");

    userService.addUser(username, passsword);

    } catch (Exception e) {

    //

    添加用户失败

    System.out.println("error--addUser");

    }

    }

    public void deleUser(String userId) {

    System.out.println("UserServiceImp.deleUser");

    }

    }

       03.客户端的实现

    public void Test1(){

    UserService userService = newUserServiceImplProxy(new UserServiceImp());

    userService.addUser("zhangsan","123456");

    }

    静态代理类只能为特定的接口(Service)服务。如想要为多个接口服务则需要建立很多个代理类

    所以还是用动态代理比较方便

    01.动态代理的具体实现类

    public class UserServiceImp implements UserService {

    public void addUser(String username, String passsword) {

    // TODO Auto-generated method stub

    System.out.println("UserServiceImp.addUser");

    }

    public void deleUser(String userId) {

    // TODO Auto-generated method stub

    System.out.println("UserServiceImp.deleUser");

    }

    }

    02.动态创建代理对象的类

    public class UserServiceHandleProxy implements InvocationHandler {

    //

    创建目标对象

    private Object targetPbject;

    //

    绑定关系

    public Object newProxyInstance(Object targetPbject){

    this.targetPbject = targetPbject;

    returnProxy.newProxyInstance(targetPbject.getClass().getClassLoader(),

    targetPbject.getClass().getInterfaces(), this);

    }

    @Override

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

    System.out.println("start-->>");

    for(inti=0;i

    System.out.println(args);

    }

    Objectret=null;

    try{

    /*

    原对象方法调用前处理日志信息*/

    System.out.println("satrt-->>");

    //

    调用目标方法

    ret=method.invoke(targetPbject, args);

    /*

    原对象方法调用后处理日志信息*/

    System.out.println("success-->>");

    }catch(Exceptione){

    e.printStackTrace();

    System.out.println("error-->>");

    throwe;

    }

    returnret;

    }

    }

    03.客户端的具体实现

    public void Test2(){

    UserServiceHandleProxy handlerProxy = newUserServiceHandleProxy();

    UserService userService =(UserService)handlerProxy.newProxyInstance(new UserServiceImp());

    userService.addUser("zhangsan","123456");

    }

    }

    通过动态代理我们可以做很多操作,如进行日志处理、事物管理、权限控制等事情。

    [if !supportLineBreakNewLine]

    [endif]

    如果你想了解更多黑马课程请点击这里,如果你想加入黑马这个大家庭学习先进技术,广交天下好友!黑马程序员济南中心联系电话:0531-55696830

    相关文章

      网友评论

          本文标题:【济南校区】静态代理和动态代理的使用

          本文链接:https://www.haomeiwen.com/subject/yaerdftx.html