博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring AOP
阅读量:6242 次
发布时间:2019-06-22

本文共 6860 字,大约阅读时间需要 22 分钟。

hot3.png

1、概述

103636_4xiz_2320342.png

 103755_6Z5b_2320342.png103847_nmgH_2320342.png103928_u3Dx_2320342.png104015_rrNc_2320342.png104100_lHgz_2320342.png

2、AOP术语介绍

104313_l4ZY_2320342.jpeg

120208_5BFq_2320342.png

104509_xuN7_2320342.png104553_ZHlO_2320342.png104654_362h_2320342.png104810_jkUh_2320342.png104941_If7H_2320342.png

115657_NKUM_2320342.png115759_X2OA_2320342.png115905_CI90_2320342.png120041_9FlG_2320342.png

120448_OrSn_2320342.png120331_0jYW_2320342.png

120651_bknQ_2320342.png120731_qsH8_2320342.png120810_l3dL_2320342.png120855_jVco_2320342.png120936_JOgj_2320342.png110327_chr2_2320342.png110410_TjB9_2320342.png110451_YCV5_2320342.png110548_ifkJ_2320342.png

3、Spring创建advice

110833_LDVR_2320342.png

110914_5Rw7_2320342.png110951_ejvz_2320342.png111039_8pJg_2320342.png111117_BEhz_2320342.png111151_zBRw_2320342.png111232_fOKe_2320342.png121600_ny8l_2320342.png

121643_TOF5_2320342.png121737_xrEE_2320342.png

121841_rKk4_2320342.png

121919_L9t3_2320342.png121959_SWCo_2320342.png122101_FVgi_2320342.png122142_zqZX_2320342.png122236_G18G_2320342.png122500_C2H8_2320342.jpeg

122629_pWlH_2320342.png

Ihello接口:

package com.ljb.spring;/** * 创建Ihello接口(练习beforeAdvice) * @author Administrator * */public interface Ihello { public void sayHello(String str);}

Hello实现类:

 package com.ljb.spring;/** * 创建Ihello实现类(练习beforeAdvice) * @author Administrator * */public class Hello implements Ihello { @Override public void sayHello(String str) {  System.out.println("你好"+str); }}

创建Advice(SayBeforeAdvice):

package com.ljb.spring;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;public class SayBeforeAdvice implements MethodBeforeAdvice { @Override public void before(Method arg0, Object[] arg1, Object arg2)   throws Throwable {  System.out.println("在方法之前执行的事情"); }}

applicationContext.xml

   
   
   
   
   
   
       
       
           
com.ljb.spring.Ihello
              
       
           
              
       
           
               
sba
           
          

TestBeforeAdvice

package com.ljb.spring;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestBeforeAdvice { /**  * @param args  */ public static void main(String[] args) {  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  Ihello hello = (Ihello)context.getBean("helloProxy");  hello.sayHello("访客"); }}

执行结果:

在方法之前执行的事情

你好访客

 142516_De4z_2320342.png

SayAfterAdvice:

package com.ljb.spring;import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;public class SayAfterAdvice implements AfterReturningAdvice { @Override public void afterReturning(Object arg0, Method arg1, Object[] arg2,   Object arg3) throws Throwable {  System.out.println("方法执行之后做的事情"); }}

applicationContext.xml

   
   
   
   
   
   
   
       
       
           
com.ljb.spring.Ihello
              
       
           
              
       
           
               
sba
               
saa
           
          

执行结果:

在方法之前执行的事情

你好访客
方法执行之后做的事情

143421_drKU_2320342.png143506_ia9d_2320342.png143545_8ZiA_2320342.png143633_kz5i_2320342.png143722_3kyy_2320342.png143842_0Ceo_2320342.png143944_qqgb_2320342.png144035_XfKi_2320342.png144216_Jqca_2320342.png

 144719_S4s7_2320342.png

144834_nh5m_2320342.png

