1. 程式人生 > >Spring5.0.4 AOP 使用AspectJ方式自動代理註解(@EnableAspectJAutoProxy)

Spring5.0.4 AOP 使用AspectJ方式自動代理註解(@EnableAspectJAutoProxy)

本文使用Maven建立的專案
pom.xml 檔案內容

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion
>
<groupId>com.dyh</groupId> <artifactId>TestDemo</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- spring5.0.4 --> <dependency> <groupId>org.springframework</groupId> <artifactId
>
spring-context</artifactId> <version>5.0.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.4.RELEASE</version
>
</dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.3.9.RELEASE</version> </dependency> <!-- AspectJ --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.11</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.11</version> </dependency> <!-- cglib --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.1</version> </dependency> </dependencies> </project>

下面會用到AspectJ的幾種通知註解的:

  1. @Before: 前置通知, 在方法執行之前執行
  2. @After: 後置通知, 在方法執行之後執行
  3. @AfterRunning:返回通知, 在方法成功執行返回結果之後執行
  4. @AfterThrowing: 異常通知, 在方法丟擲異常之後
  5. @Around: 環繞通知,圍繞著方法執行

有2種方法實現aop功能,本文使用的是javaconfig配置類註解實現,另一種是基於xml配置檔案
介面類

package com.dyh.ioc.base;

public interface Weapon {

    public void attack();
}

實體類

package com.dyh.ioc.base;

import org.springframework.stereotype.Component;
@Component
public class Knifie implements Weapon {
    public void attack() {
        System.out.println("C");
    }
}

實現類

package com.dyh.ioc.base;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Knight {
    private String name;
    private Weapon weapon;

    public Knight() {

    }
    public Knight(String name,Weapon weapon){
        this.name = name;
        this.weapon = weapon;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Weapon getWeapon() {
        return weapon;
    }
    //自動注入
    @Autowired
    //用於指定注入Bean的名稱
    @Qualifier("knifie")
    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }

    public void fight(){
        System.out.println("start ......");
        System.out.println(name);
        weapon.attack();
    }
}

JavaConfig類

package com.dyh.ioc.base;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;


//即使用jdk預設代理模式,AspectJ代理模式是CGLIB代理模式
//如果目標物件實現了介面,預設情況下會採用JDK的動態代理實現AOP
//如果目標物件實現了介面,可以強制使用CGLIB實現AOP (此例子我們就是強制使用cglib實現aop)
//如果目標物件沒有實現了介面,必須採用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換

//用於定義配置類,可替換xml配置檔案
@Configuration
//開啟AspectJ 自動代理模式,如果不填proxyTargetClass=true,預設為false,
@EnableAspectJAutoProxy(proxyTargetClass=true)
//掃描注入類
@ComponentScan(basePackages = "com.dyh.ioc.*")
@Component
@Aspect
public class AopAspectConfiguration {
    //宣告切入點
    //第一個*表示 方法  返回值(例如public int)
    //第二個* 表示方法的全限定名(即包名+類名)
    //perform表示目標方法引數括號兩個.表示任意型別引數
    //方法表示式以“*”號開始,表明了我們不關心方法返回值的型別。然後,我們指定了全限定類名和方法名。對於方法引數列表,
    //我們使用兩個點號(..)表明切點要選擇任意的perform()方法,無論該方法的入參是什麼
    //execution表示執行的時候觸發
    @Pointcut("execution(* *(..))")
    public void point(){
        //該方法就是一個標識方法,為pointcut提供一個依附的地方
    }

    @Before("point()")
    public void before(){
        System.out.println("Before");
    }
    @After("point()")
    public void after(){
        System.out.println("After");
    }
}

測試類

package com.dyh.ioc.base;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args){
        AnnotationConfigApplicationContext  applicationContext = new AnnotationConfigApplicationContext(AopAspectConfiguration.class);
        Knight knight = applicationContext.getBean("knight",Knight.class);
        knight.setName("123");
        knight.fight();
    }
}

最終執行結果

