一,什麼是SpringAop?
所謂的springaop就是面向切面編程,就是在你的原有項目功能上,通過aop去添加新的功能,這些功能是建立在原有的功能基礎上的,而且不會修改原來的動能代碼以及功能邏輯。例如你用銀行卡購物,購物付款,這是一個功能。付款後,銀行向你的手機發送一條取錢信息,這就是新加的功能。也就是實現了增強
二,Springaop的實現機制是什麼?
橫向抽取機制,那麼什麼是橫向抽取機制呢?所謂的橫向抽取機制就是使用動態的代理的方式(cglib代理和jdk代理)來實現對象的代理,實際上我們操作的是假對象。既然有橫向抽取機制,那麼有沒有縱向代理模式呢 ?答案是有的。那麼什麼是縱向抽取呢?縱向抽取就是把公共的方法寫在父類裏,所有的類都繼承父類,這樣就是能調用父類的方法。例如,你購物付款是一個子類的功能,你可能還會取款,這也是一個功能,而在他們結束之後,銀行都會發送一個信息給你,這又是一個功能,這個銀行給你發送信息是個公共的方法,所以這個發信息的功能就是屬於父類的。子類繼承父類並調用父類的方法就是縱向抽取。
三,Springaop的使用場景
一般來說:打印日誌,還有短信通知啊,權限驗證等,都可以使用aop來實現。
四,sringaop的兩種實現方式
(1)xml文件配置方式
(2)註解的方式實現
那麼,下面我們就這兩個方式以demo的形式講解一下。
方式一:xml方式配置
a:創建被加強類(鏈接點類)
package cn.ytk.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
public void sys() {
System.out.println("userDao.....");
}
}
b:創建增強類
package cn.ytk.strong;
import org.aspectj.lang.ProceedingJoinPoint;
public class Project {
public void before1() {
System.out.println("前置通知。。。。。。。。。");
}
/*
* 環繞通知
* */
public void around(ProceedingJoinPoint point) throws Throwable {
System.out.println("環繞通知前。。。。。");
point.proceed();
System.out.println("環繞通知後。。。。。。");
}
public void after1() {
System.out.println("後置通知。。。。。。。。。");
}
}
c:配置切點和切面<!-- spring bean的配置 -->
<bean id="userDao" class="cn.ytk.dao.UserDao"></bean>
<bean id="userService" class="cn.ytk.service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="project" class="cn.ytk.strong.Project"></bean>
<aop:config>
<aop:pointcut expression="execution(* cn.ytk.dao.UserDao.*(..))" id="pointcut1"/>
<aop:aspect ref="project">
<aop:before method="before1" pointcut-ref="pointcut1"/>
<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
<aop:around method="around" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
d:運行結果
由上面的配置文件可以看出,配置相當複雜,接下來我們看一下使用spring註解的方式如何使用吧。
方式二:通過springaop註解實現
a:配置spring文件,開啓aop註解
<!-- 開啓aop的註解 -->
<aop:aspectj-autoproxy/>
<context:component-scan base-package="cn.ytk.*"></context:component-scan>
b:編寫增強類
package cn.ytk.strong;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class Project2 {
//方式1:
@Before(value="execution(* cn.ytk.dao.UserDao.*(..))")
public void before() {
System.out.println("前置通知。。。。。。");
}
//方式二:先編寫切點在將切點加到加強上。
@Pointcut("execution(* cn.ytk.dao.*.*(..))")
public void after() {}
@AfterReturning("after()")
public void after1() {
System.out.println("....後置通知....");
}
}
我們可以看出上面給出了兩種方式,第一種是註解直接加在增強方法上,第二種是先定義切點,在增強,這兩種方式都可以實現springaop的操作。
五,springaop常用的相關術語
- 通知、增強處理(Advice)就是在你已經實現的功能上添加其他的功能,例如打印日誌,完成操作時發送短信等。
- 連接點(JoinPoint)和方法有關的前前後後都是連接點。
- 切入點(Pointcut) 上面說的連接點的基礎上,你想讓增強使用咋什麼方法之上就是切點。
- 切面(Aspect) 切面是通知(增強)和切入點的結合。
詳細Demo下載地址:springaop配置Demo下載