144941_U86U_2320342.png

执行结果:

Exception happened java.lang.Exception: 异常发生 was thrown in public abstract void com.ljb.spring.Ihello.sayHello(java.lang.String) throws java.lang.Exception

145059_X7wG_2320342.png145146_EJZI_2320342.png145231_1aVn_2320342.png145342_BimI_2320342.png145459_DQ38_2320342.png145541_W0P1_2320342.png145630_xa58_2320342.png145821_zbUd_2320342.png145903_zC7n_2320342.png145951_6P0a_2320342.png150036_HG86_2320342.png150119_1cKd_2320342.png

162744_wXrm_2320342.png

155502_5OGg_2320342.png155544_XO04_2320342.png155626_V81N_2320342.png155842_MThf_2320342.png162822_Ot2G_2320342.png162905_ML2B_2320342.png163140_jOs8_2320342.png163228_a8Jk_2320342.png163315_fFO6_2320342.png163358_wcPn_2320342.png163446_enSM_2320342.png163530_9pj7_2320342.png163614_A9Py_2320342.png163700_ZX6E_2320342.png163751_Woqd_2320342.png163853_p9Lj_2320342.png163943_HlBq_2320342.png164027_iQaW_2320342.png164254_eGhF_2320342.png

164349_DK2D_2320342.png164429_36br_2320342.png165344_bdBD_2320342.png112235_ibtF_2320342.png112319_LlTr_2320342.png112410_orsG_2320342.png112505_WWDQ_2320342.png112543_M5pC_2320342.png112625_qus1_2320342.png112800_5Myy_2320342.png112852_c7Vf_2320342.png113020_fkey_2320342.png113109_kmQ3_2320342.png113212_CIsY_2320342.png113259_kMZQ_2320342.png113408_vCIR_2320342.png113447_u9gx_2320342.png113540_s2MA_2320342.png

113811_0GQA_2320342.png

IHello.java

package com.ljb.spring.annotation;public interface IHello { public void sayHello (String str);}

Hello.java

package com.ljb.spring.annotation;public class Hello implements IHello { @Override public void sayHello(String str) {  System.out.println("你好"+str); }}

AspectBean.java

