Cyh的博客

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

Spring中AOP的使用

Posted on 2009-02-16 19:49 啥都写点 阅读(1218) 评论(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()); //得到方法签名

}



                                                                                                       --    学海无涯
        


只有注册用户登录后才能发表评论。


网站导航: