菜鸟学习Spring——60s让你学会动态代理原理(动态代理是怎么生成的)

一、为什么要使用动态代理
        当一个对象或多个对象实现了N中方法的时候,由于业务需求需要把这个对象和多个对象的N个方法加入一个共同的方法,比如把所有对象的所有方法加入事务这个时候有三种方法:
        方法一:一个一个对象一个一个方法去加,很显然这个方法是一个比较笨的方法。
        方法二:加一个静态代理对象将这个静态代理对象实现要加事务对象的接口。然后在静态代理对象里面每个方法里面加上事务。
        方法三:使用动态代理对象,进行动态的加载事务。
        使用动态代理是为了让对象实现了开闭原则,对扩展开放,而对修改关闭。 Spring的AOP其实就是用了动态代理+IoC容器实现的
二、代码实现。

        UserManger.java接口

  1. package com.tgb.spring;  
  2.   
  3. public interface UserManager {  
  4.       
  5.     public void addUser(String username,String password);  
  6.       
  7.     public void delUser(int userId);  
  8.       
  9.     public String findUserById(int userId);  
  10.       
  11.     public void modifyUser(int userId,String username,String password);  
  12.       
  13. }  


方法一 常规的做法:

          UserMangerImpl.Java

  1. package com.tgb.spring;  
  2.   
  3. public class UserManagerImpl implements UserManager {  
  4.   
  5.     public void addUser(String username, String password) {  
  6.         checkSecurity();  
  7.             System.out.println("UserManager.addUser");  
  8.   
  9.     }  
  10.   
  11.     public void delUser(int userId) {  
  12.         checkSecurity();  
  13.         System.out.println("UserManager.delUser");  
  14.   
  15.     }  
  16.   
  17.     public String findUserById(int userId) {  
  18.         checkSecurity();  
  19.         System.out.println("UserManager.findUserById");  
  20.     return  "张三";  
  21.     }  
  22.   
  23.     public void modifyUser(int userId, String username, String password) {  
  24.         checkSecurity();  
  25.         System.out.println("UserManager.modifyUser");  
  26.   
  27.     }  
  28.       
  29.     private void checkSecurity(){  
  30.         System.out.println("checkSecurity");  
  31.   
  32.     }  
  33. }  


Client.java

  1. package com.tgb.spring;  
  2.   
  3. public class Client {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         UserManager userManager=new UserManagerImpl();  
  10.         userManager.addUser("11""1231");  
  11.     }  
  12.   
  13. }  


方法二 静态代理:

       UserManagerImpl.java

  1. package com.tgb.spring;  
  2.   
  3. public class UserManagerImpl implements UserManager {  
  4.   
  5.     public void addUser(String username, String password) {  
  6.         //checkSecurity();  
  7.             System.out.println("UserManager.addUser");  
  8.   
  9.     }  
  10.   
  11.     public void delUser(int userId) {  
  12.         //checkSecurity();  
  13.         System.out.println("UserManager.delUser");  
  14.   
  15.     }  
  16.   
  17.     public String findUserById(int userId) {  
  18.         //checkSecurity();  
  19.         System.out.println("UserManager.findUserById");  
  20.     return  "张三";  
  21.     }  
  22.   
  23.     public void modifyUser(int userId, String username, String password) {  
  24.         //checkSecurity();  
  25.         System.out.println("UserManager.modifyUser");  
  26.   
  27.     }  
  28.       
  29. //  private void checkSecurity(){  
  30. //      System.out.println("checkSecurity");  
  31. //  
  32. //  }  
  33.   
  34. }  


        UserManagerImplProxy.java

  1. package com.tgb.spring;  
  2.   
  3. public class UserManagerImplProxy implements UserManager {  
  4.   
  5.     private UserManager userManager;  
  6.       
  7.     public UserManagerImplProxy(UserManager userManager){  
  8.         this.userManager=userManager;  
  9.     }  
  10.       
  11.     public void addUser(String username, String password) {  
  12.         // TODO Auto-generated method stub  
  13.         checkSecurity();  
  14.         userManager.addUser(username, password);  
  15.     }  
  16.   
  17.     public void delUser(int userId) {  
  18.         // TODO Auto-generated method stub  
  19.         checkSecurity();  
  20.         userManager.delUser(userId);  
  21.     }  
  22.   
  23.     public String findUserById(int userId) {  
  24.         // TODO Auto-generated method stub  
  25.         checkSecurity();  
  26.           
  27.         return userManager.findUserById(userId);  
  28.     }  
  29.   
  30.     public void modifyUser(int userId, String username, String password) {  
  31.         // TODO Auto-generated method stub  
  32.         checkSecurity();  
  33.         userManager.modifyUser(userId, username, password);  
  34.   
  35.     }  
  36.   
  37.             private void checkSecurity(){  
  38.                     System.out.println("checkSecurity");  
  39.           
  40.         }  
  41. }  


Client.java

  1. package com.tgb.spring;  
  2.   
  3. public class Client {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         // TODO Auto-generated method stub  
  10.         UserManagerImpl uesrMangerImpl=new UserManagerImpl();  
  11.         UserManager userManager=new UserManagerImplProxy(uesrMangerImpl);  
  12.           
  13.         userManager.addUser("11""1231");  
  14.     }  
  15.   
  16. }  


方法三:动态代理

        UserManagerImpl.java与方法二的UserManagerImpl.java一样把UserManagerImplProxy.java删除

        新添一个类:

        SecurityHandler.java

  1. package com.tgb.spring;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6.   
  7. public class SecurityHandler implements InvocationHandler {  
  8.   
  9.     private Object targetObject;  
  10.       
  11.     public Object createProxyInstance(Object targetObject){  
  12.         this.targetObject=targetObject;  
  13.         return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),   
  14.                                 targetObject.getClass().getInterfaces(),   
  15.                                 this);  
  16.     }  
  17.       
  18.     public Object invoke(Object proxy, Method method, Object[] args)  
  19.             throws Throwable {  
  20.         // TODO Auto-generated method stub  
  21.         checkSecurity();  
  22.         //调用目标方法  
  23.         Object ret=method.invoke(targetObject, args);  
  24.         return ret;  
  25.     }  
  26.   
  27.       
  28.     private void checkSecurity(){  
  29.         System.out.println("checkSecurity");  
  30.   
  31.     }  
  32.   
  33.   
  34. }  


         Client.java

  1. package com.tgb.spring;  
  2.   
  3.   
  4.   
  5. public class Client {  
  6.   
  7.     public static void main(String[] args) {  
  8.         SecurityHandler handler=new SecurityHandler();  
  9.         UserManager userManager=(UserManager)handler.createProxyInstance(new UserManagerImpl());  
  10.         userManager.addUser("zha""123");  
  11.     }  
  12. }  


       三种方法的效果是一样的如图:


三、总结。

        动态代理的利用给我们编码带来了很大的便利,解决了动态为对象提供服务的方案。动态代理+IoC容器的结合让我们对系统提供服务更加的方便了这样我们也就实现了开闭原则。这样也就能实现了对象想要的时候就有不用的时候就撤出全心全意为开发者服务。


转载自:http://blog.csdn.net/gwblue/article/details/39668211

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值