spring3.2.2的aop執行個體講解

來源:互聯網
上載者:User

AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程(也叫面向方面),可以通過先行編譯方式和運行期動態代理實現在不修改原始碼的情況下給程式動態統一添加功能的一種技術。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。

 

首先我們寫一個介面。

因為所有aop執行個體代理的都是介面。

DemoInterface.Java

 

packagecom.fish;

 

public
interface
DemoInterface {

 

    public
abstract
String getName();

 

    public
abstract void
sava(String myName);

 

    public
abstract void
update(String myName, String heName);

 

}

 

然後寫一個對該介面的執行個體

packagecom.fish.impl;

 

importcom.fish.DemoInterface;

 

public
class
Demo implements DemoInterface {

 

    public String getName() {

        return
"fish";

    }

 

    public
void
sava(String myName) {

        System.out.println("這是一個儲存方法");

    }

 

    public
void
update(String myName, StringheName) {

        System.out.println("這是一個更新方法");

    }

 

}

接著我們寫一個普通的java類,用作代理

packagecom.fish.aop;

 

public
class
MyAop {

   public
void
myMthod1(){

      System.out.println("前置通知");

   }

   public
void
myMthod2(){

      System.out.println("後置通知");

   }

   public
void
myMthod3(){

      System.out.println("最終通知");

   }

  

}

下面我們在xml配置

Spring.xml

 

<beans
xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"

    xsi:schemaLocation="

http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">

    <aop:aspectj-autoproxy
/>   //首先開啟代理aop

    <bean
id="demo"class="com.fish.impl.Demo"></bean> 
//執行個體化兩個類

    <bean
id="myAop"class="com.fish.aop.MyAop"></bean> 
//執行個體化兩個類

 

    <aop:config>                           
 //對aop的註冊

        <aop:aspect
id="asp"
ref="myAop"
 //寫一個切面,ref關聯的是代理類

            <aop:pointcut
expression="execution(* com.fish.impl.Demo.*(..))"//攔截是的要代理的目的對象,com前面的*是代表要攔截所有com。FISH包下的類,第二個*表示demo裡面的所有方法,()裡面是方法的參數。

                id="mycut"/>

                <aop:before
method="myMthod1"
pointcut-ref="mycut"/> 
//然後在before代表在切入點之前執行代理函數mymthod1方法的內容。

<aop:aftermethod="myMthod2" pointcut-ref="mycut" />//有前就有後,所以在地理目標對象的後面。切入。然後還有很多狀態。

        </aop:aspect>

    </aop:config>

 

</beans>

 

下面我寫一個測試類別

Test.Java

 

packagecom.fish;

 

importorg.springframework.context.ApplicationContext;

importorg.springframework.context.support.ClassPathXmlApplicationContext;

 

 

 

public
class
Test {

public
static void
main(String[] args) {

  ApplicationContext context=  new   ClassPathXmlApplicationContext("spring.xml");

  DemoInterface demo=(DemoInterface) context.getBean("demo");//這裡代理的是介面,要不會報類型轉化異常的錯誤哦。不是demo而是DemoInterface介面。

demo.sava("aa");

 

}

}

所以我們可以看到結果是:

前置通知

這是一個儲存方法

後置通知

 

從這個我們就可以知道,執行的順序。Aop其實就是一種動態代理。對於23中設計模式的代理模式我就不說了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.