Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          Spring中AOP的使用

          Posted on 2009-02-16 19:49 啥都寫點 閱讀(1237) 評論(0)  編輯  收藏 所屬分類: J2EE

          AOP:面向切面編程

          代理模式講解AOP技術

             操作接口

          代理實現 à真實實現

          因為此代理類只能為一個接口的對象進行代理 à靜態代理

          能不能有一種方法可以為所有的類進行代理 à動態代理

          Spring提供的一系列Advices接口

             |- BeforeAdvice

             |- AfterAdvice

          主要操作是在配置上:applicationContext.xml 文件上

          了解其作用:只關注于業務本身,而與其他業務無關

          à尚學堂代碼實例(spring-avi-152-014):

          public class SecurityHandler implements InvacationHandler {

             private Object targetObject;

             public Object newProxy(Object targetObject) {

             this.targetObject = targetObject;

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

          targetObject.getClass.getInterfaces(),

          this);

          }

          Public Object invoke(Object proxy,Method method,Object[] args)throws Throwable {

             checkSecuity();

             Object ret = null;

           Try {

             ret = method.invoke(this.targetObject , args);

          }catch(Exception e) {

             e.printStackTrace();

             throw new java.lang.RuntimeException(e);

          }

           return ret;

          }

           private void checkSecurtiy() {

             System.out.println(“------------checkSecurity()-----------”);

          }

          }

          àSpring AOP的支持(采用Annotation的方式)

          1spring依賴庫

          * SPRING_HOME/dist/spring.jar

          * SPRING_HOME/lib/Jakarta-commons/commons-logging.jar

          * SPRING_HOME/lib/log4j-1.2.14.jar

          *SPRING_HOME/lib/aspectj/*.jar

          2 采用Aspect定義切面

          1、 Aspect定義PointcutAdvice

          2、 啟用AspectJAnnotation的支持并且將Aspect類和目標對象配置到LOC容器中

          注意:在這種方法定義中,切入點的方法是不是被執行的,它存在的目的僅僅是為了重用切入點即Advice中通過方法名引用這個切入點

          AOP

          l       Cross cutting concern

          l       Aspect

          l       Advice(橫切關注點的具體實現)

          l       Pointcut(圈定了一個范圍

          l       Joinpoint spring只支持方法級的Joinpoint

          l       Weave

          l       Target Object

          l       Proxy

          l       Introduction

          à實例(spring-avi-152-016):

          /**

          *定義PointcutPointcut的名稱就是allAddMethod,此方法不能有返回值和參數,只是一個標

          *

          *

          *Pointcut的內容是一個表達式,描述哪些對象的哪些方法(訂閱Joinpoint

          */

          @Aspect

          Public class SecurityHandle {

             @Pointcut(“execution(* add*(..)) || execution(*del*(..))”)    //第一個*表示返回值,第二個表示以add開頭的所//有方法, ..表示所有參數

          Private void allAddMethod() {} //不會被調用,只是一個標識

          /**

          *定義Advice,標識在哪個切入點何處織入此方法

          *

          */

          @Before(“allAddMethod()”)

          Private void checkSecurity() {

             System.out.println(“---------------------------checkSecurity()----------------------------”);

          }

          }

          需要在applicationContext中加入:<aop:aspectj-autoproxy/> 啟用對Annotation的支持

          spring-avi-152-017

          à靜態文件配置方式

           <aop:config>

               <aop:aspect id=”” ref=””>

                     <aop:pointcut id=”allAddMethod” expression=”execution(* com.bjsxt.spring.UserManager.add*(..))”/>

                    <aop:before method=”” pointcut-ref=””/>

               </aop:apect>

           </aop:config>

          àspringJoinPoint只針對方法

          public class SecurityHandler {

           private void args = joinPoint.getArgs();

             Object[] args = joinPoint.getArgs(); //取得方法的參數

           For (int i=0;i<args.length;i++) {

                 System.out.println(args[i]);

          }

          System.out.println(joinPoint.getSignature().getName()); //得到方法簽名

          }



                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 长岛县| 海伦市| 武陟县| 黔西| 芷江| 凤阳县| 宁海县| 襄汾县| 玉山县| 济宁市| 绥芬河市| 舟曲县| 泌阳县| 屏东市| 远安县| 靖安县| 正安县| 青川县| 烟台市| 大丰市| 盐边县| 循化| 聂荣县| 宁陕县| 阳高县| 稷山县| 射洪县| 余干县| 肥东县| 泰宁县| 安徽省| 加查县| 彭泽县| 乌海市| 西乡县| 长垣县| 上虞市| 蓬安县| 孙吴县| 龙州县| 三原县|