国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring AOP 入門

CodeSheep / 3348人閱讀

摘要:一以及術(shù)語是的簡稱,被譯為面向切面編程。切面由切點和增強組成,他包括了連接點定義和橫切邏輯代碼的定義,就是負責(zé)實施切面的框架。五使用來定義純粹的切面使用方法也非常簡單,使用的標(biāo)簽。采用動態(tài)代理和動態(tài)代理技術(shù)在運行期間織入。

引言

AOP是軟件開發(fā)思想發(fā)展到一定階段的產(chǎn)物,AOP的出現(xiàn)并不是為了代替OOP,僅作為OOP的有益補充,在下面的例子中這個概念將會得到印證。AOP的應(yīng)用場合是受限制的,一般適用于那些具有橫切邏輯的應(yīng)用場合,例如性能監(jiān)測,訪問控制,事務(wù)管理,日志記錄。在平常的應(yīng)用開發(fā)中AOP很難被使用到,但是AOP是Spring的亮點之一,有必要一看。

一 AOP以及術(shù)語

AOP是Aspect Oriented Programing的簡稱,被譯為面向切面編程。AOP希望將散落在業(yè)務(wù)邏輯函數(shù)中的相同代碼抽取到一個獨立的模塊中。舉個例子:

class A{
    public void run()
    {
        doSomething();
        doAthings();
        doOtherthing();
    }
}
 
class B{
    public void run()
    {
         doSomething();
         doBthings();
         doOtherthing();
    }
}
 
class C{
    public void run()
    {
        doSomething();
        doCthings();
        doOtherthing();
        doMorethings();
    }
}

例如上述三個類中的run方法,都有doSomething和doOtherthing代碼,AOP就是要把這些代碼抽取出來。我們知道,抽取代碼很容易,但是如何將這些獨立的邏輯代碼再融合到業(yè)務(wù)類中完成和原來一樣的業(yè)務(wù)操作,這才是AOP要解決的問題。

術(shù)語

Joinpoint連接點:程序執(zhí)行的某個特定位置,例如類初始化前,類初始化后,方法執(zhí)行前,方法執(zhí)行后等,Spring只支持方法的連接點,即方法執(zhí)行前,方法執(zhí)行后,方法拋出異常時。
Pointcut切點:每個類中都擁有多個連接點,如擁有兩個方法的類,這兩個方法都是連接點,切點可以在連接點中定位一個或多個連接點。

Advice增強(通知):增強是織入目標(biāo)類連接點上的一段程序代碼,即當(dāng)程序到達一個執(zhí)行點后會執(zhí)行相對應(yīng)的一段代碼,Spring提供的Advice都帶有接入點方位,例如BeforeAdvice,AftereturningAdvice,ThrowsAdvice等。只有結(jié)合切點和通知才能確定特定的連接點并執(zhí)行對應(yīng)代碼。
Target目標(biāo)對象:被嵌入代碼的類。
Introductiony引介:可以為類添加屬性和方法。
Weaving織入:AOP就像一臺織布機,將Advice代碼嵌入到對應(yīng)的類中。
Proxy代理:一個類被AOP織入后,就會產(chǎn)生一個代理對象,他融合了原有類代碼和Advice代碼。
Aspect切面:由切點和增強組成,他包括了連接點定義和橫切邏輯代碼的定義,SpringAOP就是負責(zé)實施切面的框架。

AOP有三種織入方式:

編譯期織入:這要求是用特殊的Java編譯器

類裝載期織入:要求使用特殊的類裝載器
動態(tài)代理織入:在運行時期為目標(biāo)對象生成代理對象的方式實現(xiàn)織入

Spring采用動態(tài)代理織入,AspectJ采用編譯期織入和類裝載織入。
二 Advice增強(通知)
Spring使用Advice類定義橫切邏輯,Advice類還包括了在方法的哪一點加入代碼的信息。

Advice類型:

前置增強:在方法執(zhí)行前實施增強org.apringframework.aop.MethodBeforeAdvice
后置增強:在方法返回后實施增強org.springframework.aop.AfterReturningAdvice
異常拋出增強:在目標(biāo)方法拋出異常后實施增強org.springframework.aop.ThrowsAdvice
環(huán)繞增強:在方法執(zhí)行前和執(zhí)行后實施增強org.aopaliance.intercept.MethodInterceptor
引介增強:在目標(biāo)類中加入新的方法和屬性org.springframework.aop.IntroductionInterceptor

這是典型的基于代理的AOP,使用方法如下

1 創(chuàng)建一個接口,并且實現(xiàn)它

2 創(chuàng)建Advice,實現(xiàn)上述任意接口
3 使用ProxyFactory來生成代理

接下來,我以簡單的示例解釋前四種Advice

//Dog.java
//定義狗的接口
package test.aop;
/**
 * Created by gavin on 15-7-18.
 */
public interface Dog {
    public void shout(String name);
    public void sleep(String name);
}
 
//ChinaDog.java
//設(shè)計中華田園犬
package test.aop;
/**
 * Created by gavin on 15-7-18.
 */
