1. 程式人生 > >Spring中基於AspectJ的AOP切面程式設計介紹及實現

Spring中基於AspectJ的AOP切面程式設計介紹及實現

簡介:

  1. AOP Aspect Oriented Programing 面向切面程式設計
  2. AOP採取==橫向抽取==機制,取代了傳統==縱向繼承==體系重複性程式碼(效能監視、事務管理、安全檢查、快取)
  3. Spring中的Aop是純Java來實現的,使用==動態代理==的方式增強程式碼
  4. AOP不是由Spring提出來的,是由AOP聯盟定義的

專業術語:

  1. Joinpoint(連線點) :委託類中可以被增強的方法
  2. ==Pointcut(切入點) :切點 ,要被增強的方法==
  3. ==Advice(通知/增強) :增強的程式碼==
  4. Target(目標物件) :委託物件
  5. Weaving(織入) :把增強應用切點的過程
  6. Proxy(代理): 一個類被AOP織入增強後,就產生一個結果代理類
  7. ==Aspect(切面): 是切點通知的結合==

Aspect的增強型別:

  1. @Before 前置通知
  2. @AfterReturning 後置通知
  3. @Around 環繞通知
  4. @AfterThrowing丟擲通知
  5. @After 最終final通知

實現:

 

1.引入pom依賴

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>


<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>

2.配置自動代理和註解掃描器

<?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:context="http://www.springframework.org/schema/context"
       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/context
                           http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
    <!--配置註解掃描器-->
    <context:component-scan base-package="com.it.bigdata"/>

    <!--開啟aop自動代理-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

3.編寫dao(委託類)

package com.it.bigdata;
import com.sun.xml.internal.bind.v2.model.core.ID;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
    public void addUser(User user) {
        System.out.println("新增使用者.." + user);
    }

    public void deleteUser(Integer id) {
        System.out.println("刪除使用者" + id);
    }

    public void findUser(Integer id) {
        System.out.println("查詢使用者" + id);
    }

    public void updateUser(Integer id) {
        System.out.println("修改使用者" + id);
    }
}

4.編寫切面

package com.it.bigdata;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 切面 = 切點(切點表示式) + 通知(要增強的程式碼,方法)
 */
@Aspect
@Component
public class MyAspect {
    /**
     * 通知
     */
    @Before("execution( * com.it.bigdata.UserDao.delete*(..))")
    public void advice1() {
        System.out.println("通知1");
    }
}

5.呼叫dao的方法

userDao.deleteUser(12);