1. 程式人生 > >自己實現Spring AOP(一)環境搭建及知識準備

自己實現Spring AOP(一)環境搭建及知識準備

前言

這個專案是基於JSpring IoC的,所以在看下去之前,你要確保看過之前實現JSpring IoC的文章(這些文章在我的部落格分類JSpring IoC),不然也不看不出什麼意思來,就不用浪費時間往下看了。

在做這個專案的時候發生了一件有趣的事,我發現了JSpring IoC的一個Bug……,在 自己實現Spring IoC容器(四)IoC容器的Bug對這個Bug進行了介紹,也沒什麼,就是寫錯了一句程式碼。有趣的是我的那篇文章被推薦到了首頁!!

我真是不知道他們是以什麼標準推薦的,我覺得那篇文章真的是沒什麼出彩的地方。

啥也不說了,繼續擼起袖子幹吧

搭建環境

上面我說到這專案是基於JSpring IoC

的,所以我先把它給弄好。

  1. 新建一個Java Project,命名為JSpring AOP,我的工作空間字元編碼預設是UTF-8,所以你們Clone下來後亂碼的話就把專案字元編碼改成UTF-8
  2. JSpring-IoC的程式碼Clone或則Download下來。考慮到別人的IDE環境跟我的未必相同,所以在提交專案的時候我是忽略eclipse配置檔案如.project.classpath等檔案的,這樣子你就不能通過eclipse直接引入該工程了。所以你需要在你的IDE(可以是別的)新建一個工程,工程名隨意,然後將JSpring-IoC的程式碼拷貝到相應的位置。
  3. lib包下的jarBuild Path
  4. 刪除JSpring-IoC一些跟測試相關的東西,只保留功能程式碼。把原始碼檔案test刪掉,等下要再重新建立;刪除edu.jyu.bean包,這也是測試用到的;刪除applicationContext.xml中有關bean的配置,保留根標籤beans

上面4步就可以將環境搭建起來了。

現在還需要一些準備知識

知識準備

我要實現的是JSpring AOP,那麼你得有Spring AOP 的相關知識。

在Spring中如果目標物件實現了介面,預設情況下會採用JDK的動態代理實現AOP,如果目標物件沒有實現介面,必須採用CGLib(Code Generation Library)方式。

至於Spring AOP的一些使用方法,還不瞭解的還是去找本書來看吧

要實現的東西

我先用Spring傳統的AOP方式(即沒有用AspectJ)演示一個例子,搭建Spring環境什麼的我就在這介紹了,直接開幹

(1)先準備好目標物件相關類和介面

UserDao介面

package edu.jyu.dao;

public interface UserDao {
    public void add(String user);
}

UserDaoImpl類,實現了UserDao介面

package edu.jyu.dao;

public class UserDaoImpl implements UserDao{

    @Override
    public void add(String user) {
        System.out.println("add "+user);
    }
}

(2)編寫增強程式碼,即通知,在此定義一個前置通知,其實還有各種什麼後置通知環繞通知等東西,在這裡就不去介紹了,自己去了解吧。

package edu.jyu.advice;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class MyBeforeAdvice implements MethodBeforeAdvice {

    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("-----------前置通知-----------");
        System.out.println("方法:" + method.getName());
        System.out.println("引數" + args);
        System.out.println("目標物件" + target);
        System.out.println("-----------前置通知-----------");
    }

}

(3)編寫配置檔案applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 目標物件 -->
    <bean id="userDao" class="edu.jyu.dao.UserDaoImpl"></bean>

    <!-- 前置通知 -->
    <bean id="beforeAdvice" class="edu.jyu.advice.MyBeforeAdvice"></bean>

    <!-- 配置生成代理物件 -->
    <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 代理的目標物件 -->
        <property name="target" ref="userDao" />

        <!-- 代理要實現的介面 -->
        <property name="proxyInterfaces" value="edu.jyu.dao.UserDao" />

        <!-- 需要織入目標的通知 -->
        <property name="interceptorNames" value="beforeAdvice" />
    </bean>

</beans>

(4)編寫測試類

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

import edu.jyu.dao.UserDao;

public class TestProxy {

    @Test
    public void test() {
        ApplicationContext atx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        //注意這裡要獲取的是userDaoProxy不是userDao
        UserDao userDao = (UserDao) atx.getBean("userDaoProxy");
        userDao.add("Jason");
        System.out.println(userDao.getClass());
    }
}

執行結果

