自己實現Spring AOP(一)環境搭建及知識準備
前言
這個專案是基於JSpring IoC
的,所以在看下去之前,你要確保看過之前實現JSpring IoC
的文章(這些文章在我的部落格分類JSpring IoC
),不然也不看不出什麼意思來,就不用浪費時間往下看了。
在做這個專案的時候發生了一件有趣的事,我發現了JSpring IoC
的一個Bug……,在 自己實現Spring IoC容器(四)IoC容器的Bug對這個Bug進行了介紹,也沒什麼,就是寫錯了一句程式碼。有趣的是我的那篇文章被推薦到了首頁!!
我真是不知道他們是以什麼標準推薦的,我覺得那篇文章真的是沒什麼出彩的地方。
啥也不說了,繼續擼起袖子幹吧
搭建環境
上面我說到這專案是基於JSpring IoC
- 新建一個
Java Project
,命名為JSpring AOP
,我的工作空間字元編碼預設是UTF-8
,所以你們Clone下來後亂碼的話就把專案字元編碼改成UTF-8
。 - 把JSpring-IoC的程式碼Clone或則Download下來。考慮到別人的IDE環境跟我的未必相同,所以在提交專案的時候我是忽略eclipse配置檔案如
.project
和.classpath
等檔案的,這樣子你就不能通過eclipse直接引入該工程了。所以你需要在你的IDE(可以是別的)新建一個工程,工程名隨意,然後將JSpring-IoC
的程式碼拷貝到相應的位置。 - 將
lib
包下的jar
包Build Path
- 刪除
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
可以看出執行順序是
- 執行前置通知
MyBeforeAdvice
中的before
方法 - 執行目標物件中的
add
方法
最後輸出的是代理類。
到此一個,Spring AOP的例子就展示完畢,我自己實現的AOP功能就是仿造上面例子的,只不過進行了一些改動。
相關推薦
自己實現Spring AOP(一)環境搭建及知識準備
前言 這個專案是基於JSpring IoC的,所以在看下去之前,你要確保看過之前實現JSpring IoC的文章(這些文章在我的部落格分類JSpring IoC),不然也不看不出什麼意思來,就不用浪費時間往下看了。 在做這個專案的時候發生了一件有趣的事,我發
自己實現Spring AOP(二)JDK代理實現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上拉取最新的自動化測試用例,然後執行用例並把最終結果以測試報告的形式發給指定的人群。 下面