E:\java\jdk1.8.0_162\bin\java -javaagent:E:\IDEA\lib\idea_rt.jar=65304:E:\IDEA\bin -Dfile.encoding=UTF-8 -classpath E:\java\jdk1.8.0_162\jre\lib\charsets.jar;E:\java\jdk1.8.0_162\jre\lib\deploy.jar;E:\java\jdk1.8.0_162\jre\lib\ext\access-bridge-64.jar;E:\java\jdk1.8.0_162\jre\lib\ext\cldrdata.jar;E:\java\jdk1.8.0_162\jre\lib\ext\dnsns.jar;E:\java\jdk1.8.0_162\jre\lib\ext\jaccess.jar;E:\java\jdk1.8.0_162\jre\lib\ext\jfxrt.jar;E:\java\jdk1.8.0_162\jre\lib\ext\localedata.jar;E:\java\jdk1.8.0_162\jre\lib\ext\nashorn.jar;E:\java\jdk1.8.0_162\jre\lib\ext\sunec.jar;E:\java\jdk1.8.0_162\jre\lib\ext\sunjce_provider.jar;E:\java\jdk1.8.0_162\jre\lib\ext\sunmscapi.jar;E:\java\jdk1.8.0_162\jre\lib\ext\sunpkcs11.jar;E:\java\jdk1.8.0_162\jre\lib\ext\zipfs.jar;E:\java\jdk1.8.0_162\jre\lib\javaws.jar;E:\java\jdk1.8.0_162\jre\lib\jce.jar;E:\java\jdk1.8.0_162\jre\lib\jfr.jar;E:\java\jdk1.8.0_162\jre\lib\jfxswt.jar;E:\java\jdk1.8.0_162\jre\lib\jsse.jar;E:\java\jdk1.8.0_162\jre\lib\management-agent.jar;E:\java\jdk1.8.0_162\jre\lib\plugin.jar;E:\java\jdk1.8.0_162\jre\lib\resources.jar;E:\java\jdk1.8.0_162\jre\lib\rt.jar;E:\WorkSpaces\TestDemo\target\classes;E:\apache-maven-3.5.2\repo\org\springframework\spring-context\5.0.4.RELEASE\spring-context-5.0.4.RELEASE.jar;E:\apache-maven-3.5.2\repo\org\springframework\spring-beans\5.0.4.RELEASE\spring-beans-5.0.4.RELEASE.jar;E:\apache-maven-3.5.2\repo\org\springframework\spring-expression\5.0.4.RELEASE\spring-expression-5.0.4.RELEASE.jar;E:\apache-maven-3.5.2\repo\org\springframework\spring-core\5.0.4.RELEASE\spring-core-5.0.4.RELEASE.jar;E:\apache-maven-3.5.2\repo\org\springframework\spring-jcl\5.0.4.RELEASE\spring-jcl-5.0.4.RELEASE.jar;E:\apache-maven-3.5.2\repo\org\springframework\spring-aop\4.3.9.RELEASE\spring-aop-4.3.9.RELEASE.jar;E:\apache-maven-3.5.2\repo\org\aspectj\aspectjrt\1.6.11\aspectjrt-1.6.11.jar;E:\apache-maven-3.5.2\repo\org\aspectj\aspectjweaver\1.6.11\aspectjweaver-1.6.11.jar;E:\apache-maven-3.5.2\repo\cglib\cglib\2.1\cglib-2.1.jar;E:\apache-maven-3.5.2\repo\asm\asm\1.5.3\asm-1.5.3.jar;E:\apache-maven-3.5.2\repo\asm\asm-util\1.3.4\asm-util-1.3.4.jar;E:\apache-maven-3.5.2\repo\aspectwerkz\aspectwerkz-core\0.8.1\aspectwerkz-core-0.8.1.jar com.dyh.ioc.base.Test
二月 27, 2018 5:36:19 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
資訊: Refreshing org.spring[email protected]1ed6993a: startup date [Tue Feb 27 17:36:19 CST 2018]; root of context hierarchy
Before
After
Before
After
Before
start ......
123
Before
C
After
After

Process finished with exit code 0

初學spring,如有錯誤敬請留言斧正

相關推薦

Spring5.0.4 AOP 使用AspectJ方式自動代理註解(@EnableAspectJAutoProxy)

本文使用Maven建立的專案 pom.xml 檔案內容 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

spring aop自動代理註解配置失效問題及原理機制整理總結

迭代中遇到的問題處理 問題:用自動代理註解配置攔截了PlanService類的方法testAopFace,方法testAopFace被PlanService類的方法query呼叫。http請求controller後呼叫了方法query,aop對方法testAopFace

【框架】[Spring]AOP攔截-三種方式實現自動代理

這裡的自動代理,我講的是自動代理bean物件,其實就是在xml中讓我們不用配置代理工廠,也就是不用配置class為org.springframework.aop.framework.ProxyFactoryBean的bean。 總結了一下自己目前所學的知識

Spring的AOP自動代理(含AspectJAOP開發)

1.自動代理:  上面這兩種代理的方式不好,需要為每一個類配置一個獨立的ProxyFactoryBean.(如果需要代理的類特別的多,每個類都需要建立一個代理的類.) 根據切面Advisor的定

zabbix 4.0 客戶端服務器自動註冊和自動發現配置

proc sha auto dbd mar test ext -o zabb 一.Discovery 此種方法是由服務器端發起的,對服務端性能消耗大。 把內網地址寫進去 創建actions ?選擇Discovery創建自動發發現Linux的Actions,自動添加到指定

java中代理,靜態代理,動態代理以及spring aop代理方式,實現原理統一彙總 Spring中AOP的兩種代理方式(Java動態代理和CGLIB代理

若代理類在程式執行前就已經存在,那麼這種代理方式被成為 靜態代理 ,這種情況下的代理類通常都是我們在Java程式碼中定義的。 通常情況下, 靜態代理中的代理類和委託類會實現同一介面或是派生自相同的父類。 一、概述1. 什麼是代理我們大家都知道微商代理,簡單地說就是代替廠家賣商品,廠家“委託”代理為

Spring裡的aop實現方式和原始碼分析 java中代理,靜態代理,動態代理以及spring aop代理方式,實現原理統一彙總

使用"橫切"技術,AOP把軟體系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處基本相似,比如許可權認證、日誌、事務。AOP的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。

mysql8.0.4以後修改密碼方式變更

改密 detail blog 修改 host alter ges localhost spa https://blog.csdn.net/qq_38265784/article/details/80915098 use mysql; ALTER USER ‘root‘@‘l

springboot 1.5.2升級2.0.4 mongodb中QueryBuilder中DBObject被棄用,改為Document構造及解決方式

今天封裝mongo工具包,發現QueryBuilder中DBObject被棄用,改為Document構造。為什麼,我們稍微分析一下  Document實現Map,與基本的DBObject相比,可編寫的程式碼更少 DBObject雖然不被推薦,那些從2.x驅動程式系列可能繼續使用DB

AOPAspectJ方式異常通知

1 只有在切點報異常才能出發異常通知 2 在spring中AspectJ與scheme-base方式都提供了異常通知方法 3 實現步驟 3.1 新建類 public class MyThrowAdvice { public void throwMethod(E

Spring AOP面向切面程式設計詳解(基於XML方式 註解方式 注入Aspectj方式)

前言 AOP即面向切面程式設計,是一種程式設計思想,OOP的延續。在程式開發中主要用來解決一些系統層面上的問題,比如日誌,事務,許可權等等。在閱讀本文前希望您已經對Spring有一定的瞭解 注:在能對程式碼進行添加註解方式實現AOP的話,並不推薦使用XML方

Spring aop4)---aspectj

今天講一下Spring aop中的AspectJ: 一、AspectJ簡介 AspectJ是一個面向切面的框架,它擴充套件了Java語言。AspectJ定義了AOP語法,所以它有一個專門的編譯器 用來生成遵守Java字節編碼規範的Class檔案。 二、優勢: aspectj技術主

Spring Boot 學習之路——4 AOP註解方式實現列印日誌

前言:據XX統計,四分之一的程式碼都是日誌有關,日誌對於定位和解決問題尤為重要,以前公司的編碼規範中要求介面必須在日誌中記錄入參和返回值以及關鍵程式碼,引數部分完全可以用Spring的AOP——面向切面來實現。什麼叫AOP?百度:AOP(Aspect Oriented Pro

使用AspectJ需要匯入Spring AOPAspectj相關jar包,新版本Spring框架,建議使用AspectJ方式開發AOP

Spring JDBC是Spring提供的持久層技術簡化JDBC API開發,使用上和Apache公司的DBUtils框架非常類似匯入必要jar包到工程目錄匯入Spring核心開發包到建立工程spring-beans-3.2.0.RELEASE.jarspring-conte

Spring Boot2.0整合Mybatis(自動生成註解方式,多環境配置)

本介紹Spring Boot2.0整合Mybatis,通過MyBatis Generator外掛自動生成mapper的sql註解及Provider類的過程,支援多環境的yml配置檔案首先用IDE開發工具(IDEA,STS,Eclipse)建立一個Spring Boot工程sp

shiro 的整合許可權專案,利用SpringMVC aop 自動代理將系統必要監控操作寫入資料庫

1) 底層配置 通過配置織入@Aspectj切面 雖然可以通過程式設計的方式織入切面,但是一般情況下,我們還是使用spring的配置自動完成建立代理織入切面的工作。 通過aop名稱空間的宣告自動為spring容器中那些配置@aspectJ切面的bean建立

Spring AOP的兩種代理方式

Spring AOP是通過為目標物件建立代理來實現的。其使用的代理方式有兩種: JDK 動態代理 (目標物件實現了介面時使用,只會代理目標介面方法) CGLIB (當目標物件沒有實現介面時只能使用CGLIB ,當然可以通過配置強制有介面的物件也使用CGLIB

兩步實現virtualbox中ubuntu12.0.4開機自動掛載

我想實現主機和virtualbox中的虛擬機器共享資料夾,網上的很多資料顯示是修改/etc/fstab來實現,但是我按照這個方法來做的話,開機會提示An error ocurred while mou

Spring Mvc那點事---(30)Spring Mvc傳統AOP自動代理實現

        Spring 傳統AOP可以實現自動代理,不需要專門指定代理,可以在類生成的時候自動代理,有兩種方式實現自動代理,基於Bean名稱的自動代理 BeanNameAutoProxyCre

Spring學習筆記(十一)AOP註解方式cglib代理

JDK動態代理與CGLib動態代理均是實現Spring AOP的基礎,切點,切面,如何定義切點,前置、後置、放回、異常、環繞通知 1.切點、切面 紅色的地方就是切面,增加額外的功能 連線點+增加功能的位置 = 切點 2.專案結構