1. 程式人生 > >spring學習 十 schema-based 前置後後置通知

spring學習 十 schema-based 前置後後置通知

point utf-8 後置 實現接口 測試 運行 jar 需要 圖片

spring 提供了 2 種 AOP 實現方式:(1)Schema-based ,(2)AspectJ

Schema-based:每個通知都需要實現接口或類,配置 spring 配置文件時在<aop:config>配置


AspectJ每個通知不需要實現接口或類,配置 spring 配置文件是在<aop:config>的子標簽<aop:aspect>中配置


基於Schema-based實現的入門程序

(1)第一步:導入jar包,除了spring中必須的包,下面兩個包

技術分享圖片

(2)第二步:新建通知類

如果要實現前置通知,後置通知,在Schema-based方式中需要實現 MethodBeforeAdvice與 AfterReturningAdvice兩個接口,代碼如下;

前置通知代碼,before方法的參數:

arg0: 切點方法對象 Method 對象
arg1: 切點方法參數
arg2:切點在哪個對象中

import java.lang.reflect.Method;

import org.springframework.aop.BeforeAdvice;
import org.springframework.aop.MethodBeforeAdvice;

public class MyBeforeAdvice implements MethodBeforeAdvice{

    @Override
    public void before(Method arg0, Object[] arg1, Object arg2) throws
Throwable { System.out.println("前置通知"); } }

後置通知代碼:

afterReturning方法的參數:

arg0: 切點方法返回值
arg1:切點方法對象
arg2:切點方法參數
arg3:切點方法所在類的對象

package com.airplan.pojo;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

public class MyAfterAdvice implements
AfterReturningAdvice{ @Override public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable { System.out.println("後置通知"); } }

第三步:aop配置

3.1 引入 aop 命名空間
3.2 配置通知類的<bean>
3.3 配置切面
3.4 * 通配符,匹配任意方法名,任意類名,任意一級包名
3.5   如果希望匹配任意方法參數 (..)

代表把返回值為任意類型,
且在PointCutClass類下面的,參數為任意的方法聲明為切點
expression="* execution(void com.airplan.pojo.PointCutClass.*(..))"

下面的配置代表把通知和切入點進行對應
<aop:advisor advice-ref="beforeAdvice" pointcut-ref="mypoint"/>
<aop:advisor advice-ref="afterAdvice" pointcut-ref="mypoint"/>


<?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" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd 
 http://www.springframework.org/schema/aop 
 http://www.springframework.org/schema/aop/spring-aop-4.1.xsd ">
    
    <!-- 配置通知所在的類 -->    
    <bean id="beforeAdvice" class="com.airplan.pojo.MyBeforeAdvice"></bean>
    <bean id="afterAdvice" class="com.airplan.pojo.MyAfterAdvice"></bean>
    
    <!-- 配置切面 -->
    <aop:config>
        <!-- 配置切點 -->
        <aop:pointcut expression="execution(void com.airplan.pojo.PointCutClass.testFun())" id="mypoint"/>
        <!-- 配置通知 -->
        <aop:advisor advice-ref="beforeAdvice" pointcut-ref="mypoint"/>
        <aop:advisor advice-ref="afterAdvice" pointcut-ref="mypoint"/>
        
    </aop:config>
    <!-- 配置切點所在的類 -->
    <bean id="pointCutClass" class="com.airplan.pojo.PointCutClass"></bean>
    
</beans>

第四步:測試代碼

package com.airplan.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.airplan.pojo.PointCutClass;

public class AopDemo {
    public static void main(String[] args) {
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        PointCutClass pointCutClass = ac.getBean("pointCutClass",PointCutClass.class);
        pointCutClass.testFun();
    }
}

運行結果;

技術分享圖片

spring學習 十 schema-based 前置後後置通知