zoukankan      html  css  js  c++  java
  • [原]spring学习笔记8.2动态代理基础

    [学习资料来自尚学堂公布之视频]
    [前面已经转了几篇有关静态/动态代理的帖子.写的都很不错.自己也跟着视频敲了几篇代码.
    现在贴出来.算是有有始有终吧.]
    1.UserManager接口
     1package com.zyl.proxy;
     2
     3public interface UserManager {
     4    
     5    public void addUer(String name,String password);
     6    
     7    public void delUser(String id);
     8    
     9    public void modifyUser(int id, String name, String password);
    10    
    11}

    12
    2.实现接口的UserManagerImpl类
     1package com.zyl.proxy;
     2
     3public class UserManagerImpl implements UserManager {
     4
     5
     6    public void addUer(String name, String password) {
     7       //添加日志/安全性检查
     8        //checksafe();
     9        //采用添加代理类的方法会如何?
    10        System.out.println("UserManagerImpl.addUser()123");
    11
    12    }

    13
    14    @Override
    15    public void delUser(String id) {
    16        //添加日志/安全性检查
    17        //checksafe();
    18           System.out.println("UserManagerImpl.delUser()");
    19    }

    20
    21    @Override
    22    public void modifyUser(int id, String name, String password) {
    23        //添加日志/安全性检查
    24        //checksafe();
    25           System.out.println("UserManagerImpl.modifyUser()");
    26
    27    }

    28//    private void checksafe(){
    29//        System.out.println("检查安全性的方法");
    30//    }
    31}

    32
    注释的地方不用理会
    3.动态代理的类safeHandler
     1package com.zyl.proxy;
     2
     3import java.lang.reflect.InvocationHandler;
     4import java.lang.reflect.Method;
     5import java.lang.reflect.Proxy;
     6
     7public class safeHandler implements InvocationHandler //实现InvocationHandler接口
     8    
     9    private Object targetObj;
    10    public Object newProxy(Object targetObj){
    11        this.targetObj=targetObj;
    12        //生成动态代理::
    13        //对象的接口等ooxx
    14        return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),targetObj.getClass().getInterfaces(),
    15                this);//targetObj.getClass().getInterfaces()的传入,所以只要实现了接口的类都会被动态代理
    16        
    17    }

    18    public Object invoke(Object proxy, Method method, Object[] args)//args是传递过来的参数,比如name为张三
    19            throws Throwable 
    20        //调用任何方法前都会前调用invoke方法,所以我们在invoke方法前放置需要调用的代码 如安全性检查/log日志等等添加的方法
    21        //这里还可以加入一些逻辑判断,是否加入安全性检查
    22        checksafe();
    23         System.out.println("方法名是"+method.getName());
    24         for(int i=0;i<args.length;i++){
    25             System.out.println("哈哈"+args[i]);
    26         }

    27         //临时添加方法调用结束
    28         //以下调用一般的方法
    29        Object result=null;
    30        
    31        try{
    32            method.invoke(targetObj,args); //真正的调用对象的实现的方法(非添加的那些方法)
    33        }
    catch(Exception e){
    34            e.printStackTrace();
    35        }

    36        return result; //invoke方法需要返回一个对象.所以前面定义了一个Object result=null; 这里返回result
    37    }

    38    //将要加入的安全性检查等等类似的方法放在此类中
    39    private void checksafe(){
    40        System.out.println("检查安全性的方法");
    41    }

    42
    43}

    44
    4.client端:
     1package com.zyl.ooxx;
     2
     3import com.zyl.proxy.UserManager;
     4import com.zyl.proxy.UserManagerImpl;
     5import com.zyl.proxy.safeHandler;
     6
     7
     8public class client {
     9
    10    public static void main(String[] args) {
    11        safeHandler handler=new safeHandler();//建立代理类的实例
    12        UserManager usermanager=(UserManager)handler.newProxy(new UserManagerImpl());//传入代理对象转成原接口类型
    13        usermanager.addUer("实际是调用代理的方法""2222");//调用代理中的东西,然后再调用代理对象的ooxx
    14       
    15    }

    16
    17}

    18
    就到这里吧.学习spring aop的基础差不多打好了
  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3562425.html
Copyright © 2011-2022 走看看