欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中基于xml的AOP的詳細步驟

 更新時間:2020年06月20日 09:02:52   作者:心有玲曦遇奇緣  
這篇文章主要介紹了Spring中基于xml的AOP的詳細步驟,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1、Aop 全程是Aspect Oriented Programming 即面向切面編程,通過預(yù)編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的同一維護的一種技術(shù)。Aop是oop的延續(xù),是軟件開發(fā)中的 一個熱點,也是Spring框架中一個重要的內(nèi)容。是函數(shù)式編程的一個衍生范例,利用Aop可以對業(yè)務(wù)邏輯各個部分進行分割,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用行,提高了開發(fā)效率。簡單的說就是把我們程序中的重復(fù)代碼抽取出來,在需要執(zhí)行的時候,使用動態(tài)代理的技術(shù),在不修改源碼的基礎(chǔ)上已有的方法進行增強,(使用動態(tài)代理的方式實現(xiàn))

相關(guān)術(shù)語

JoinPoint:鏈接點 那些被攔截到的點,在spring中,這些點指的是方法,因為spring只支持方法類型的連接點

Pointcut:切入點 是指我們要對哪些JoinPont進行攔截的定義

Advice:通知/增強 攔截到Joinpoint之后所要做的事情就是通知

通知類型:前置通知、后置通知、異常通知、最終通知、環(huán)繞通知

Introduction:引介 是一種特殊的通知,在不修改類代碼的前提下,Introduction可以在運行期為類動態(tài)的添加一些方法或field

Target:目標對象,代理的目標對象

Weaving織入 是指把增強應(yīng)用到目標對象來創(chuàng)建新的代理對象的過程,spring采用動態(tài)代理織入,而AspectJ采用編譯期織入和類裝載期織入

Proxy:代理,一類類被Aop織入增強后,就產(chǎn)生一個結(jié)果代理類

Aspect:切面 是切入點和通知(引介)的結(jié)合

在 spring 中,框架會根據(jù)目標類是否實現(xiàn)了接口來決定采用哪種動態(tài)代理的方式。

基于XMl的AOP步驟

1、創(chuàng)建Maven項目引入spring坐標

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.mingqi</groupId>
 <artifactId>SpringIOC</artifactId>
 <packaging>pom</packaging>
 <version>1.0-SNAPSHOT</version>
 <dependencies>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.0.2.RELEASE</version>
 </dependency>
 <dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.7</version>
 </dependency>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
 </dependency>
 </dependencies>
</project>

2、創(chuàng)建業(yè)務(wù)層接口:

package com.mingqi.services;
public interface IAccountService {
 /**
 * 模擬登陸賬戶
 */
 void saveAccount();

 /**
 * 模擬更新賬戶
 * @param id
 */
 void updateAccount(int id);

 /**
 * 模擬刪除賬戶
 * @return
 */
 int deleteAccount();

}

3.創(chuàng)建業(yè)務(wù)層實現(xiàn)類

package com.mingqi.services.impl;
import com.mingqi.services.IAccountService;
public class AccountServicesImpl implements IAccountService {
 public void saveAccount() {
 System.out.println("執(zhí)行了保存");
 }

 public void updateAccount(int id) {
 System.out.println("執(zhí)行了更新"+id);
 }

 public int deleteAccount() {
 System.out.println("執(zhí)行了刪除");
 return 0;
 }
}

4、創(chuàng)建工具類

package com.mingqi.utils;
import org.aspectj.lang.ProceedingJoinPoint;
/**
 * 用戶記錄日志的工具類,里面提供公共的代碼
 */
public class Logger {
 /**
 * 用于打印日志:計劃讓其在切入點方法執(zhí)行前執(zhí)行(切入點方法就是業(yè)務(wù)層方法)
 */
 public void beforePrintLog(){
 System.out.println("Logger類中的pringLog方法開始記錄日志了。。。");
 }
 public void afterReturningPrintLog()
 {
 System.out.println("后置通知Logger類中的beforePrintLog方法開始記錄日志了。。。");
 }
 /**
 * 異常通知
 */
 public void afterThrowingPrintLog()
 {
 System.out.println("異常通知Logger類中的afterThrowingPrintLog方法開始記錄日志了。。。");

 }
 /**
 * 最終通知
 */
 public void afterPrintLog()
 {
 System.out.println("最終通知Logger類中的afterPrintLog方法開始記錄日志了。。。");
 }

 /**
 * 環(huán)繞通知
 * 問題 當我們配置了環(huán)繞通知以后,切入點方法沒有執(zhí)行,而通知方法執(zhí)行了
 * 分析: 通過對比動態(tài)代理中的環(huán)繞通知代碼,發(fā)現(xiàn)動態(tài)代理中的環(huán)繞通知有明確的切入點方法調(diào)用,而我們的代碼中沒有
 * 解決: Spring 框架為我們提供了一個接口:ProceedingJoinPoint。該接口有一個方法proceed(),此方法就相當于明確調(diào)用切入點的方法
 * 該接口可以作為環(huán)繞通知的參數(shù)方法,在程序執(zhí)行時,spring框架會為我們提供該接口的實現(xiàn)類供我們使用
 * spring中的環(huán)繞通知
 * 他是spring框架為我們提供的一種可以在代碼中手動控制增強方法何時會執(zhí)行的方式
 * @param pjp
 * @return
 */
 public Object aroundPringLog(ProceedingJoinPoint pjp){
 Object rtValue = null;
 try{
  Object[] args = pjp.getArgs();//得到方法執(zhí)行所需的參數(shù)

  System.out.println("Logger類中的aroundPringLog方法開始記錄日志了。。。前置");

  rtValue = pjp.proceed(args);//明確調(diào)用業(yè)務(wù)層方法(切入點方法)

  System.out.println("Logger類中的aroundPringLog方法開始記錄日志了。。。后置");

  return rtValue;
 }catch (Throwable t){
  System.out.println("Logger類中的aroundPringLog方法開始記錄日志了。。。異常");
  throw new RuntimeException(t);
 }finally {
  System.out.println("Logger類中的aroundPringLog方法開始記錄日志了。。。最終");
 }
 }
}

5、創(chuàng)建bean配置文件

<?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"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop.xsd">
 <!-- 配置spring的IOC,把service對象配置進來-->
 <bean id="accountSevice" class="com.mingqi.services.impl.AccountServicesImpl"></bean>
 <!-- spring 中基于xml的Aop配置步驟
  1、把通知Bean也交給spring來管理
  2、使用aop:config標簽表名開始aop的配置
  3、使用aop:aspect標簽表明配置切面
  id屬性:是給切面提供一個唯一標識
  ref屬性:是指定通知類的id
  4、在aop:aspect標簽的內(nèi)部使用對應(yīng)的標簽來配置通知的類型
  我們現(xiàn)在的示例是讓printlog方法在切入點方法執(zhí)行之前執(zhí)行,所以是前置通知
  aop:before:標識前置通知
  method屬性: 用于指定Logger類中的方法哪個是前置通知
  pointcut屬性: 用于指定切入點表達式,該表達式的含義指的是對業(yè)務(wù)層中的哪些方法增強
  切入點表達式的寫法:
   關(guān)鍵字:execution(表達式)
   表達式: 訪問修飾符 返回值 包名.包名.包名....類名.方法名(參數(shù)列表)
   標準的寫法: public void com.mingqi.service.impl.AccountServiceImpl.saveAccount()
   訪問修飾符可以省略:void com.mingqi.service.impl.AccountServiceImpl.saveAccount()
   返回值可以使用通配符,標識任意返回值:* com.mingqi.service.impl.AccountServiceImpl.saveAccount()
   包名可以使用通配符,表示任意包,但是有幾級包就需要寫幾個* *.*.*.*.*.AccountServiceImpl.saveAccount()
   包名可以使用..代表當前包及其子包:* *.AccountServiceImpl.saveAccount()
   類名和方法名都可以使用*來實現(xiàn)統(tǒng)配 * *..*.*();
   參數(shù)列表: 可以直接寫數(shù)據(jù)類型:
     基本類型直接寫名稱:int
     引用類型寫包名.類名的方式: java.lang.String
    可以使用通配符來標識任意類型,單必須有參數(shù)
    可以使用..標識有無參數(shù)均可,有參數(shù)可以是任意類型

   全通配寫法:
   * *..*.*(..)
   實際開發(fā)中 切入點表達式的通常寫法:
    切到業(yè)務(wù)層實現(xiàn)類的所有方法,* com.mingqi.service.impl.*.*(..);
  -->
 <!-- 配置Logger類-->
 <bean id="logger" class="com.mingqi.utils.Logger"></bean>
 <!--使用aop:config標簽表名開始aop的配置-->
 <aop:config>
  <aop:pointcut id="pt1" expression="execution(* com.mingqi.services.impl.*.*(..))"></aop:pointcut>
  <!--使用aop:aspect標簽表明配置切面-->
  <aop:aspect id="LogAdvice" ref="logger">
   <!-- 配置前置通知:在切入點方法執(zhí)行之前執(zhí)行
   <aop:before method="beforePrintLog" pointcut-ref="pt1"></aop:before>-->

   <!-- 配置后置通知:在切入點方法正常執(zhí)行之后值。它和異常通知永遠只能執(zhí)行一個
    <aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>-->
   <!-- 配置異常通知:在切入點方法執(zhí)行產(chǎn)生異常之后執(zhí)行。它和后置通知永遠只能執(zhí)行一個
    <aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing>-->
   <!-- 配置最終通知:無論切入點方法是否正常執(zhí)行它都會在其后面執(zhí)行
   <aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>-->
   <!-- 配置環(huán)繞通知 詳細的注釋請看Logger類中-->
   <aop:around method="aroundPringLog" pointcut-ref="pt1"></aop:around>
   </aop:aspect>
  </aop:config>
 </beans>

