zoukankan      html  css  js  c++  java
  • spring 学习之二 AOP编程

    AOP概念

      AOP, aspect oriented programing,翻译过来就是面向切面编程的意思,那什么叫面向切面编程呢?相对于之前传统的纵向继承方式来对原有功能进行功能扩展,

    面向切面编程的好处就是不需要增加源代码就可以进行功能扩展。

    AOP术语

      --joinpint(连接点): 指那些被拦截到的点,在spring中,这些点指的是方法

      --pointcut(切入点) : 指要对哪些连接点进行拦截定义,即对哪些方法做扩展处理

      --advice(通知/增强) : 通知是指拦截到joinpoint之后所要做的事情,即扩展的功能本身。而通知根据其出现在相对于切入点(被扩展功能的方法)的位置,而被分为

        前置通知,后置通知,异常通知,最终通知,环绕通知

      --aspect(切面) : 切入点与通知的结合

    一个例子

      从上面的术语和描述可能还不太理解AOP真正的作用,举一个直白的例子吧,先写一个Dao方法

    public class UserDao {
        //add方法就是切入点
        public void add(User user){
            System.out.print("在这里添加一个用户");
        }
    }

    在发布第二版的时候,增加了一个功能,就是在添加用户的时候,打印出添加的用户信息,那该怎么实现呢?看下面代码

    public class UserDao {
        //add方法就是切入点
        public void add(User user){
            System.out.print("新增的用户是 " + user.name);  //新扩展的功能
            System.out.print("在这里添加一个用户");
        }
    }

    很显然 这样的做法不是很好,耦合太强,现在我们看看AOP是怎么做到这一点的呢?在AOP时,userDao中的add()方法是我们需要加强功能的方法,也就是术语中的切入点。再

    看AOP中的增强代码(扩展的那部分功能),它并不没有直接与被扩展的方法userDao.add()关联起来,而是单独的代码块。

    public class UserService {
        //增强,扩展的功能
        public void extendm(User user){
            System.out.print("新增的用户是 " + user.name);  //新扩展的功能
        }
    }

      接着在配置文件中进行aop配置,在执行add方法时,会自动将增强代码加在其前后,从而达到了不修改源代码而扩展功能的效果。配置文件写法

    <bean id="userDao" class="com.blueto.aop.UserDao"></bean>
    <bean id="userDaoService" class="com.blueto.aop.UserDaoService"></bean>
    
    //aop配置
    <aop:config>
        //切入点,被扩展的方法
        <aop:pointcut expression="execution(* com.blueto.aop.UserService.*(..))" id="pointcut1"/>
        //切面
        <aop:aspect ref="userDaoService">
                //扩展的方法
               <aop:before method="extendm" pointcut-ref="pointcut1"/>
        </aop:aspect>
    </aop:config>

      上面配置文件中的切入点的表达式的语法为:

        execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)

      表示对哪些方法进入功能扩展,即AOP中的增强,写法有下面几种,只要理解了意思就好记了

      1)execution(* com.blueto.aop.UserService.add(..))    对add方法增强

      2)execution(* com.blueto.aop.UserService.*(..))    对UserService类中所有方法增强

      3)execution(* *.*(..))    对所有包下面所有类的所有方法增强

      配置文件中的aop:before对应的是前置增强,其他的增强方式有环绕增强(after-returning),后置增强(around)等

      到此,通过例子说明,AOP的配置文件方式就完成了,整个过程还是显得有点复杂,不过和Ioc一样,这种技术还有一种简单的实现方式,那就是注解式

    注解方式实现AOP

       第一步 配置文件中创建类

    <bean id="userDao" class="com.blueto.aop.UserDao"></bean>
    <bean id="userDaoService" class="com.blueto.aop.UserDaoService"></bean>
    
    //开启aop操作
    <aop:aspect-autoproxy></aop:aspect-autoproxy>
      

      第二步,在增强类(扩展功能方法)上面添加注解

    @Aspect
    public class UserService {
         @Before(value="execution(* com.blueto.aop.UserDao.*(..))")
        public void extendm(User user){
            System.out.print("新增的用户是 " + user.name);  //新扩展的功能
        }
    }
  • 相关阅读:
    fixed与sticky的区别
    自我介绍以及web课程目标
    DOM&BOM
    web中常用单位的使用
    Oracle 使用 DBLINK详解(转载) 挪威
    Sql server 无法删除用户的处理办法(转载) 挪威
    ICMP类型
    makefile笔记
    [笔记]Makefile wildcard
    在Visual Studio 2005下配置WinPcap开发环境
  • 原文地址:https://www.cnblogs.com/lovemo1314/p/7248059.html
Copyright © 2011-2022 走看看