天天看點

Spring 使用原生API接口實作AOP一、搭建環境二、實作原生API接口三、配置xml檔案四、測試

文章目錄

  • 一、搭建環境
  • 二、實作原生API接口
  • 三、配置xml檔案
  • 四、測試

友情連結:

AOP是什麼?

使用原生API接口實作AOP

使用自定義類實作AOP

使用注解實作AOP

一、搭建環境

模拟

service

層,首先建立個

UserService

接口:

package com.wzq.service;

public interface UserService {
    void add();
    void delete();
    void update();
    void query();
}
           

UserService

接口的實作類:

package com.wzq.service;

public class UserServiceImpl implements UserService{
    public void add() {
        System.out.println("增加了一條資訊");
    }

    public void delete() {
        System.out.println("删除了一條資訊");
    }

    public void update() {
        System.out.println("更新了一條資訊");
    }

    public void query() {
        System.out.println("查詢了一條資訊");
    }
}
           

pom.xml

中注入

aspectjweaver

依賴:

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
    <scope>runtime</scope>
</dependency>
           

二、實作原生API接口

原生

API

接口有五個,如下表所示:

Spring 使用原生API接口實作AOP一、搭建環境二、實作原生API接口三、配置xml檔案四、測試

這裡實作一下前兩個

建立

BeforeLog

類,實作

MethodBeforeAdvice

接口,需要寫

before

方法,參數說明都在注釋裡:

package com.wzq.log;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class BeforeLog implements MethodBeforeAdvice {
    /*
     * method:要執行的目标對象的方法
     * args:參數
     * target:目标對象
     * */
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("執行了" + target.getClass().getName() + ",中的" + method.getName() + "方法");
    }
}
           

建立

AfterLog

類,實作

AfterReturningAdvice

接口,寫

afterReturning

方法:

package com.wzq.log;

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class AfterLog implements AfterReturningAdvice {
    /*
     * returnValue:傳回值
     * method:要執行的目标對象的方法
     * args:參數
     * target:目标對象
     * */
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("執行了" + target.getClass().getName() +
                "中的" + method.getName() + "方法,傳回參數是:" + returnValue);
    }
}
           

三、配置xml檔案

.xml

中配置

AOP

需要導入限制,直接使用下面這個模闆即可:

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">

</beans>
           

首先需要注冊

bean

<!-- 注冊bean -->
<bean id="userService" class="com.wzq.service.UserServiceImpl"/>
<bean id="afterLog" class="com.wzq.log.AfterLog"/>
<bean id="beforeLog" class="com.wzq.log.BeforeLog"/>
           

然後是配置

aop

<!-- 方式一:使用原生Spring API接口 -->
<!-- 配置aop:需要導入aop限制 -->
<aop:config>
    <!-- 切入點 -->
    <aop:pointcut id="pointcut" expression="execution(* com.wzq.service.UserServiceImpl.*(..))"/>
    <!-- 執行環繞增加 -->
    <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut" />
    <aop:advisor advice-ref="beforeLog" pointcut-ref="pointcut" />
</aop:config>
           

注意在

aop:pointcut

标簽裡面有一個

expression

表達式,它的作用就是切入點入口

expression="execution(修飾符 傳回值 包名.類名/接口名.方法名(參數清單))"
           

在上面的例子中,忽略掉了修飾符,

*

表示所有,比如

com.wzq.service.UserServiceImpl.*(..))

,它的意思是:

com.wzq.service.UserServiceImpl

類下所有的方法和所有的參數

四、測試

編寫測試類:

import com.wzq.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    @Test
    public void Test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService service = (UserService) context.getBean("userService");
        service.add();
    }
}
           
Spring 使用原生API接口實作AOP一、搭建環境二、實作原生API接口三、配置xml檔案四、測試