亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring使用AspectJ注解和XML配置實現(xiàn)AOP

 更新時間:2016年10月19日 15:47:11   作者:玄玉  
這篇文章主要介紹了Spring使用AspectJ注解和XML配置實現(xiàn)AOP的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文演示的是Spring中使用AspectJ注解和XML配置兩種方式實現(xiàn)AOP

下面是使用AspectJ注解實現(xiàn)AOP的Java Project
首先是位于classpath下的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.5.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
   
  <!-- 啟用AspectJ對Annotation的支持 -->     
  <aop:aspectj-autoproxy/> 
       
  <bean id="userManager" class="com.jadyer.annotation.UserManagerImpl"/> 
   
  <bean id="securityHandler" class="com.jadyer.annotation.SecurityHandler"/> 
</beans> 

然后是服務層接口以及實現(xiàn)類

package com.jadyer.annotation; 
public interface UserManager { 
  public void addUser(String username, String password); 
  public void delUser(int userId); 
  public String findUserById(int userId); 
  public void modifyUser(int userId, String username, String password); 
} 
 
/** 
 * 上面的UserManager是服務層的接口 
 * 下面的UserManagerImpl是服務層接口的實現(xiàn)類 
 */ 
 
package com.jadyer.annotation; 
 
public class UserManagerImpl implements UserManager { 
  public void addUser(String username, String password) { 
    System.out.println("------UserManagerImpl.addUser() is invoked------"); 
  } 
 
  public void delUser(int userId) { 
    System.out.println("------UserManagerImpl.delUser() is invoked------"); 
  } 
 
  public String findUserById(int userId) { 
    System.out.println("------UserManagerImpl.findUserById() is invoked------"); 
    return "鐵面生"; 
  } 
 
  public void modifyUser(int userId, String username, String password) { 
    System.out.println("------UserManagerImpl.modifyUser() is invoked------"); 
  } 
} 

接下來是使用AspectJ注解標注的切入類

package com.jadyer.annotation; 
 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 
 
@Aspect 
public class SecurityHandler { 
  /** 
   * 定義Pointcut 
   * @see Pointcut的名稱為addAddMethod(),此方法沒有返回值和參數 
   * @see 該方法就是一個標識,不進行調用 
   */ 
  @Pointcut("execution(* add*(..))") //匹配所有以add開頭的方法 
  private void addAddMethod(){}; 
   
  /** 
   * 定義Advice 
   * @see 表示我們的Advice應用到哪些Pointcut訂閱的Joinpoint上 
   */ 
  //@Before("addAddMethod()") 
  @After("addAddMethod()") 
  private void checkSecurity() { 
    System.out.println("------【checkSecurity is invoked】------"); 
  }     
} 

最后是客戶端測試類

package com.jadyer.annotation; 
 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
 
/** 
 * Spring對AOP的支持:采用Annotation方式 
 * @see ------------------------------------------------------------------------------------- 
 * @see Spring提供的AOP功能還是很強大的,支持可配置,它的默認實現(xiàn)使用的就是JDK動態(tài)代理 
 * @see 使用Spring的AOP不需要繼承相關的東西,也不需要實現(xiàn)接口 
 * @see 但有個前提條件:由于是JDK動態(tài)代理,所以若想生成代理,該類就必須得實現(xiàn)一個接口才行 
 * @see 如果該類沒有implements接口的話,仍去使用Spring的默認AOP實現(xiàn)時,那么就會出錯 
 * @see 通常需要生成代理的類都是服務層的類,所以通常都會抽一個接口出來。即養(yǎng)成面向接口編程的習慣 
 * @see ------------------------------------------------------------------------------------- 
 * @see 采用Annotation方式完成AOP示例的基本步驟,如下 
 * @see 1、Spring2.0的依賴包配置。新增Annotation支持 
 * @see   * SPRING_HOME//dist//spring.jar 
 * @see   * SPRING_HOME//lib//log4j//log4j-1.2.14.jar 
 * @see   * SPRING_HOME//lib//jakarta-commons//commons-logging.jar 
 * @see   * SPRING_HOME//lib//aspectj//*.jar 
 * @see 2、將橫切性關注點模塊化,建立SecurityHandler.java 
 * @see 3、采用注解指定SecurityHandler為Aspect 
 * @see 4、采用注解定義Advice和Pointcut 
 * @see 5、啟用AspectJ對Annotation的支持,并且將目標類和Aspect類配置到IoC容器中 
 * @see 6、開發(fā)客戶端 
 * @see ------------------------------------------------------------------------------------- 
 */ 