public class ChinaDog implements Dog {
    @Override
    public void shout(String name) {
        System.out.println("中華田園犬"+name+" 叫了一聲");
    }
    @Override
    public void sleep(String name) {
        System.out.println("中華田園犬"+name+" 睡著了");
    }
    public void error() throws Exception {
        throw new Exception("shout exception");
    }
}
 
//BeforeAdvice.java
//前置增強類
package test.aop;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
/**
 * Created by gavin on 15-7-18.
 */
public class BeforeAdvice implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        String name = (String)objects[0];    //參數(shù)獲取
        System.out.println("中華田園犬"+name+" 前置增強");
    }
}
 
//AfterReturnAdvice.java
//后置增強類
package test.aop;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
/**
 * Created by gavin on 15-7-18.
 */
public class AfterReturnAdvice implements AfterReturningAdvice {
    @Override
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
        String name = (String)objects[0];
        System.out.println("中華田園犬"+name+" 后置增強");
    }
}
 
//SurroundAdvice.java
//環(huán)繞增強類
package test.aop;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
 * Created by gavin on 15-7-18.
 */
public class SurroundAdvice implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        Object[] objects = methodInvocation.getArguments();
        String name = (String)objects[0];
        System.out.println("環(huán)繞增強----前"+name);
 
        Object object = methodInvocation.proceed();    //此處執(zhí)行的是原有函數(shù)
 
        System.out.println("環(huán)繞增強----后"+name);
 
        return object;
    }
}
 
//ThrowAdvice.java
//異常拋出增強類
package test.aop;
import org.springframework.aop.ThrowsAdvice;
import java.lang.reflect.Method;
/**
 * Created by gavin on 15-7-18.
 */
public class ThrowAdvice implements ThrowsAdvice {
    @Override
    public void afterThrowing(Method method,Object[] args, Object obj ,Exception ex)throws Throwable
    {
        System.out.println("------------------------");
        System.out.println("------異常拋出增強");
        System.out.println("------method "+method.getName());
        System.out.println("------exception "+ex.getMessage());
        System.out.println("------------------------");
    }
}
 
//AopTest.java
//AOP測試類
package test.aop;
import org.aopalliance.aop.Advice;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
/**
 * Created by gavin on 15-7-18.
 */
public class AopTest {
    private Dog dog;
    private Advice advice;
    private ProxyFactory pf;
 
 
    @BeforeTest
    public void init()
    {
        dog = new ChinaDog();
        pf = new ProxyFactory();
        pf.setTarget(dog);
    }
 
    @Test
    public void beforeAdvice()
    {
        advice = new BeforeAdvice();
        pf.addAdvice(advice);
        Dog dog = (Dog)pf.getProxy();
        dog.shout("jim");
        dog.sleep("tom");
    }
 
    @Test
    public void afterReturndvice()
    {
        advice = new AfterReturnAdvice();
        pf.addAdvice(advice);
        Dog dog = (Dog)pf.getProxy();
        dog.shout("jim");
        dog.sleep("tom");
    }
 
    @Test
    public void arroundAdvice()
    {
        SurroundAdvice advice = new SurroundAdvice();
        pf.addAdvice(advice);
        Dog dog = (Dog)pf.getProxy();
        dog.shout("jim");
        dog.sleep("tom");
    }
 
