Spring学习笔记(二) -aop

 


要进行AOP编程,首先就要引入aop命名空间,Spring提供了两种切面方式,实际工作中我们可以任选其一:

  • 基于XML配置方式进行AOP开发
  • 基于注解方式进行AOP开发

切面类:

public class Security {     //切面
   public void checkSecurity(JoinPoint joinPoint){  //通知
           System.out.println("进行安全检查 ");
   }
} 

如果使用XML配置方式,需要在文件中使用<aop:config>标签,如:

<bean id="security" class="切面类" /><!-- 定义切面对象 -->
<bean id="userManager" class="目标对象类" /><!--创建接口实现类对象-->
    <aop:config>  <!--所有的切面和通知都必须定义在aop:config元素内部 -->
      <aop:aspect ref="security">  <!-- 声明切面  -->
         <!-- 声明切入点 -->
         <aop:pointcut id="userManagerPointcut" 
               expression="execution(* *.*(..))"/>
         <!--声明后置通知,在匹配的方法完全执行后运行-->
         <aop:after-returning method="checkSecurity" pointcut-ref="userManagerPointcut"/>
       </aop:aspect>
    </aop:config>
 

 

如果想在通知中获取相关数据,任何通知方法可以将第一个参数定义为org.aspectj.lang.JoinPoint类型 (环绕通知需要定义第一个参数为ProceedingJoinPoint类型, 它是 JoinPoint 的一个子类)。JoinPoint 接口提供了一系列有用的方法,比如 getArgs()(返回方法参数)、 getThis()(返回代理对象)、getTarget()(返回目标)、 getSignature()(返回正在被通知的方法签名)和 toString() (打印出正在被通知的方法的有用信息)。

基于注解的方式除了在配置文件中引入aop的命名空间以外,还需要打开自动代理:

<aop:aspectj-autoproxy/>

这个标签将启用Spring对@AspectJ的支持,配置文件里面只需要声明切面对象和目标对象就行了,在类上标注@Aspect注解用以声明切面,然后在切面的方法上面标注通知或者切入点.

 

   定义切入点的几点注意:

        * 切入点使用方法定义的形式出现

        * 方法的定义

        * 方法的修饰符private修饰

        * 方法的返回值类型是void

        * 方法的名称自定义

        * 方法没有参数

        * 方法有方法体,方法体为空

在方法上使用@Pointcut定义切入点,如:

@Pointcut("execution( * cn.itcast.aop.aspectJ.before.UserManagerImpl.save*(..))")
private void  perform(){}

切入点表达式写法:

*    切入点表达式的写法

*    execution(主要)表示匹配方法执行的连接点

*    例如: * com.itcast.service..*.save*(..))

*         1 "*"  表示方法的返回类型任意

*         2 com.itcast.service..*  表示service包及其子包中所有的类

*         3 .save* 表示类中所有以save开头的方法

*         4 (..) 表示参数是任意数量

 

定义通知:

/**
 * @Before表示前置通知
 *   等价于
 *   aop:before method="checkSecurity" pointcut-ref="perform" 
 * @param joinPoint
 */
@Before("perform()||perform1()")            //可以使用多个切入点,用||隔开
public void checkSecurity(JoinPoint  joinPoint){
   System.out.println("进行安全性检查");
    
   if(joinPoint.getArgs()!=null&&joinPoint.getArgs().length>0){
       for(int i=0;i<joinPoint.getArgs().length;i++){
            System.out.println("方法的参数  "+joinPoint.getArgs()[i]);
       }
   }
    
   //获取方法的签名,方法的名称,方法的返回类型
   Signature signature=joinPoint.getSignature();
   System.out.println("方法的名称  "+signature.getName());
    
} 

 


更多信息请查看 java进阶网 http://www.javady.com

你可能感兴趣的:(spring,AOP)