大家可以關註作者的賬號,關註從零開始學Spring筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Spring筆記】Spring學習路線" 創建項目測試 第一步:創建web ...
大家可以關註作者的賬號,關註從零開始學Spring筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。
【從零開始學Spring筆記】Spring學習路線
創建項目測試
第一步:創建web項目,引入jar包
引入和AOP的XML開發同樣的11個jar包
可以在以前下載解壓後的libs文件夾中尋找,同時也上傳到百度雲了,下載即可。下載鏈接在本系列文集的第一篇【從零開始學Spring筆記】Spring4學習路線中尋找。
第二步:引入Spring的配置文件
在 src下創建applicationContext.xml
引入aop約束。
約束:spring framework-4.2.4.RELEASE\docs\spring framework-reference\htm|\xsd-configuration.html
觀看本系列文集的【從零開始學Spring筆記】Spring配置,配置aop XML文件的提示。
第三步:編寫目標類並配置
和之前一樣,建立介面和實現類,並配置
<!-- 配置目標對象:被增強的對象 -->
<bean id = "productDao" class="com.tyust.spring.demo2.ProductDaoImpl"></bean>
第四步:編寫一個切麵類,並交給Spring
package com.tyust.spring.demo1;
public class MyAspect {
public void before() {
System.out.println("前置增強======================================");
}
}
<bean id="myAspect" class="com.tyust.spring.demo1.MyAspect"></bean>
第五步:使用註解的AOP對象目標類進行增強
<!-- 開啟註解的AOP開發 -->
<aop:aspectj-autoproxy/>
在切麵類上使用增強
@Aspect
public class MyAspect {
@Before(value = "excution(* com.tyust.spring.demo1.OrderDao.save(..))")
public void before() {
System.out.println("前置增強======================================");
}
}
第六步:編寫測試類
package com.tyust.spring.demo1;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo1 {
@Resource(name = "orderDao")
private OrderDao orderDao;
@Test
public void demo1() {
orderDao.save();
orderDao.delete();
orderDao.update();
orderDao.find();
}
}
輸出結果
註解的AOP的通知的類型
package com.tyust.spring.demo1;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MyAspect {
@Before(value = "execution(* com.tyust.spring.demo1.OrderDao.save(..))")
public void before() {
System.out.println("前置增強======================================");
}
@AfterReturning(value = "execution(* com.tyust.spring.demo1.OrderDao.delete(..))",returning = "result")
public void afterReturning(Object result) {
System.out.println("後置增強======================================"+ result);
}
@Around(value = "execution(* com.tyust.spring.demo1.OrderDao.update(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("環繞qian增強======================================");
Object obj = joinPoint.proceed();
System.out.println("環繞hou增強======================================");
return obj;
}
@AfterThrowing(value = "execution(* com.tyust.spring.demo1.OrderDao.find(..))",throwing = "ex")
public void afterThrowing(Throwable ex) {
System.out.println("異常拋出增強======================================"+ex.getMessage());
}
@After(value = "execution(* com.tyust.spring.demo1.OrderDao.find(..))")
public void after() {
System.out.println("最終增強======================================");
}
}
輸出結果
AOP的註解的切入點的註解
@Pointcut(value = "execution(* com.tyust.spring.demo1.OrderDao.find(..))")
private void pointCut1() {}
@After(value = "MyAspect.pointCut1()")
public void after() {
System.out.println("最終增強======================================");
}
可以讓配置變得更方便
總結
@Aspect:定義切麵類的註解
通知類型:
- @Before:前置通知
- @AfterReturing:後置通知
- @Around:環繞通知
- @After:最終通知
- @AfterThrowing:異常拋出通知
@Pointcut:定義切入點的註解