<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我學spring3 ### ### 6.2.1? 準備環境 首先準備開發需要的jar包,請到spring-framework-3.0.5.RELEASE-dependencies.zip和spring-framework-3.0.5.RELEASE-with-docs中查找如下jar包: ``` org.springframework.aop-3.0.5.RELEASE.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.net.sf.cglib-2.2.0.jar ``` 將這些jar包添加到“Build Path”下。 ### 6.2.2? 定義目標類 1)定義目標接口: 1. package?cn.javass.spring.chapter6.service;?? 2. public?interface?IHelloWorldService?{?? 3. public?void?sayHello();?? 4. }?? 2)定義目標接口實現: 1. package?cn.javass.spring.chapter6.service.impl;?? 2. import?cn.javass.spring.chapter6.service.IHelloWorldService;?? 3. public?class?HelloWorldService?implements?IHelloWorldService?{?? 4. @Override?? 5. public?void?sayHello()?{?? 6. System.out.println("============Hello?World!");?? 7. }?? 8. }?? 注:在日常開發中最后將業務邏輯定義在一個專門的service包下,而實現定義在service包下的impl包中,服務接口以IXXXService形式,而服務實現就是XXXService,這就是規約設計,見名知義。當然可以使用公司內部更好的形式,只要大家都好理解就可以了。 ### 6.2.2? 定義切面支持類 有了目標類,該定義切面了,切面就是通知和切入點的組合,而切面是通過配置方式定義的,因此這定義切面前,我們需要定義切面支持類,切面支持類提供了通知實現: 1. package?cn.javass.spring.chapter6.aop;?? 2. public?class?HelloWorldAspect?{?? 3. //前置通知?? 4. public?void?beforeAdvice()?{?? 5. System.out.println("===========before?advice");?? 6. }?? 7. //后置最終通知?? 8. public?void?afterFinallyAdvice()?{?? 9. System.out.println("===========after?finally?advice");?? 10. }?? 11. }?? 此處HelloWorldAspect類不是真正的切面實現,只是定義了通知實現的類,在此我們可以把它看作就是缺少了切入點的切面。 注:對于AOP相關類最后專門放到一個包下,如“aop”包,因為AOP是動態織入的,所以如果某個目標類被AOP攔截了并應用了通知,可能很難發現這個通知實現在哪個包里,因此推薦使用規約命名,方便以后維護人員查找相應的AOP實現。 ### 6.2.3? 在XML中進行配置 有了通知實現,那就讓我們來配置切面吧: 1)首先配置AOP需要aop命名空間,配置頭如下: 1. &lt;?xml?version="1.0"?encoding="UTF-8"?&gt;?? 2. &lt;beans??xmlns="http://www.springframework.org/schema/beans"?? 3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?? 4. xmlns:aop="http://www.springframework.org/schema/aop"?? 5. xsi:schemaLocation="?? 6. http://www.springframework.org/schema/beans?? 7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd?? 8. http://www.springframework.org/schema/aop?? 9. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"&gt;?? 10. &lt;/beans&gt;?? 2)配置目標類: 1. &lt;bean?id="helloWorldService"?? 2. class="cn.javass.spring.chapter6.service.impl.HelloWorldService"/&gt;?? 3)配置切面: 1. &lt;bean?id="aspect"?class="cn.javass.spring.chapter6.aop.HelloWorldAspect"/&gt;?? 2. &lt;aop:config&gt;?? 3. &lt;aop:pointcut?id="pointcut"?expression="execution(*?cn.javass..*.*(..))"/&gt;?? 4. &lt;aop:aspect?ref="aspect"&gt;?? 5. &lt;aop:before?pointcut-ref="pointcut"?method="beforeAdvice"/&gt;?? 6. &lt;aop:after?pointcut="execution(*?cn.javass..*.*(..))"?method="afterFinallyAdvice"/&gt;?? 7. &lt;/aop:aspect&gt;?? 8. &lt;/aop:config&gt;?? 切入點使用&lt;aop:config&gt;標簽下的&lt;aop:pointcut&gt;配置,expression屬性用于定義切入點模式,默認是AspectJ語法,“execution(* cn.javass..*.*(..))”表示匹配cn.javass包及子包下的任何方法執行。 切面使用&lt;aop:config&gt;標簽下的&lt;aop:aspect&gt;標簽配置,其中“ref”用來引用切面支持類的方法。 前置通知使用&lt;aop:aspect&gt;標簽下的&lt;aop:before&gt;標簽來定義,pointcut-ref屬性用于引用切入點Bean,而method用來引用切面通知實現類中的方法,該方法就是通知實現,即在目標類方法執行之前調用的方法。 最終通知使用&lt;aop:aspect&gt;標簽下的&lt;aop:after &gt;標簽來定義,切入點除了使用pointcut-ref屬性來引用已經存在的切入點,也可以使用pointcut屬性來定義,如pointcut="execution(* cn.javass..*.*(..))",method屬性同樣是指定通知實現,即在目標類方法執行之后調用的方法。 ### 6.2.4 ? ?運行測試 測試類非常簡單,調用被代理Bean跟調用普通Bean完全一樣,Spring AOP將為目標對象創建AOP代理,具體測試代碼如下: 1. package?cn.javass.spring.chapter6;?? 2. import?org.junit.Test;?? 3. import?org.springframework.context.ApplicationContext;?? 4. import?org.springframework.context.support.ClassPathXmlApplicationContext;?? 5. import?cn.javass.spring.chapter6.service.IHelloWorldService;?? 6. import?cn.javass.spring.chapter6.service.IPayService;?? 7. public?class?AopTest?{?? 8. @Test?? 9. public?void?testHelloworld()?{?? 10. ApplicationContext?ctx?=??new?ClassPathXmlApplicationContext("chapter6/helloworld.xml");?? 11. IHelloWorldService?helloworldService?=?? 12. ctx.getBean("helloWorldService",?IHelloWorldService.class);?? 13. helloworldService.sayHello();?? 14. }?? 15. }?? 該測試將輸出如下如下內容: 1. ===========before?advice?? 2. ============Hello?World!?? 3. ===========after?finally?advice?? 從輸出我們可以看出:前置通知在切入點選擇的連接點(方法)之前允許,而后置通知將在連接點(方法)之后執行,具體生成AOP代理及執行過程如圖6-4所示。 ![](https://box.kancloud.cn/2016-05-13_5735471e13bc4.JPG) 圖6-4 Spring AOP框架生成AOP代理過程 原創內容 轉自請注明出處【[http://sishuok.com/forum/blogPost/list/2467.html](http://sishuok.com/forum/blogPost/list/2467.html)】
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看