程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring應用AspectJ注解和XML設置裝備擺設完成AOP

Spring應用AspectJ注解和XML設置裝備擺設完成AOP

編輯:關於JAVA

Spring應用AspectJ注解和XML設置裝備擺設完成AOP。本站提示廣大學習愛好者:(Spring應用AspectJ注解和XML設置裝備擺設完成AOP)文章只能為提供參考,不一定能成為您想要的結果。以下是Spring應用AspectJ注解和XML設置裝備擺設完成AOP正文


本文演示的是Spring中應用AspectJ注解和XML設置裝備擺設兩種方法完成AOP

上面是應用AspectJ注解完成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> 

然後是辦事層接口和完成類

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是辦事層接口的完成類 
 */ 
 
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功效照樣很壯大的,支撐可設置裝備擺設,它的默許完成應用的就是JDK靜態署理 
 * @see 應用Spring的AOP不須要繼續相干的器械,也不須要完成接口 
 * @see 但有個條件前提:因為是JDK靜態署理,所以若想生成署理,該類就必需得完成一個接談鋒行 
 * @see 假如該類沒有implements接口的話,仍去應用Spring的默許AOP完成時,那末就會失足 
 * @see 平日須要生成署理的類都是辦事層的類,所以平日都邑抽一個接口出來。即養成面向接口編程的習氣 
 * @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、開辟客戶端 
 * @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設置裝備擺設文件完成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*(..)) 
 --> 

然後是辦事層接口和完成類

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是辦事層接口的完成類 
 */ 
 
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靜態署理和CGLIB署理的差異 
 * @see 1..JDK靜態署理對完成了接口的類停止署理 
 * @see 2..CGLIB署理可以對類署理,重要對指定的類生成一個子類。因為是繼續,所以目的類最好不要應用final聲明 
 * @see -------------------------------------------------------------------------------------------------- 
 * @see 署理方法的選擇 
 * @see 1..假如目的對象完成了接口,默許情形下會采取JDK靜態署理完成AOP,亦可強迫應用CGLIB生成署理完成AOP 
 * @see 2..假如目的對象未完成接口,那末必需引入CGLIB,這時候Spring會在JDK靜態署理和CGLIB署理之間主動切換 
 * @see 3..比擬勉勵營業對象是針對接口編程的,所以勉勵應用JDK靜態署理。由於我們所署理的目的,普通都是營業對象 
 * @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完成了UserManager接口的情形下,這時候Spring會主動應用JDK靜態署理 
    //假如項目曾經引入cglib庫,並在設置裝備擺設文件中強迫應用CGLIB署理,此時Spring才會應用CGLIB署理 
    //UserManager userManager = (UserManager)factory.getBean("userManager"); 
     
    //因為此時的UserManagerImpl並沒有完成UserManager接口,所以吸收類型就不克不及再應用UserManager接口 
    //而且項目中曾經引入了cglib庫,雖然設置裝備擺設文件中沒有強迫應用CGLIB署理,但Spring會主動應用CGLIB署理    
    UserManagerImpl userManager = (UserManagerImpl)factory.getBean("userManager"); 
     
    userManager.addUser("吳三省", "02200059"); 
  } 
} 

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved