Spring 中基於 AOP 的 @AspectJ註解例項
阿新 • • 發佈:2020-05-10
@AspectJ 作為通過 Java 5 註釋註釋的普通的 Java 類,它指的是宣告 aspects 的一種風格。通過在你的基於架構的 XML 配置檔案中包含以下元素,@AspectJ 支援是可用的。
1.第一步:倒入jar包,跟上個例子包是一樣的
-
aspectjrt.jar
-
aspectjweaver.jar
-
aspectj.jar
- aopalliance.jar
2.第二步:建立三個類
2.1這裡是 Logging.java 檔案的內容。這實際上是 aspect 模組的一個示例,它定義了在各個點呼叫的方法。
1 package com.spring.aop2; 2 3 import org.aspectj.lang.annotation.AfterReturning; 4 import org.aspectj.lang.annotation.AfterThrowing; 5 import org.aspectj.lang.annotation.Aspect; 6 import org.aspectj.lang.annotation.Before; 7 import org.aspectj.lang.annotation.Pointcut; 8 9 @Aspect // 定義切面 10 public class Logging { 11 @Pointcut("execution(* com.spring.aop2.Student.*(..))") // 定義切點 12 private void selectAll() { 13 14 } 15 /** 16 * 定義通知方法 17 */ 18 19 @Before("selectAll()") 20 public void beforeAdvice() { 21 System.out.println("----------beforeAdvice-----------"); 22 23 } 24 25 @AfterReturning(pointcut = "selectAll()", returning = "retVal") 26 public void afterReturningAdvice(Object retVal) { 27 System.out.println("Returning:" + retVal.toString()); 28 } 29 30 @AfterThrowing(pointcut = "selectAll()", throwing = "ex") 31 public void AfterThrowingAdvice(IllegalArgumentException ex) { 32 System.out.println("There has been an exception: " + ex.toString()); 33 } 34 35 }
2.2下面是 Student.java 檔案的內容:
1 package com.spring.aop2; 2 3 public class Student { 4 /** 5 * 定義學生類 6 */ 7 private String name; 8 private Integer age; 9 10 public String getName() { 11 return name; 12 } 13 14 public void setName(String name) { 15 this.name = name; 16 } 17 18 public Integer getAge() { 19 return age; 20 } 21 22 public void setAge(Integer age) { 23 this.age = age; 24 } 25 26 public void printAdvice() { 27 System.out.println("name:" + name + ",age:" + age); 28 29 } 30 31 }
2.3下面是 MainApp.java 檔案的內容:
1 package com.spring.aop2; 2 3 4 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.annotation.AnnotationConfigApplicationContext; 7 import org.springframework.context.support.AbstractApplicationContext; 8 import org.springframework.context.support.ClassPathXmlApplicationContext; 9 10 public class Main { 11 /** 12 * Spring aop基於註解 配置檔案springAop.xml 13 * author: 14 * mail:[email protected] 15 * 時間: 16 */ 17 public static void main(String[] args) { 18 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring_xml/springAop.xml"); 19 Student student=(Student)applicationContext.getBean("Student"); 20 student.printAdvice(); 21 } 22 23 }
3.第三步:建立bean檔案(上面的標頭檔案在上個例子當中有,這裡就省略了)
下面是配置檔案 Beans.xml:
1 2 <!-- 開啟註解 通過aop名稱空間的<aop:aspectj-autoproxy 3 />宣告自動為spring容器中那些配置@aspectJ切面的bean建立代理,織入切面--> 4 <aop:aspectj-autoproxy/> 5 <!-- 定義切面bean --> 6 <bean id="Logging" class="com.spring.aop2.Logging"></bean> 7 8 <!-- 配置bean --> 9 <bean id="Student" class="com.spring.aop2.Student"> 10 <property name="name" value="張三"></property> 11 <property name="age" value="23"></property> 12 </bean>
讓我們執行一下應用程式。如果你的應用程式一切都正常的話,這將會輸出以下訊息(其中包含了異常通知):
&n