Java中AOP技术详解

  1. AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种编程思想。  
  2. 从OOP角度分析,我们关注业务的处理逻辑,是属于纵向的行为,从AOP角度分析,我们关注对象行为发生时的问题,是属于横向的行为。  
  3.   
  4. AOP 作用:  
  5. 1   监控函数的调用  
  6. 2   捕获异常发生  
  7.   
  8. 实际应用在:事务、安全、日志等横切关注。  
  9.   
  10. 两种实现AOP的方式:  
  11.     1,JDK提供的动态代理实现   
  12. //接口  
  13. public interface UserBean  
  14. {  
  15.     void getUser();  
  16.     void addUser();  
  17.     void updateUser();  
  18.     void deleteUser();  
  19. }  
  20. //原始实现类  
  21. public class UserBeanImpl implements UserBean  
  22. {  
  23.     private String user = null;  
  24.     public UserBeanImpl()  
  25.     {         
  26.     }     
  27.     public UserBeanImpl(String user)  
  28.     {  
  29.         this.user = user;  
  30.     }     
  31.     public String getUserName()  
  32.     {  
  33.         return user;  
  34.     }     
  35.     public void getUser()  
  36.     {  
  37.         System.out.println("this is getUser() method!");  
  38.     }  
  39.   
  40.     public void setUser(String user)  
  41.     {  
  42.         this.user = user;  
  43.         System.out.println("this is setUser() method!");  
  44.     }  
  45.     public void addUser()  
  46.     {  
  47.         System.out.println("this is addUser() method!");  
  48.     }  
  49.       
  50.     public void updateUser()  
  51.     {  
  52.         System.out.println("this is updateUser() method!");  
  53.     }     
  54.     public void deleteUser()  
  55.     {  
  56.         System.out.println("this is deleteUser() method!");    
  57.     }         
  58. }  
  59. //代理类  
  60. import java.lang.reflect.InvocationHandler;  
  61. import java.lang.reflect.Method;  
  62. import java.lang.reflect.Proxy;  
  63. import com.cignacmc.finance.bean.UserBeanImpl;  
  64.   
  65. public class UserBeanProxy implements InvocationHandler  
  66. {  
  67.     private Object targetObject;  
  68.       
  69.     public  UserBeanProxy(Object targetObject)  
  70.     {  
  71.         this.targetObject = targetObject;         
  72.     }  
  73.       
  74.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  
  75.     {  
  76.         UserBeanImpl userBean = (UserBeanImpl) targetObject;  
  77.         String userName = userBean.getUserName();  
  78.         Object result = null;  
  79.           
  80.         //权限判断  
  81.         if(userName != null && !"".equals(userName))  
  82.         {  
  83.             result = method.invoke(targetObject, args);  
  84.         }  
  85.           
  86.         return result;  
  87.     }  
  88. }  
  89.   
  90. //测试类  
  91. import java.lang.reflect.Proxy;  
  92.   
  93. import com.cignacmc.finance.bean.UserBean;  
  94. import com.cignacmc.finance.bean.UserBeanImpl;  
  95. import com.cignacmc.finance.proxy.UserBeanProxy;  
  96.   
  97. public class ProxyExe  
  98. {  
  99.     public static void main(String[] args)  
  100.     {  
  101.         System.out.println("Proved.............");  
  102.         UserBeanImpl targetObject = new UserBeanImpl("Bob Liang");        
  103.         UserBeanProxy proxy = new UserBeanProxy(targetObject);  
  104.         //生成代理对象          
  105.         UserBean object = (UserBean)Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),   
  106.                 targetObject.getClass().getInterfaces(), proxy);  
  107.         object.addUser();  
  108.           
  109.         System.out.println("NO Proved.............");  
  110.         targetObject = new UserBeanImpl();        
  111.         proxy = new UserBeanProxy(targetObject);  
  112.         //生成代理对象          
  113.         object = (UserBean)Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),   
  114.                 targetObject.getClass().getInterfaces(), proxy);  
  115.         object.addUser();  
  116.                   
  117.     }  
  118. }  
  119.   
  120. 输出:  
  121. Proved.............  
  122. this is addUser() method!  
  123. NO Proved.............  
  124.   
  125. 从上面这个例子可以成功拦截了调用的方法addUser()并对其做了相应的处理   
  126.   
  127.     2, 通过cglib创建代理类, 好处是不要求我们的目标对象实现接口  
  128. //原始类  
  129. public class ClientBean  
  130. {  
  131.     private String name = null;  
  132.   
  133.     public ClientBean()  
  134.     {  
  135.   
  136.     }  
  137.   
  138.     public ClientBean(String name)  
  139.     {  
  140.         this.name = name;  
  141.     }  
  142.   
  143.     public void addClient()  
  144.     {  
  145.         System.out.println("this is addClient() method!");  
  146.     }  
  147.   
  148.     public void deleteClient()  
  149.     {  
  150.         System.out.println("this is deleteClient() method!");  
  151.     }  
  152.   
  153.     public void getClient()  
  154.     {  
  155.         System.out.println("this is getClient() method!");  
  156.     }  
  157.   
  158.     public void updateClient()  
  159.     {  
  160.         System.out.println("this is updateClient() method!");  
  161.     }  
  162.   
  163.     public String getClientName()  
  164.     {  
  165.         return name;  
  166.     }  
  167.   
  168.     public void setClientName(String name)  
  169.     {  
  170.         this.name = name;  
  171.     }  
  172. }  
  173. //代理类  
  174. import java.lang.reflect.Method;  
  175.   
  176. import com.cignacmc.finance.bean.ClientBean;  
  177.   
  178. import net.sf.cglib.proxy.Enhancer;  
  179. import net.sf.cglib.proxy.MethodInterceptor;  
  180. import net.sf.cglib.proxy.MethodProxy;  
  181.   
  182. public class CGLibProxy implements MethodInterceptor  
  183. {  
  184.     private Object targetObject;  
  185.       
  186.     public Object createProxyObject(Object targetObject)  
  187.     {  
  188.         this.targetObject = targetObject;  
  189.         Enhancer enhancer = new Enhancer();  
  190.         enhancer.setSuperclass(this.targetObject.getClass());  
  191.         enhancer.setCallback(this);  
  192.         return enhancer.create();  
  193.     }  
  194.       
  195.     public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable  
  196.     {  
  197.         ClientBean clientBean = (ClientBean)targetObject;  
  198.         String userName = clientBean.getClientName();  
  199.         Object result = null;  
  200.           
  201.         if(userName != null && !"".equals(userName))  
  202.         {  
  203.             result = method.invoke(targetObject, args);  
  204.         }  
  205.         return result;  
  206.     }  
  207. }  
  208. //测试类  
  209. import java.lang.reflect.Proxy;  
  210.   
  211. import com.cignacmc.finance.bean.ClientBean;  
  212. import com.cignacmc.finance.bean.UserBean;  
  213. import com.cignacmc.finance.bean.UserBeanImpl;  
  214. import com.cignacmc.finance.proxy.CGLibProxy;  
  215. import com.cignacmc.finance.proxy.UserBeanProxy;  
  216.   
  217. public class ProxyExe  
  218. {  
  219.     public static void main(String[] args)  
  220.     {     
  221.         System.out.println(".............CGLIB Proxy....................");  
  222.         System.out.println("Proved....................");  
  223.         CGLibProxy cproxy = new CGLibProxy();  
  224.         ClientBean clientBean = (ClientBean)cproxy.createProxyObject(new ClientBean("Bob Liang"));  
  225.         clientBean.addClient();  
  226.           
  227.         System.out.println("NO Proved....................");  
  228.         cproxy = new CGLibProxy();  
  229.         clientBean = (ClientBean)cproxy.createProxyObject(new ClientBean());  
  230.         clientBean.addClient();  
  231.                   
  232.     }  
  233. }  
  234.   
  235. 输出:  
  236. .............CGLIB Proxy....................  
  237. Proved....................  
  238. this is addClient() method!  
  239. NO Proved....................  
  240.   
  241.   
  242. 切面(Aspect):对横切关注点的抽象(类似类对对象的抽象)   
  243. 连接点(JoinPoint):被拦截到的点,泛指方法   
  244. 切入点(CutPoint):对哪些连接点进行拦截的定义   
  245. 通知(Advice):在特定的连接点,AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后)   
  246. 引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。   
  247. 目标对象(Target Object): 包含连接点的对象。也被称作 被通知或被代理对象。   
  248. AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。   
  249. 织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样, 在运行时完成织入。   
