A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小鲁哥哥 于 2018-3-16 14:39 编辑

【济南校区】静态代理和动态代理的使用  
  1.静态代理类是由程序员创建或者特定工具自动生成的代码,然后再进行编译的.在程序运行前代理类的.class文件已经存在了.
       2.动态代理类是在程序运行时,通过反射机制动态创建的.
       静态代理的实现
          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 UserServiceImplProxy 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 = new UserServiceImplProxy(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;
        return Proxy.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(int i=0;i<args.length;i++){  
                System.out.println(args);  
    }
            Object ret=null;  
            try{  
                /*原对象方法调用前处理日志信息*/  
                System.out.println("satrt-->>");  
                  
                //调用目标方法  
                ret=method.invoke(targetPbject, args);  
                /*原对象方法调用后处理日志信息*/  
                System.out.println("success-->>");  
            }catch(Exception e){  
                e.printStackTrace();  
                System.out.println("error-->>");  
                throw e;  
            }
                return ret;  
            }  
         
        }  

03.客户端的具体实现
public void Test2(){
        UserServiceHandleProxy handlerProxy = new UserServiceHandleProxy();
        UserService userService =(UserService) handlerProxy.newProxyInstance(new UserServiceImp());
        userService.addUser("zhangsan", "123456");
        
        }
}
通过动态代理我们可以做很多操作,如进行日志处理、事物管理、权限控制等事情。


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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马