spring中的AOP详解编程语言

AOP:  面向切面编程

设置装备摆设文件的头信息

<?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:context="http://www.springframework.org/schema/context" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd"> 
 
</beans>

AOP的焦点组件:

切面(Aspect):切面是封装通用营业逻辑的组件,可以感化到其他组件上。

切入点(Pointcut): 用于指定哪些组件哪方式利用切面组件,Spring供应表达式来实现该制订。

通知(Advice):用于指定组件感化到目的组件的具体位置。

AOP前置通知:在目的组件的方式执行前执行的法式。

切入点法式:

package model; 
public class Chengxu { 
public void talk(String str){ 
System.out.println("str="+str); 
} 
}

切面法式:

 

package model; 
import org.aspectj.lang.JoinPoint; 
public class Charu { 
public void log(JoinPoint jp){ 
System.out.println("日记的方式"); 
System.out.println("获取目的函数参数体式格局:" +jp.getArgs()[0]); 
 //获得切入点法式中方式的参数 
System.out.println("获取目的对象:" +jp.getTarget().getClass().getName()); 
//获得切入点程的 包名.类名 
System.out.println("获取目的函数的java反射对象:" +jp.getSignature()); 
 // 获得切入点程的    返回类型   包名.类名.方式名() 
 
System.out.println("执行前置通知"); 
} 
}

 

Applicationcontext.xml省略文件头信息

<!--切入点法式 --> 
    <bean id="chengxu" class="model.Chengxu"></bean> 
    <!--切面法式 --> 
    <bean id="charu" class="model.Charu"></bean> 
 
    <!-- AOP设置装备摆设跟标签 --> 
    <aop:config> 
        <!-- 切入点设置装备摆设:expression切入点表达式   
              * model....不限返回类型,假如方式没返回值也得加* 
            (*)方式里面是什么参数类型都可以,假如方式没有参数,不加这个*  
           --> 
        <aop:pointcut expression="execution(* model.Chengxu.talk(*))" id="chengxuPointCut"/> 
         
        <!-- 切面设置装备摆设 --> 
        <!-- aspect切面法式依靠于谁 --> 
        <aop:aspect ref="charu">  
        <!-- 前置通知 --> 
        <!--切面法式的方式 切入点依靠于谁  (简单的说,把这个方式前置在哪个方式前面) --> 
            <aop:before method="log" pointcut-ref="chengxuPointCut"/> 
        </aop:aspect> 
    </aop:config>

AOP后置通知:在目的组件的方式正常执行并返回参数后执行的法式。 

切入点法式:

package model; 
public class Chengxu { 
//此方式也可以没有返回值 
public String talk(String str){ 
System.out.println("str="+str); 
  return "留存成功"; 
} 
}

切面法式:

package model; 
import org.aspectj.lang.JoinPoint; 
public class Charu { 
public void log(JoinPoint jp,Object ret){ 
//假如切入点方式没返回值,那么这个Object ret省略不写 
System.out.println("后置"); 
System.out.println("obj为目的组件方式返回值:" +ret); 
} 
}

Applicationcontext.xml

<!--切入点法式 --> 
    <bean id="chengxu" class="model.Chengxu"></bean> 
     
    <!--切面法式 --> 
    <bean id="charu2" class="model.Charu2"></bean> 
     
    <!-- AOP设置装备摆设跟标签 --> 
    <aop:config> 
        <!-- 切入点设置装备摆设:expression切入点表达式    
     * model....不限返回类型   
    (*)方式里面是什么参数类型都可以,方式没有参数,那就不加这个*  
           --> 
        <aop:pointcut expression="execution(* model.Chengxu.talk(*))" id="chengxuPointCut"/> 
         
    <!-- 切面设置装备摆设 --> 
    <!-- aspect切面法式依靠于谁 --> 
    <aop:aspect ref="charu2">  
    <!-- 前置通知 --> 
    <!--切面法式的方式 切入点依靠于谁  (简单的说,把这个方式前置在哪个方式前面) --> 
      <aop:after-returning method="log2" pointcut-ref="chengxuPointCut" 
            returning="ret"/> 
      <!--假如切入点法式没有返回值那么returning 就可以不写 --> 
    </aop:aspect> 
</aop:config>

异常通知:在目的组件的方式抛出异常信息后执行的法式。

 注:当前置通知和后置通知发生异常时,这个异常通知是不执行的,只有当目的组件发生异常时才执行。

切面法式:

package model; 
import org.aspectj.lang.JoinPoint; 
public class Charu3 { 
public void log3(JoinPoint jp,Throwable t){ 
System.out.println("异常通知"); 
System.out.println("t为目的组件发生异常的信息:" +t); 
} 
}

切入点法式:

package model; 
public class Chengxu { 
//有返回值的方式 
public String talk(String str){ 
System.out.println("str="+str); 
System.out.println(10/0);//发生异常的处所 
return "留存成功"; 
} 
}

Application.xml

<!--切入点法式 --> 
    <bean id="chengxu" class="model.Chengxu"></bean> 
    <!--切面法式 前置--> 
    <bean id="charu" class="model.Charu"></bean> 
    <!--切面法式2 后置--> 
    <bean id="charu2" class="model.Charu2"></bean> 
    <!--切面法式3 异常--> 
    <bean id="charu3" class="model.Charu3"></bean> 
     
    <!-- AOP设置装备摆设跟标签 --> 
    <aop:config> 
        <!-- 切入点设置装备摆设:expression切入点表达式   * model....不限返回类型  (*)方式里面是什么参数类型都可以,方式没有参数也可以那就不加这个*  
           --> 
        <aop:pointcut expression="execution(* model.Chengxu.talk(*))" id="chengxuPointCut"/> 
         
        <!-- 切面设置装备摆设 --> 
        <!-- aspect切面法式依靠于谁 --> 
        <aop:aspect ref="charu">  
            <!-- 前置通知 --> 
            <!--切面法式的方式 切入点依靠于谁  (简单的说,把这个方式前置在哪个方式前面) --> 
            <aop:before method="log" pointcut-ref="chengxuPointCut"/> 
        </aop:aspect> 
         
         
        <aop:aspect ref="charu2">  
            <!-- 前置通知 --> 
            <!--切面法式的方式 切入点依靠于谁  (简单的说,把这个方式前置在哪个方式前面) --> 
            <aop:after-returning method="log2" pointcut-ref="chengxuPointCut" 
            returning="ret"/> 
        </aop:aspect> 
         
        <aop:aspect ref="charu3">  
        <!-- 异常通知 -->   
            <aop:after-throwing method="log3" pointcut-ref="chengxuPointCut" 
            throwing="t"/> 
        </aop:aspect>      
    </aop:config>

最终通知:在目的组件的方式正常执行后执行,或在异常通知之前执行。

 注:也就是当目的组件发生没发生异常,都邑被执行。

     假如目的组件异常时,那后置通知不会执行,异常通知会执行。最终通知会在异常通知之前执行。

     假如目的组件正常时,那最终通知会在后置通知之前执行。

Application.xml

<!-- 最终通知 --> 
        <aop:after method="log4" pointcut-ref="chengxuPointCut"/> 
        </aop:aspect>

环抱通知:  切面法式负责挪用目的组件的运行,与struts中的阻挡器功能雷同,可以完全庖代之前的几个通知。

切面法式:在类型为环抱通知的切面法式函数中,参数为org.aspectj.lang.ProceedingJoinPointJoinPoint的子类,扩展了JoinPoint类,供应了proceed()函数,该函数的感化是挪用目的组件,并返回目的组件返回的值

Application.xml

<aop:aspect ref="charu5">  
            <!-- 环抱通知 --> 
            <aop:around method="log5" pointcut-ref="chengxuPointCut"/> 
</aop:aspect>

切面法式:

public class Charu5 { 
     
    public void log5(ProceedingJoinPoint pjp) { 
        System.out.println("前置通知"); 
        try { 
            Object ob = pjp.proceed();//挪用目的组件 
            System.out.println("目的函数的返回值:"+ob); 
            System.out.println("后置通知"); 
        } catch (Throwable e) { 
            System.out.println("异常通知"); 
        } 
        System.out.println("最终通知"); 
    } 
     
 
}

注释体式格局实现以上内容

XML中增添

<context:component-scan base-package=“com.china.model”></context:component-scan>

<aop:aspectj-autoproxy ></aop:aspectj-autoproxy>

@Aspect:代表切面法式

在切面类下添加下面代码实现各自的功能

前置通知:@Before(value=”execution(* com.china.model.Chengxu.talk(*))”)

后置通知:@AfterReturning(value=”execution(*com.china.model.Chengxu.talk(*))”,returning=”ret”)

异常通知:@AfterThrowing(value=”execution(* com.china.model.Chengxu.talk(*))”, throwing=”e”)

最终通知:@After(value=”execution(* com.china.model.Chengxu.talk(*))”)

环抱通知:@Around(value=”execution(* com.china.model.Chengxu.talk(*))”)

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/11698.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论