    @Test
    public void throwAdvice()
    {
        advice = new ThrowAdvice();
        pf.addAdvice(advice);
        ChinaDog dog = (ChinaDog)pf.getProxy();
        try {
            dog.error();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

分別對前四種增強方式進行測試,得到以下結(jié)果:
前置增強

后置增強

環(huán)繞增強

異常拋出增強

三 創(chuàng)建切面

Spring通過org.springframework.aop.Pointcut接口描述切點,通過這個接口的ClassFilter定位到特定的類,通過MethodMatcher定位到特定的方法。

切面的創(chuàng)建方法

1 添加目標(biāo)對象
2 添加Advice
3 定義切點Pointcut
4 定義Advisor
5 設(shè)置代理對象

在第二節(jié)的基礎(chǔ)上,在applicationContext.xml中設(shè)置如下




 








 


       



       
       



       
       
              
                     
                     test.aop.Dog
              
       
       
       
              
                     sleepHelperAdvisor
              
       
       
       

在AopTest.java中調(diào)用進行測試:

public static void main(String[] args)
{
    //PropertyConfigurator.configure("web/WEB-INF/log4j.properties");
    ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml");
    Dog dog = (Dog)ac.getBean("proxyFactoryBean");//注意這里,調(diào)用的是代理bean,返回的是Dog的代理對象
    dog.shout("jim");
    dog.sleep("tom");
}

結(jié)果為:

至于前置Advice為什么出現(xiàn)了三次我也不懂,如果有人了解的話,請賜教。
四 基于@AspectJ配置切面

我們先用@AspectJ定義一個切面:

package test.aop;
 
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
 
/**
 * Created by gavin on 15-7-18.
 */
@Aspect
public class PreAspect {
    @Before("execution(* shout(..))")//意思是返回值任意 參數(shù)任意
    public void beforeShout()
    {
        System.out.println("準(zhǔn)備叫");
    }
}

在applicationContext.xml中設(shè)置:


 



加入的內(nèi)容有:
xmlns:aop="http://www.springframework.org/schema/aop

http://www.springframework.or... http://www.springframework.org/schema/aop/spring-aop-3.1.xsd

在AopTest.java中進行測試,代碼如下:

public static void main(String[] args)
{
    ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml");
    Dog dog = (Dog)ac.getBean("chinaDog");    //注意這里調(diào)用的是chinaDog
    dog.shout("jim");
    dog.sleep("tom");
}

結(jié)果為:

只有shout方法前調(diào)用了beforeShout方法,與我們設(shè)想的相同。

五 使用Spring來定義純粹的POJO切面

使用方法也非常簡單,使用spring的aop標(biāo)簽。xml如下:





       
              
       

java代碼如下

public static void main(String[] args)
{
    ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml");
    Dog dog = (Dog)ac.getBean("chinaDog");//注意這里調(diào)用的是chinaDog
    dog.shout("jim");
    dog.sleep("tom");
}

最終效果和@AspectJ相同

總結(jié)

AOP是OOP的有益補充,他為程序開發(fā)提供了一個新的思考角度,可以將重復(fù)性的橫切邏輯抽取到統(tǒng)一的模塊中。只有通過OOP的縱向抽象和AOP的橫向抽取,程序才可以真正的解決重復(fù)性代碼問題。

Spring采用JDK動態(tài)代理和CGLib動態(tài)代理技術(shù)在運行期間織入Advice。所以用戶不用裝備特殊的編譯器或類裝載器。要使用JDK動態(tài)代理,目標(biāo)對象必須實現(xiàn)接口,而CGLib不對目標(biāo)類采取限制。

JDK創(chuàng)建代理對象效率比CGLib高,而CGLib創(chuàng)建的代理對象運行效率比JDK的要高。

Spring實現(xiàn)AOP的三種方式:
經(jīng)典代理@AspectJPOJO

更多文章:http://blog.gavinzh.com

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64411.html

相關(guān)文章

  • 慕課網(wǎng)_《Spring入門篇》學(xué)習(xí)總結(jié)

    摘要:入門篇學(xué)習(xí)總結(jié)時間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計,安全控制,事務(wù)處理,異常處理等等。 《Spring入門篇》學(xué)習(xí)總結(jié) 時間:2017年1月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個人學(xué)習(xí)源碼:https://git...

    Ververica 評論0 收藏0
  • Spring入門IOC和AOP學(xué)習(xí)筆記

    摘要:入門和學(xué)習(xí)筆記概述框架的核心有兩個容器作為超級大工廠,負責(zé)管理創(chuàng)建所有的對象,這些對象被稱為。中的一些術(shù)語切面切面組織多個,放在切面中定義。 Spring入門IOC和AOP學(xué)習(xí)筆記 概述 Spring框架的核心有兩個: Spring容器作為超級大工廠,負責(zé)管理、創(chuàng)建所有的Java對象,這些Java對象被稱為Bean。 Spring容器管理容器中Bean之間的依賴關(guān)系,使用一種叫做依賴...

    wenyiweb 評論0 收藏0
  • spring 入門 2 自動裝配和aop

    摘要:使用注解配置一步驟為主配置文件引入新的命名空間約束導(dǎo)入約束開啟使用注解代理配置文件在中指定掃描包下所有類的注解掃描時會掃描指定包下的所有子孫包在類中使用注解完成配置等二將對象注冊到容器將注冊到容器中,相當(dāng)于層層層三修改對象的作用范 使用注解配置spring 一、步驟 1.為主配置文件引入新的命名空間(約束) 導(dǎo)入spring-context-4.2.xsd schema約束 show...

    JasinYip 評論0 收藏0
  • spring 入門 3 整合JDBC和AOP事務(wù)

    摘要:整合提供了很多模板整合技術(shù)持久化技術(shù)模板類中提供了一個可以操作數(shù)據(jù)庫的對象對象封裝了技術(shù)模板對象與中的非常相似準(zhǔn)備連接池創(chuàng)建模板對象書寫并執(zhí)行步驟導(dǎo)包基礎(chǔ)包類庫新增連接池驅(qū)動包包事務(wù)包準(zhǔn)備數(shù)據(jù)庫本地數(shù)據(jù)庫和表書寫使用模板實現(xiàn)增刪改查 spring整合JDBC spring提供了很多模板整合Dao技術(shù) ORM持久化技術(shù) 模板類 JDBC o...

    CHENGKANG 評論0 收藏0
  • Spring筆記03_AOP

    摘要:介紹什么是在軟件業(yè),為的縮寫,意為面向切面編程,通過預(yù)編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術(shù)。切面是切入點和通知引介的結(jié)合。切面類權(quán)限校驗。。。 1. AOP 1.1 AOP介紹 1.1.1 什么是AOP 在軟件業(yè),AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術(shù)...

    blair 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<