Spring AOP 原理

Spring AOP 原理
  原理:一种编程技术,用来在系统中提升业务分离
  AOP术语
    1、Aspect切面
      实现的交叉功能
    2、JoinPoint 连接点
      应用程序执行过程中插入切面的地点
    3、Advice 通知
      通知某个切入点执行的代码
    4、Point cut 切入点
      定义了通知应该用在哪些的连接点
    5、Instroduction 引入
      允许已存在类添加的新方法和属性
    6、Target 目标对象
      被通知的对象
    7、Proxy 代理
      AOP框架创建对象,用来实现切面契约,包括通知方法执行等功能,将通知应用到目标对象后创建的对象
    8、 Weaving 织入
      将切面应用到目标对象从而创建一个新的代理对象过程
  相关驱动包
    aspectjweaver.jar
    aspectjrt.jar
  创建通知
    1、Before 前置通知
      public void before(Method arg0, Object[] arg1, Object arg2)
        throws Throwable {
      System.out.println("执行了:"+arg0.getClass().toString()+"目标类");
        System.out.println("执行了:"+arg2.getClass().getName()+"该类");
        System.out.println("执行了:"+arg0.getName()+"()方法");
        for(Object object : arg1){
          System.out.println("参数为:"+object);
        }
        System.out.println("前置通知");
      }
      备注:实现的接口为
        import org.springframework.aop.MethodBeforeAdvice;
    2、After 后置通知
      public void afterReturning(Object arg0, Method arg1, Object[] arg2,
        Object arg3) throws Throwable {
      System.out.println("执行了:"+arg1.getClass().toString()+"类");
        System.out.println("执行了"+arg1.getName()+"()方法");
        for(Object object : arg2){
          System.out.println("参数为:"+object);
        }
        System.out.println("后置通知");
      }
      备注:实现的接口
        import org.springframework.aop.AfterReturningAdvice;
    3、Round 环绕通知
      public Object invoke(MethodInvocation arg0) throws Throwable {
        System.out.println("前置通知2222222222");
        System.out.println("执行了:"+arg0.getThis().getClass()+"类");
        System.out.println("执行了:"+arg0.getMethod().getName()+"()方法");
        Object [] object =arg0.getArguments();
        for(Object ob: object){
          System.out.println("参数为:"+ob+"");
        }
        Object obj = arg0.proceed();
        System.out.println("后置通知2222222222");
        return obj;
      }
      备注:要实现的接口
        import org.aopalliance.intercept.MethodInterceptor;
    4、异常通知
      public void afterThrowing(Throwable t){
        System.out.println("抛出了"+t.getMessage()+"异常");
      }
      备注:实现的接口
        import org.springframework.aop.ThrowsAdvice;
  配置 ApplicationContext.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
        >
      <!--人 (目标对象) -->
      <bean id="shopingMan" class="com.lovo.spring1.PeopleImp"></bean>
      <!-- 购物(通知对象) -->
      <bean id="myadvice" class="com.lovo.spring1.SpringProxyAOP"></bean>
      <!-- 工具(切面) -->
      <bean id="myInterceptor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <!-- 在该切面上加入哪个通知 -->
        <property name="advice" ref="myadvice"></property>
        <!-- 哪些类需要进行注入通知 -->
        <property name="patterns" value="com.lovo.spring1.*.*"></property>
      </bean>
      <!-- 定义代理 -->
      <bean id="proxy" abstract="true"  class="org.springframework.aop.framework.ProxyFactoryBean" >
        <!-- 定义当前目标对象,需要使用哪些切面 -->
        <property name="interceptorNames">
        <list>
        <value>myInterceptor</value>
        </list>
        </property>
      </bean>
      <!-- 物品(指明具体做哪个类的代理) -->
      <bean id="info" parent="proxy">
        <property name="target" ref="shopingMan"></property>
      </bean>
    </beans>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值