-----------前置通知-----------
方法:add
引數[Ljava.lang.Object;@64485a47
目標物件[email protected]
-----------前置通知-----------
add Jason
class com.sun.proxy.$Proxy4

可以看出執行順序是

  1. 執行前置通知MyBeforeAdvice中的before方法
  2. 執行目標物件中的add方法

最後輸出的是代理類。

到此一個,Spring AOP的例子就展示完畢,我自己實現的AOP功能就是仿造上面例子的,只不過進行了一些改動。

相關推薦

自己實現Spring AOP環境搭建知識準備

前言 這個專案是基於JSpring IoC的,所以在看下去之前,你要確保看過之前實現JSpring IoC的文章(這些文章在我的部落格分類JSpring IoC),不然也不看不出什麼意思來,就不用浪費時間往下看了。 在做這個專案的時候發生了一件有趣的事,我發

自己實現Spring AOPJDK代理實現AOP

前言 上一篇文章自己實現Spring AOP(一)環境搭建及知識準備,我搭建好了專案也寫了一個例子,接下來我就要實現這個例子中的AOP功能。 在Spring中如果目標物件實現了介面,預設情況下會採用JDK的動態代理實現AOP,如果目標物件沒有實現介面,必須採

Netty入門環境搭建使用

一、專案建立   在 Eclipse 中右鍵,新建->專案->Maven->Maven Project->下一步->選擇 quickstart      下一步->設定如圖(引數自取)      點選完成。    專案會自動建立

SpringBoot基本操作——環境搭建專案建立有demo

SpringBoot2.0筆記 本文使用idea工具構建Springboot2.0+SpringMvc+Thymeleaf+SpringDataJPA+MySql+Redis專案 此demo可直接下載執行,以下為具體建立專案過程步驟說明

AOP概述(什麼是AOP?)——Spring AOP

AOP概述–什麼是AOP 面向切面程式設計,能夠讓我們在不影響原有功能的前提下,為軟體橫向擴充套件功能 。AOP解決了OOP中遇到的一些問題,是OOP的延續和擴充套件。 什麼是橫向擴充套件? 軟體專案中的三層架構分為持久層,業務層和表示層。當我們處理一個任務時,是從表示

Spring AOP:概述

AOP:    AOP面向切面程式設計,相對於OOP面向物件程式設計。    AOP存在的目的是為了解耦。讓一組類共享相同的行為,在OOP中只能通過繼承類和實現介面,使得程式碼的耦合度增強,且類繼承只能為單繼承,阻礙更多行為新增到一組類上,AOP彌補了OOP的不足。Sprin

Spring Security技術棧開發企業級認證與授權環境搭建

Spring Security是一個能夠為基於Spring的企業應用系統提供宣告式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉Inversion of Contr

java學習 環境搭建、hello world的demo

環境變量 網上 類庫 .com java開發 www cnblogs rgs .class   本程序媛搞前端的,上班偶有空閑,不妨來學習學習,不然怎麽包養小白臉,走上人生巔峰?   說實話,每個語言都相通,有了javascript的基礎,並且有了兩三年跟java打交道的經

Linux 4.10.8 根文件系統制作---環境搭建

zxvf fstab project 根據 構建 yaffs http tar.bz2 onf 一、工具   制作工具為busybox   下載地址:https://busybox.net/   解壓:    二、制作文件系統   進入目錄,執行make menuconfi

MongoDB環境搭建與初始配置

dba 註意 管理員 開機自啟動 拓展 width 間接 face 環境搭建 前言   最近的項目中需要用到MongoDB,所這段時間需要學習知道怎麽去使用這個數據庫。   這裏我先簡單的介紹一下什麽是MongoDB,後面還會詳細的介紹:     MongoDB 是一

koa學習筆記環境安裝文件目錄

項目信息 ack 分享圖片 true ref 使用 tps blank hub koa是Nodejs的一個框架。通過koa的學習,我們可以對node快速上手。 1,環境準備 node v7.6+,可以用nvm或者n安裝指定版本的Node mysql 數據庫準備,

使用JAVA開發微信公眾平臺——環境搭建與開發接入

iges 微信平臺 校驗 後臺服務 結果 png 交互 package app 一、 初始微信公眾平臺 微信公眾平臺,即我們平時所說的“公眾號”,曾用名“官方平臺”、“媒體平臺”,但最終命名為&ldq

Python3與OpenCV3.3 圖像處理--環境搭建與簡單DEMO

http opencv3 opencv col lan pytho href tar .net https://blog.csdn.net/qq_32811489/article/details/78636049 https://blog.csdn.net/gangzhu

cpp學習環境搭建

方便 arm linux開發 箭頭 water RoCE 理解 eas 但是 想起我剛寫c++的時候,一把辛酸淚,還好有廣大碼友的幫助,最近時間充裕,整理一下學習c++的點滴,希望可以幫到剛入坑的朋友們。 一、 環境安裝一個優良的開發環境可以使學習更加順利,在熟練以

ctrl_c + ctrl_v 出來的四不像 -- 環境搭建

mysq 導入 技術分享 lob 解決 ear lang .sql ati 一、基礎環境   .net Core:https://www.microsoft.com/net/learn/dotnet/hello-world-tutorial   docker:https

準備環境搭建

參考 bsp ubun 真的 ins ubuntu16 感覺 samba 搭建 第一次接觸linux真的是有點小激動。linux真的很棒。寫下這個僅僅是作為以後參考。   環境安裝:   win7:     1. 用虛擬機安裝linux。我使用的是ubuntu16. 1

Python學習-環境搭建之PyCharm專業版漢化

Python學習(一)-環境搭建之PyCharm專業版漢化 1、找到lib所在安裝目錄 2、下載檔案 連結:https://pan.baidu.com/s/1B-Gw2F5zLTrWx7OCQNt87A 密碼:x10v 3、將下載好的resources_cn.jar放到li

Python學習-環境搭建之PyCharm專業版破解

PyCharm專業版破解 1、下載地址:https://www.jetbrains.com/pycharm/download/#section=windows 2、直接執行下載好的 3、選擇安裝路徑:E:\Pycharm\PyCharm 2018.2.4 4、根據電腦

Koa2學習環境搭建

Koa2學習(一)環境搭建 koa2腳手架 koa2服務安裝 koa2-generator目錄結構 什麼是 Koa2 koa 是由 Express 原班人馬打造的,致力於成為一個更小、更富有表現力、更健壯的 Web 框架。 使用 koa 編寫 web 應用,通過組合不

Jenkins+RF持續整合測試 環境搭建

通常在自動化測試中,我們需要對自動化測試用例定時構建,並生成報告並通過郵件發給指定的人。最佳工具選擇莫過於Jenkins了。通過Jenkins整合robot framework外掛,我們能非常方便的定時從git/svn上拉取最新的自動化測試用例,然後執行用例並把最終結果以測試報告的形式發給指定的人群。 下面