package com.ljb.spring.annotation;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;/** * 切面类 * @author Administrator * */@Aspectpublic class AspectBean { // 注意(第一个*后面有空格) @Pointcut("execution(* com.ljb.spring.annotation.*Hello.*(..))") public void log() {}  @Before(value="log()") public void staLog() {  System.out.println("开始记录"); }  @After(value="log()") public void endLog () {  System.out.println("结束记录"); }}

AspectTest.java

package com.ljb.spring.annotation;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AspectTest { /**  * @param args  */ public static void main(String[] args) {  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  IHello hello = (IHello)context.getBean("he");  hello.sayHello("访客"); }}

applicationContext.xml

     
       
      
      
    

执行结果:

开始记录

你好访客
结束记录

 4、定义Pointcut、Advisor

141043_opKK_2320342.png

 141156_Y2ni_2320342.png141240_iNMt_2320342.png141413_Hy7w_2320342.png

141521_xS2x_2320342.png141621_Ji8K_2320342.png141724_f6qW_2320342.png141809_ZUoI_2320342.png141903_eFU3_2320342.png141951_YWl1_2320342.png142035_l9PG_2320342.png

IHello.java

package com.ljb.spring;/** * 创建Ihello接口(练习beforeAdvice) * @author Administrator * */public interface Ihello { public void helloChina (String str);  public void helloAmerica(String str);  public void woHello(String str);}

Hello.java

package com.ljb.spring;/** * 创建Ihello实现类(练习beforeAdvice) * @author Administrator * */public class Hello implements Ihello { @Override public void helloChina(String str) {  System.out.println("你好中国"+str);   } @Override public void helloAmerica(String str) {  System.out.println("你好美国"+str);   } @Override public void woHello(String str) {  System.out.println("我的方法名不匹配"+str);   }}

SayBeforeAdvice.java

package com.ljb.spring;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;public class SayBeforeAdvice implements MethodBeforeAdvice { @Override public void before(Method arg0, Object[] arg1, Object arg2)   throws Throwable {  System.out.println("在方法之前执行的事情"); }}

SayAfterAdvice.java

package com.ljb.spring;import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;public class SayAfterAdvice implements AfterReturningAdvice { @Override public void afterReturning(Object arg0, Method arg1, Object[] arg2,   Object arg3) throws Throwable {  System.out.println("方法执行之后做的事情"); }}

applicationContext.xml

   
   
   
   
   
       
           
hello*
              
           
             
       
           
.*Hello.hello.*
              
           
             
   
       
       
           
com.ljb.spring.Ihello
              
       
           
              
       
           
               
helloPersonBefore
               
helloPersonAfter
           
          

Test.java

package com.ljb.spring;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestBeforeAdvice { /**  * @param args  */ public static void main(String[] args) {  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  Ihello hello = (Ihello)context.getBean("helloProxy");  hello.helloChina("访客");  hello.helloAmerica("访客");  hello.woHello("访客"); }}

执行结果:

在方法之前执行的事情

你好中国访客
方法执行之后做的事情
在方法之前执行的事情
你好美国访客
方法执行之后做的事情
我的方法名不匹配访客

 5、动态代理

152356_jMGd_2320342.png

152443_x9nk_2320342.png152625_HuZX_2320342.png

 152932_m997_2320342.png153010_YJSj_2320342.png153052_a6SQ_2320342.png153136_Xjeh_2320342.png153234_jI8d_2320342.png153317_j2Yt_2320342.png153402_RAMY_2320342.png153520_YvdI_2320342.png153610_kSgS_2320342.png153654_MkfO_2320342.png153748_JwFw_2320342.png153828_v4kk_2320342.png153908_XpQp_2320342.png153950_kEK5_2320342.png

DynamicHandler.java

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy; public class DynamicHandler implements InvocationHandler { private Object proxy;  public Object bind(Object proxy) {  this.proxy = proxy;  return Proxy.newProxyInstance(proxy.getClass().getClassLoader(), proxy.getClass().getInterfaces(), this); } @Override public Object invoke(Object arg0, Method method, Object[] arg2)   throws Throwable {  Object result = null;  System.out.println("动态代理前");  result = method.invoke(proxy, arg2);  System.out.println("动态代理后");  return result; }}

TestProxy.java

import com.ljb.spring.annotation.Hello;import com.ljb.spring.annotation.IHello;public class TestProxy { /**  * @param args  */ public static void main(String[] args) {  DynamicHandler handler = new DynamicHandler();  IHello hello = (IHello)handler.bind(new Hello());  hello.sayHello("访客"); }}

执行结果:

动态代理前

你好访客
动态代理后

6、小结

154148_y8O1_2320342.png

 

转载于:https://my.oschina.net/u/2320342/blog/469086

你可能感兴趣的文章
bash腳本編程之三 条件判断及算数运算
查看>>
php cookie
查看>>
linux下redis安装
查看>>
量子通信和大数据最有市场突破前景
查看>>
如何申请开通微信多客服功能
查看>>
Sr_C++_Engineer_(LBS_Engine@Global Map Dept.)
查看>>
非监督学习算法:异常检测
查看>>
jquery的checkbox,radio,select等方法总结
查看>>
Linux coredump
查看>>
Ubuntu 10.04安装水晶(Mercury)无线网卡驱动
查看>>
我的友情链接
查看>>
ElasticSearch 2 (32) - 信息聚合系列之范围限定
查看>>
VS2010远程调试C#程序
查看>>
windows查看端口占用
查看>>
Yii用ajax实现无刷新检索更新CListView数据
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>