<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 19, comments - 53, trackbacks - 0, articles - 283
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
    AOP面向切面編程(最突出的是處理權(quán)限控制,在本文中,主要介紹日志處理):

    一、由無(wú)組件實(shí)現(xiàn)AOP引出Spring AOP

    1. 使用JDK中的Proxy技術(shù)實(shí)現(xiàn)AOP功能

    package cn.itcast.aop;

    import java.lang.reflect.InvocationHandler;

    import java.lang.reflect.Method;

    import java.lang.reflect.Proxy;

    import cn.itcast.service.impl.PersonServiceBean;

    public class JDKProxyFactory implements InvocationHandler{

        
    /**

         *要處理的對(duì)象(也就是我們要在方法的前后加上業(yè)務(wù)邏輯的對(duì)象,如例子中的PersonServiceBean)

         
    */


        
    private Object targetObject;

        

        
    /**

         *動(dòng)態(tài)生成目標(biāo)對(duì)象的代理

         *@paramtargetObject

         *
    @return

         
    */


        
    public Object createProxyIntance(Object targetObject){

           
    this.targetObject = targetObject;

           
    return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), 

                  
    this.targetObject.getClass().getInterfaces(), this);

        }


        

        
    /**

         *要處理的對(duì)象中的每個(gè)方法會(huì)被此方法送去JVM調(diào)用,也就是說(shuō),要處理的對(duì)象的方法只能通過(guò)此方法調(diào)用

         
    */


        @Override

        
    public Object invoke(Object proxy, Method method, Object[] args)

               
    throws Throwable //環(huán)繞通知

           PersonServiceBean bean 
    = (PersonServiceBean) this.targetObject;

           Object result 
    = null

           
    if(bean.getUser()!=null){

               
    //.. advice()-->前置通知

               System.out.println(method.getName() 
    + "is called¡¤¡¤¡¤¡¤¡¤¡¤");

               

               
    try {

                  result 
    = method.invoke(targetObject, args);

                  
    // afteradvice() -->后置通知

               }
     catch (RuntimeException e) {

                  
    //exceptionadvice()--> 例外通知

               }
    finally{

                  
    //finallyadvice(); -->最終通知

               }


           }


           
    return result;

        }


    }


     

    2. 使用CGLIB實(shí)現(xiàn)AOP功能與AOP概念解釋

    package cn.itcast.aop;

    import java.lang.reflect.Method;

    import cn.itcast.service.impl.PersonServiceBean;

    import net.sf.cglib.proxy.Enhancer;

    import net.sf.cglib.proxy.MethodInterceptor;

    import net.sf.cglib.proxy.MethodProxy;

    /**

     *CGLIB方式實(shí)現(xiàn)目標(biāo)對(duì)象的代理

     *CGLIB代理:實(shí)現(xiàn)原理類(lèi)似于JDK動(dòng)態(tài)代理,只是它在運(yùn)行期間生成的代理對(duì)象是針對(duì)目標(biāo)類(lèi)擴(kuò)展的子類(lèi)。CGLIB是高效的代碼生成包,底層是依靠ASM(開(kāi)源的java字節(jié)碼編輯類(lèi)庫(kù))操作字節(jié)碼實(shí)現(xiàn)的,性能比JDK強(qiáng)。

     
    */


    publicclass CGlibProxyFactory 
    implements MethodInterceptor{

        
    private Object targetObject;

        
    public Object createProxyIntance(Object targetObject){

           
    this.targetObject = targetObject;

           Enhancer enhancer 
    = new Enhancer();

           enhancer.setSuperclass(
    this.targetObject.getClass());//非final

           enhancer.setCallback(
    this);

           
    return enhancer.create();

        }


        @Override

        
    public Object intercept(Object proxy, Method method, Object[] args,

               MethodProxy methodProxy) 
    throws Throwable {

           PersonServiceBean bean 
    = (PersonServiceBean) this.targetObject;

           Object result 
    = null;

           
    if(bean.getUser()!=null){

               result 
    = methodProxy.invoke(targetObject, args);

           }


           
    return result;

        }


    }


     

       我們省去了業(yè)務(wù)模塊的代碼,因?yàn)檫@是完全獨(dú)立于業(yè)務(wù)邏輯的,可以單獨(dú)由一個(gè)完全不懂業(yè)務(wù)的人管理。測(cè)試用例如下:

     

    package junit.test;

    import org.junit.BeforeClass;

    import org.junit.Test;

    import cn.itcast.aop.CGlibProxyFactory;

    import cn.itcast.aop.JDKProxyFactory;

    import cn.itcast.service.PersonService;

    import cn.itcast.service.impl.PersonServiceBean;

    public class AOPTest {

        @BeforeClass

        
    public static void setUpBeforeClass() throws Exception {

        }


        @Test 
    public void proxyTest(){

           JDKProxyFactory factory 
    = new JDKProxyFactory();

           PersonService service 
    = (PersonService) factory.createProxyIntance(new PersonServiceBean("xxx"));

           service.save(
    "888");

        }


        

        @Test 
    public void proxyTest2(){

           CGlibProxyFactory factory 
    = new CGlibProxyFactory();

           PersonServiceBean service 
    = (PersonServiceBean) factory.createProxyIntance(new PersonServiceBean("xxx"));

           service.save(
    "999");

        }


    }

     

    小結(jié):在Spring中,突出的就是業(yè)務(wù)邏輯的處理,AOP則是建立在業(yè)務(wù)邏輯處理的切面上,所以可以通過(guò)建立模塊、業(yè)務(wù)層面的切面來(lái)對(duì)業(yè)務(wù)邏輯方法進(jìn)行追蹤


    二、Spring提供了兩種切面使用方式:

    1. 基于xml配置方式進(jìn)行AOP開(kāi)發(fā)  (鄙人喜歡注解方式,xml配置方式暫不做研究O(∩_∩)O~

    2. 基于注解方式進(jìn)行AOP開(kāi)發(fā) 

    定義切面

     

    package cn.itcast.service;

    import org.aspectj.lang.ProceedingJoinPoint;

    import org.aspectj.lang.annotation.After;

    import org.aspectj.lang.annotation.AfterReturning;

    import org.aspectj.lang.annotation.AfterThrowing;

    import org.aspectj.lang.annotation.Around;

    import org.aspectj.lang.annotation.Aspect;

    import org.aspectj.lang.annotation.Before;

    import org.aspectj.lang.annotation.Pointcut;

    /**

     *注解方式定義切面

     
    */


    @Aspect

    publicclass MyInterceptor 
    {

        

        @SuppressWarnings(
    "unused")

        @Pointcut(
    "execution (* cn.itcast.service.impl.PersonServiceBean.*(..))")

        privatevoid anyMethod() 
    {}//聲明一個(gè)切入點(diǎn)

        

        @Before(
    "anyMethod() && args(name)")

        publicvoid doAccessCheck(String name) 
    {

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

        }


        

        @AfterReturning(pointcut
    ="anyMethod()",returning="result")

        publicvoid doAfterReturning(String result) 
    {

           System.out.println(
    "后置通知:"+ result);

        }


        

        @After(
    "anyMethod()")

        publicvoid doAfter() 
    {

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

        }


        

        @AfterThrowing(pointcut
    ="anyMethod()",throwing="e")

        publicvoid doAfterThrowing(Exception e) 
    {

           System.out.println(
    "例外通知:"+ e);

        }


        

        @Around(
    "anyMethod()")

        
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {

           
    //if(){//判斷用戶(hù)是否在權(quán)限

           System.out.println(
    "進(jìn)入方法");

           Object result 
    = pjp.proceed();

           System.out.println(
    "退出方法");

           
    //}

           
    return result;

        }
      

    }


    利用Spring AOP必須的組件包:

     

    spring-framework-2.5.6"lib"cglib"cglib-nodep-2.1_3.jar

    spring-framework-2.5.6
    "lib"aspectj"aspectjweaver.jar

    spring-framework-
    2.5.6"lib"aspectj"aspectjrt.jar

    spring-framework-2.5.6
    "lib"j2ee"common-annotations.jar

    spring-framework-
    2.5.6"lib"jakarta-commons"commons-logging.jar

    spring-framework-2.5.6
    "dist"spring.jar

     

    Spring 配置:

     

    <?xml version="1.0" encoding="UTF-8"?>

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

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

        xmlns:aop
    ="http://www.springframework.org/schema/aop"

        xsi:schemaLocation
    ="http://www.springframework.org/schema/beans

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

               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd

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

        
    <aop:aspectj-autoproxy />

        
    <bean id="myInterceptor" class="cn.itcast.service.MyInterceptor" />

        
    <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean>

    </beans>

     

    測(cè)試用例:

     

    package junit.test;

    import org.junit.BeforeClass;

    import org.junit.Test;

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import cn.itcast.service.PersonService;

    publicclass SpringAOPTest 
    {

        @BeforeClass

        publicstaticvoid setUpBeforeClass() 
    throws Exception {

        }


        @Test

        publicvoid interceptorTest() 
    {

           ApplicationContext cxt 
    = new ClassPathXmlApplicationContext("beans.xml");

           PersonService personService 
    = (PersonService) cxt.getBean("personService");

           personService.save(
    "xx");

        }


    }

     


    三、AOP術(shù)語(yǔ):

    Aspect(切面):指橫切面關(guān)注點(diǎn)的抽象即為切面,它與類(lèi)相似,只是兩者的關(guān)注點(diǎn)不一樣,類(lèi)是對(duì)物體特征的抽象,而切面是橫切性關(guān)注點(diǎn)的抽象

    Joinpoint(連接點(diǎn)):所謂連接點(diǎn)是指那些被攔截到的點(diǎn)。在Spring中,這些點(diǎn)指的是方法,因?yàn)?/span>spring只支持方法類(lèi)型的連接點(diǎn),實(shí)際上joinpoint還可以是field或類(lèi)構(gòu)造器

    Pointcut(切入點(diǎn)):所謂的切入點(diǎn)是指我們要對(duì)那些joinpoint進(jìn)行攔截的定義

    Advice(通知):所謂的通知是指攔截到joinpoint之后所要做的事情就是通知。通知分為前置通知,后置通知,異常通知,最終通知,環(huán)繞通知

    Target(目標(biāo)對(duì)象):代理的目標(biāo)對(duì)象

    Weave(織入):指將aspects應(yīng)用到target對(duì)象并且導(dǎo)致proxy對(duì)象創(chuàng)建的過(guò)程稱(chēng)為織入

    Introduction(引入):在不修改類(lèi)代碼的前提下,introduction可以在運(yùn)行期為類(lèi)動(dòng)態(tài)的添加一些方法或field

    主站蜘蛛池模板: 亚洲中文无码永久免费| 免费一级特黄特色大片在线观看| 免费一区二区三区| 韩日电影在线播放免费版| 国产精品偷伦视频免费观看了| 一级毛片成人免费看a| 成年人在线免费观看| 一二三四影视在线看片免费| 亚洲免费福利视频| 青青青免费国产在线视频小草| 91精品国产免费久久久久久青草 | 亚洲AV日韩AV永久无码免下载| 亚洲无人区午夜福利码高清完整版| 亚洲综合色自拍一区| 国产av天堂亚洲国产av天堂| 亚洲国产女人aaa毛片在线| 亚洲精品综合久久中文字幕| 亚洲jjzzjjzz在线观看| 亚洲一卡2卡3卡4卡乱码 在线| 亚洲AV无码专区在线观看成人| 黄色a三级免费看| 国产在线播放线91免费| 无码A级毛片免费视频内谢| 国产在线jyzzjyzz免费麻豆| 成年人免费网站在线观看| 免费在线不卡视频| 亚洲毛片αv无线播放一区| 久久亚洲sm情趣捆绑调教| 亚洲一区二区三区免费视频| 国产成人亚洲精品播放器下载 | 亚洲人AV在线无码影院观看| 另类小说亚洲色图| 最近免费中文字幕中文高清| 97国产在线公开免费观看| 永久免费毛片在线播放| 免费少妇a级毛片人成网| 亚洲乱码精品久久久久..| 久久亚洲精品无码VA大香大香| 亚洲精品无播放器在线播放| 国产乱子伦精品免费视频| 亚洲网站在线免费观看|