Java代码   收藏代码
  1. AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种编程思想。  
  2. 从OOP角度分析,我们关注业务的处理逻辑,是属于纵向的行为,从AOP角度分析,我们关注对象行为发生时的问题,是属于横向的行为。  
  3.   
  4. AOP 作用:  
  5. 1   监控函数的调用  
  6. 2   捕获异常发生  
  7.   
  8. 实际应用在:事务、安全、日志等横切关注。  
  9.   
  10. 两种实现AOP的方式:  
  11.     1,JDK提供的动态代理实现   
  12. //接口  
  13. public interface UserBean  
  14. {  
  15.     void getUser();  
  16.     void addUser();  
  17.     void updateUser();  
  18.     void deleteUser();  
  19. }  
  20. //原始实现类  
  21. public class UserBeanImpl implements UserBean  
  22. {  
  23.     private String user = null;  
  24.     public UserBeanImpl()  
  25.     {         
  26.     }     
  27.     public UserBeanImpl(String user)  
  28.     {  
  29.         this.user = user;  
  30.     }     
  31.     public String getUserName()  
  32.     {  
  33.         return user;  
  34.     }     
  35.     public void getUser()  
  36.     {  
  37.         System.out.println("this is getUser() method!");  
  38.     }  
  39.   
  40.     public void setUser(String user)  
  41.     {  
  42.         this.user = user;  
  43.         System.out.println("this is setUser() method!");  
  44.     }  
  45.     public void addUser()  
  46.     {  
  47.         System.out.println("this is addUser() method!");  
  48.     }  
  49.       
  50.     public void updateUser()  
  51.     {  
  52.         System.out.println("this is updateUser() method!");  
  53.     }     
  54.     public void deleteUser()  
  55.     {  
  56.         System.out.println("this is deleteUser() method!");    
  57.     }         
  58. }  
  59. //代理类  
  60. import java.lang.reflect.InvocationHandler;  
  61. import java.lang.reflect.Method;  
  62. import java.lang.reflect.Proxy;  
  63. import com.cignacmc.finance.bean.UserBeanImpl;  
  64.   
  65. public class UserBeanProxy implements InvocationHandler  
  66. {  
  67.     private Object targetObject;  
  68.       
  69.     public  UserBeanProxy(Object targetObject)  
  70.     {  
  71.         this.targetObject = targetObject;         
  72.     }  
  73.       
  74.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  
  75.     {  
  76.         UserBeanImpl userBean = (UserBeanImpl) targetObject;  
  77.         String userName = userBean.getUserName();  
  78.         Object result = null;  
  79.           
  80.         //权限判断  
  81.         if(userName != null && !"".equals(userName))  
  82.         {  
  83.             result = method.invoke(targetObject, args);  
  84.         }  
  85.           
  86.         return result;  
  87.     }  
  88. }  
  89.   
  90. //测试类  
  91. import java.lang.reflect.Proxy;  
  92.   
  93. import com.cignacmc.finance.bean.UserBean;  
  94. import com.cignacmc.finance.bean.UserBeanImpl;  
  95. import com.cignacmc.finance.proxy.UserBeanProxy;  
  96.   
  97. public class ProxyExe  
  98. {  
  99.     public static void main(String[] args)  
  100.     {  
  101.         System.out.println("Proved.............");  
  102.         UserBeanImpl targetObject = new UserBeanImpl("Bob Liang");        
  103.         UserBeanProxy proxy = new UserBeanProxy(targetObject);  
  104.         //生成代理对象          
  105.         UserBean object = (UserBean)Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),   
  106.                 targetObject.getClass().getInterfaces(), proxy);  
  107.         object.addUser();  
  108.           
  109.         System.out.println("NO Proved.............");  
  110.         targetObject = new UserBeanImpl();        
  111.         proxy = new UserBeanProxy(targetObject);  
  112.         //生成代理对象          
  113.         object = (UserBean)Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),   
  114.                 targetObject.getClass().getInterfaces(), proxy);  
  115.         object.addUser();  
  116.                   
  117.     }  
  118. }  
  119.   
  120. 输出:  
  121. Proved.............  
  122. this is addUser() method!  
  123. NO Proved.............  
  124.   
  125. 从上面这个例子可以成功拦截了调用的方法addUser()并对其做了相应的处理   
  126.   
  127.     2, 通过cglib创建代理类, 好处是不要求我们的目标对象实现接口  
  128. //原始类  
  129. public class ClientBean  
  130. {  
  131.     private String name = null;  
  132.   
  133.     public ClientBean()  
  134.     {  
  135.   
  136.     }  
  137.   
  138.     public ClientBean(String name)  
  139.     {  
  140.         this.name = name;  
  141.     }  
  142.   
  143.     public void addClient()  
  144.     {  
  145.         System.out.println("this is addClient() method!");  
  146.     }  
  147.   
  148.     public void deleteClient()  
  149.     {  
  150.         System.out.println("this is deleteClient() method!");  
  151.     }  
  152.   
  153.     public void getClient()  
  154.     {  
  155.         System.out.println("this is getClient() method!");  
  156.     }  
  157.   
  158.     public void updateClient()  
  159.     {  
  160.         System.out.println("this is updateClient() method!");  
  161.     }  
  162.   
  163.     public String getClientName()  
  164.     {  
  165.         return name;  
  166.     }  
  167.   
  168.     public void setClientName(String name)  
  169.     {  
  170.         this.name = name;  
  171.     }  
  172. }  
  173. //代理类  
  174. import java.lang.reflect.Method;  
  175.   
  176. import com.cignacmc.finance.bean.ClientBean;  
  177.   
  178. import net.sf.cglib.proxy.Enhancer;  
  179. import net.sf.cglib.proxy.MethodInterceptor;  
  180. import net.sf.cglib.proxy.MethodProxy;  
  181.   
  182. public class CGLibProxy implements MethodInterceptor  
  183. {  
  184.     private Object targetObject;  
  185.       
  186.     public Object createProxyObject(Object targetObject)  
  187.     {  
  188.         this.targetObject = targetObject;  
  189.         Enhancer enhancer = new Enhancer();  
  190.         enhancer.setSuperclass(this.targetObject.getClass());  
  191.         enhancer.setCallback(this);  
  192.         return enhancer.create();  
  193.     }  
  194.       
  195.     public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable  
  196.     {  
  197.         ClientBean clientBean = (ClientBean)targetObject;  
  198.         String userName = clientBean.getClientName();  
  199.         Object result = null;  
  200.           
  201.         if(userName != null && !"".equals(userName))  
  202.         {  
  203.             result = method.invoke(targetObject, args);  
  204.         }  
  205.         return result;  
  206.     }  
  207. }  
  208. //测试类  
  209. import java.lang.reflect.Proxy;  
  210.   
  211. import com.cignacmc.finance.bean.ClientBean;  
  212. import com.cignacmc.finance.bean.UserBean;  
  213. import com.cignacmc.finance.bean.UserBeanImpl;  
  214. import com.cignacmc.finance.proxy.CGLibProxy;  
  215. import com.cignacmc.finance.proxy.UserBeanProxy;  
  216.   
  217. public class ProxyExe  
  218. {  
  219.     public static void main(String[] args)  
  220.     {     
  221.         System.out.println(".............CGLIB Proxy....................");  
  222.         System.out.println("Proved....................");  
  223.         CGLibProxy cproxy = new CGLibProxy();  
  224.         ClientBean clientBean = (ClientBean)cproxy.createProxyObject(new ClientBean("Bob Liang"));  
  225.         clientBean.addClient();  
  226.           
  227.         System.out.println("NO Proved....................");  
  228.         cproxy = new CGLibProxy();  
  229.         clientBean = (ClientBean)cproxy.createProxyObject(new ClientBean());  
  230.         clientBean.addClient();  
  231.                   
  232.     }  
  233. }  
  234.   
  235. 输出:  
  236. .............CGLIB Proxy....................  
  237. Proved....................  
  238. this is addClient() method!  
  239. NO Proved....................  
  240.   
  241.   
  242. 切面(Aspect):对横切关注点的抽象(类似类对对象的抽象)   
  243. 连接点(JoinPoint):被拦截到的点,泛指方法   
  244. 切入点(CutPoint):对哪些连接点进行拦截的定义   
  245. 通知(Advice):在特定的连接点,AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后)   
  246. 引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。   
  247. 目标对象(Target Object): 包含连接点的对象。也被称作 被通知或被代理对象。   
  248. AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。   
  249. 织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样, 在运行时完成织入。   


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值