SpringAop兩種配置:註解方式和xml配置

一,什麼是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常用的相關術語

    

  1. 通知、增強處理(Advice)就是在你已經實現的功能上添加其他的功能,例如打印日誌,完成操作時發送短信等。
  2. 連接點(JoinPoint和方法有關的前前後後都是連接點。
  3. 切入點(Pointcut) 上面說的連接點的基礎上,你想讓增強使用咋什麼方法之上就是切點。
  4. 切面(Aspect) 切面是通知(增強)和切入點的結合。

    

詳細Demo下載地址:springaop配置Demo下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章