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()); //得到方法簽名

          }



                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 白河县| 麻江县| 耿马| 岳阳县| 大竹县| 山东省| 七台河市| 喜德县| 安义县| 社旗县| 清镇市| 弥勒县| 得荣县| 威宁| 紫阳县| 苗栗县| 普陀区| 安徽省| 砀山县| 宣恩县| 浏阳市| 铜鼓县| 东丰县| 抚松县| 平利县| 喜德县| 辉南县| 潞西市| 无为县| 五峰| 烟台市| 乌苏市| 东明县| 叶城县| 荔波县| 定州市| 兴城市| 松滋市| 饶平县| 古浪县| 黑河市|