6、創(chuàng)建測試類

package com.mingqi.test;
import com.mingqi.services.IAccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringIoc {
 @Test
 public void TestAccount()
 {
 ApplicationContext ac= new ClassPathXmlApplicationContext("beam.xml");
 IAccountService accountService=(IAccountService) ac.getBean("accountSevice");
 accountService.saveAccount();
 accountService.updateAccount(22);
 accountService.deleteAccount();
 }
}

總結(jié)

到此這篇關(guān)于Spring中基于xml的AOP的詳細步驟的文章就介紹到這了,更多相關(guān)Spring基于xml的AOP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解BeanUtils.copyProperties()方法如何使用

    詳解BeanUtils.copyProperties()方法如何使用

    這篇文章主要為大家介紹了詳解BeanUtils.copyProperties()方法如何使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 注冊中心配置了spring?security后客戶端啟動報錯

    注冊中心配置了spring?security后客戶端啟動報錯

    這篇文章主要為大家介紹了注冊中心配置了spring?security后客戶端啟動報錯問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Java處理時間格式CST和GMT轉(zhuǎn)換方法示例

    Java處理時間格式CST和GMT轉(zhuǎn)換方法示例

    這篇文章主要給大家介紹了關(guān)于Java處理時間格式CST和GMT轉(zhuǎn)換方法的相關(guān)資料,相信很多小伙伴在時間格式轉(zhuǎn)換的時候非常頭疼,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • Eclipse下使用ANT編譯提示OutOfMemory的解決方法

    Eclipse下使用ANT編譯提示OutOfMemory的解決方法

    由于需要使用ANT編譯的代碼比較多,特別是在第一次變異的時候,會出現(xiàn)OutOfMemory錯誤。并提示更改ANT_OPTS設(shè)定。
    2009-04-04
  • Java多線程之多線程異常捕捉

    Java多線程之多線程異常捕捉

    在java多線程程序中,所有線程都不允許拋出未捕獲的checked exception,也就是說各個線程需要自己把自己的checked exception處理掉,通過此篇文章給大家分享Java多線程之多線程異常捕捉,需要的朋友可以參考下
    2015-08-08
  • 關(guān)于Mybatis-plus設(shè)置字段為空的正確寫法

    關(guān)于Mybatis-plus設(shè)置字段為空的正確寫法

    這篇文章主要介紹了關(guān)于Mybatis-plus設(shè)置字段為空的正確寫法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring基于注解整合Redis完整實例

    Spring基于注解整合Redis完整實例

    這篇文章主要介紹了Spring基于注解整合Redis完整實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • 使用Jackson反序列化遇到的問題及解決

    使用Jackson反序列化遇到的問題及解決

    這篇文章主要介紹了使用Jackson反序列化遇到的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 在Spring中實現(xiàn)異步處理的步驟和代碼演示

    在Spring中實現(xiàn)異步處理的步驟和代碼演示

    在Spring中實現(xiàn)異步處理通常涉及到@Async注解,通過步驟和代碼演示,可以在Spring應(yīng)用程序中實現(xiàn)異步處理,記住要根據(jù)你的應(yīng)用程序的實際需求來調(diào)整線程池和異步方法的設(shè)計,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • SpringBoot實現(xiàn)監(jiān)控Actuator,關(guān)閉redis監(jiān)測

    SpringBoot實現(xiàn)監(jiān)控Actuator,關(guān)閉redis監(jiān)測

    這篇文章主要介紹了SpringBoot實現(xiàn)監(jiān)控Actuator,關(guān)閉redis監(jiān)測,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論