public class Client { 
  public static void main(String[] args) { 
    ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    UserManager userManager = (UserManager)factory.getBean("userManager"); 
    userManager.addUser("張起靈", "02200059"); 
  } 
} 

下面是使用XML配置文件實現(xiàn)AOP的Java Project
首先是位于src根目錄中的applicationContext-cglib.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.5.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
       
  <!-- 強制使用CGLIB代理 --> 
  <!-- <aop:aspectj-autoproxy proxy-target-class="true"/> --> 
   
  <bean id="userManager" class="com.jadyer.cglib.UserManagerImpl"/> 
   
  <bean id="securityHandler" class="com.jadyer.cglib.SecurityHandler"/> 
   
  <aop:config> 
    <aop:aspect id="securityAspect" ref="securityHandler">  
      <aop:pointcut id="addAddMethod" expression="execution(* add*(..))"/> 
      <aop:before method="checkSecurity" pointcut-ref="addAddMethod"/> 
    </aop:aspect> 
  </aop:config> 
</beans> 
 
<!--  
匹配add開頭的所有的方法 
execution(* add*(..)) 
 
匹配com.jadyer.servcices.impl包下的所有的類的所有的方法 
execution(* com.jadyer.servcices.impl.*.*(..)) 
 
匹配com.jadyer.servcices.impl包下的add或者del開頭的所有的方法 
execution(* com.jadyer.servcices.impl.*.add*(..)) || execution(* com.jadyer.servcices.impl.*.del*(..)) 
 --> 

然后是服務層接口以及實現(xiàn)類

package com.jadyer.cglib; 
public interface UserManager { 
  public void addUser(String username, String password); 
  public void delUser(int userId); 
  public String findUserById(int userId); 
  public void modifyUser(int userId, String username, String password); 
} 
 
/** 
 * 上面的UserManager是服務層接口 
 * 下面的UserManagerImpl是服務層接口的實現(xiàn)類 
 */ 
 
package com.jadyer.cglib; 
 
public class UserManagerImpl {  
//implements UserManager { 
  public void addUser(String username, String password) { 
    System.out.println("------UserManagerImpl.addUser() is invoked------"); 
  } 
 
  public void delUser(int userId) { 
    System.out.println("------UserManagerImpl.delUser() is invoked------"); 
  } 
 
  public String findUserById(int userId) { 
    System.out.println("------UserManagerImpl.findUserById() is invoked------"); 
    return "張三"; 
  } 
 
  public void modifyUser(int userId, String username, String password) { 
    System.out.println("------UserManagerImpl.modifyUser() is invoked------"); 
  } 
} 

接著是在applicationContext-cglib.xml中所指定的切入類

package com.jadyer.cglib; 
 
import org.aspectj.lang.JoinPoint; 
 
/** 
 * 將客戶調用信息傳遞到該Advice中 
 * @see 可以在Advice中添加一個JoinPoint參數,取得客戶端調用的方法名稱及參數值 
 * @see 以后純粹使用AOP去寫類似這樣東西的情況比較少,我們主要使用Spring提供的事務 
 * @see 關于這個,知道即可。下面是示例代碼 
 */ 
public class SecurityHandler { 
  private void checkSecurity(JoinPoint joinPoint) { 
    for (int i=0; i<joinPoint.getArgs().length; i++) { 
      System.out.println(joinPoint.getArgs()[i]); //獲取客戶端調用的方法的參數值 
    } 
    System.out.println(joinPoint.getSignature().getName()); //獲取客戶端調用的方法名稱 
    System.out.println("------【checkSecurity is invoked】------"); 
  } 
} 

最后是客戶端測試類

package com.jadyer.cglib; 
 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
 
/** 
 * @see -------------------------------------------------------------------------------------------------- 
 * @see JDK動態(tài)代理和CGLIB代理的差別 
 * @see 1..JDK動態(tài)代理對實現(xiàn)了接口的類進行代理 
 * @see 2..CGLIB代理可以對類代理,主要對指定的類生成一個子類。由于是繼承,所以目標類最好不要使用final聲明 
 * @see -------------------------------------------------------------------------------------------------- 
 * @see 代理方式的選擇 
 * @see 1..如果目標對象實現(xiàn)了接口,默認情況下會采用JDK動態(tài)代理實現(xiàn)AOP,亦可強制使用CGLIB生成代理實現(xiàn)AOP 
 * @see 2..如果目標對象未實現(xiàn)接口,那么必須引入CGLIB,這時Spring會在JDK動態(tài)代理和CGLIB代理之間自動切換 
 * @see 3..比較鼓勵業(yè)務對象是針對接口編程的,所以鼓勵使用JDK動態(tài)代理。因為我們所代理的目標,一般都是業(yè)務對象 
 * @see -------------------------------------------------------------------------------------------------- 
 * @see 使用CGLIG代理的步驟 
 * @see 1..新增CGLIB庫:SPRING_HOME//lib//cglib//*.jar 
 * @see 2..新增配置標簽,強制使用CGLIB代理<aop:aspectj-autoproxy proxy-target-class="true"/> 
 * @see -------------------------------------------------------------------------------------------------- 
 */ 
public class Client { 
  public static void main(String[] args) { 
    ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext-cglib.xml"); 
     
    //當UserManagerImpl實現(xiàn)了UserManager接口的情況下,這時Spring會自動使用JDK動態(tài)代理 
    //如果項目已經引入cglib庫,并在配置文件中強制使用CGLIB代理,此時Spring才會使用CGLIB代理 
    //UserManager userManager = (UserManager)factory.getBean("userManager"); 
     
    //由于此時的UserManagerImpl并沒有實現(xiàn)UserManager接口,所以接收類型就不能再使用UserManager接口 
    //并且項目中已經引入了cglib庫,盡管配置文件中沒有強制使用CGLIB代理,但Spring會自動使用CGLIB代理    
    UserManagerImpl userManager = (UserManagerImpl)factory.getBean("userManager"); 
     
    userManager.addUser("吳三省", "02200059"); 
  } 
} 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • java常用工具類 Random隨機數、MD5加密工具類

    java常用工具類 Random隨機數、MD5加密工具類

    這篇文章主要為大家詳細介紹了Java常用工具類,Random隨機數工具類、MD5加密工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • springboot中nacos-client獲取配置的實現(xiàn)方法

    springboot中nacos-client獲取配置的實現(xiàn)方法

    本文主要介紹了springboot中nacos-client獲取配置的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • MySQL查詢字段實現(xiàn)字符串分割split功能的示例代碼

    MySQL查詢字段實現(xiàn)字符串分割split功能的示例代碼

    本文主要介紹了MySQL查詢字段實現(xiàn)字符串分割split功能的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java設計模式之java外觀模式詳解

    Java設計模式之java外觀模式詳解

    這篇文章主要介紹了Java設計模式之外觀模式(Facade模式)介紹,外觀模式(Facade)的定義:為子系統(tǒng)中的一組接口提供一個一致的界面,需要的朋友可以參考下
    2021-09-09
  • Spring使用注解更簡單的讀取和存儲對象的方法

    Spring使用注解更簡單的讀取和存儲對象的方法

    這篇文章主要介紹了Spring使用注解更簡單的讀取和存儲對象的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-07-07
  • SpringBoot實現(xiàn)掃碼登錄的示例代碼

    SpringBoot實現(xiàn)掃碼登錄的示例代碼

    本文主要介紹了SpringBoot實現(xiàn)掃碼登錄的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 通過第三方接口發(fā)送短信驗證碼/短信通知(推薦)

    通過第三方接口發(fā)送短信驗證碼/短信通知(推薦)

    這篇文章主要介紹了通過第三方接口發(fā)送短信驗證碼/短信通知(推薦)的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • 使用Java實現(xiàn)動態(tài)生成MySQL數據庫

    使用Java實現(xiàn)動態(tài)生成MySQL數據庫

    這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)動態(tài)生成MySQL數據庫,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02
  • IDEA搭建Maven模塊化項目的實現(xiàn)

    IDEA搭建Maven模塊化項目的實現(xiàn)

    本文主要介紹了IDEA搭建Maven模塊化項目的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Java變態(tài)跳臺階實現(xiàn)思路和代碼

    Java變態(tài)跳臺階實現(xiàn)思路和代碼

    今天小編就為大家分享一篇關于Java變態(tài)跳臺階實現(xiàn)思路和代碼,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論