1. 程式人生 > >JAVA框架spring將通知織入目標物件

JAVA框架spring將通知織入目標物件

準備:

1導包,如圖:


2準備目標物件:我們這裡以一個service為例:

public class UserServiceImpl  {
	public void save() {
		System.out.println("儲存");
		//int i = 1/0;
	}

	public void delete() {
		System.out.println("刪除!");
	}

	public void update() {
		System.out.println("更新!");
	}

	public void find() {
		System.out.println("查詢");
	}
}

3,準備通知,程式碼:

import org.aspectj.lang.ProceedingJoinPoint;
public class MyAdvice {
//前通知
	public void before(){
		System.out.println("這是提前通知");
	}
	//之後通知
	public void afterReturning(){
		System.out.println("之後通知");
	}
	//環繞通知
	public Object around(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("環繞前通知");
		Object proceed = pjp.proceed();
		System.out.println("環繞後通知!");
		return proceed;
	}
	//異常通知
	public void afterException(){
		System.out.println("異常通知");
	}
	//之後通知,無視異常
	public void after(){
		System.out.println("之後通知,無視異常");
	}

4,配置xml檔案

在配置xml檔案之前,急著匯入aop約束(自查)

看程式碼:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">
<!-- 目標物件 -->
<bean name="user" class="com.fei.ServiceDemo.UserServiceImpl"></bean>
<!-- 通知物件 -->
<bean name = "myAdvice" class="com.fei.testaop.MyAdvice"></bean>
<!-- 配置切入點 -->

<aop:config>
<!-- 表示式
public void com.fei.ServiceDemo.UserServiceImpl.save()  public許可權的返回值為空的xx包下的save方法,空引數
* com.fei.ServiceDemo.UserServiceImpl.save(..) 預設許可權為public,返回值任意的xx包下的save方法,任意引數
* com.fei.ServiceDemo.UserServiceImpl.*(..)   預設許可權為public,返回值任意的xx包下的所有方法,任意引數
* com.fei.ServiceDemo.*ServiceImpl.*(..)   預設許可權為public,返回值任意的字尾為ServiceImpl包下的所有方法,任意引數
* com.fei.ServiceDemo..*ServiceImpl.*(..)   預設許可權為public,在ServiceDemo包及其子包下的,返回值任意的字尾為ServiceImpl包下的在所有方法,任意引數

 -->
 <!-- 下面是準備通知 -->
<aop:pointcut expression="execution(* com.fei.ServiceDemo.UserServiceImpl.*())" id="pc"/>
<aop:aspect ref="myAdvice">
<aop:before method="before" pointcut-ref="pc"/>
</aop:aspect>

</aop:config>
</beans>

程式碼中有解釋,這樣我們就配置好了,然後我們準備一個測試:

public class Demo1 {
	@Test
	public void test1() {
		ApplicationContext ac1 = new ClassPathXmlApplicationContext("applicationContext.xml");
			UserServiceImpl b=(UserServiceImpl)ac1.getBean("user1");
			b.save();
			System.out.println();					
	}
}

我們看結果:

這是提前通知
儲存

我們這裡用的用的是提前通知,其他通知一趟在xml配置,程式碼如下:

<aop:config>

<!-- 表示式 public void com.fei.ServiceDemo.UserServiceImpl.save() public許可權的返回值為空的xx包下的save方法,空引數 * com.fei.ServiceDemo.UserServiceImpl.save(..) 預設許可權為public,返回值任意的xx包下的save方法,任意引數 * com.fei.ServiceDemo.UserServiceImpl.*(..) 預設許可權為public,返回值任意的xx包下的所有方法,任意引數 * com.fei.ServiceDemo.*ServiceImpl.*(..) 預設許可權為public,返回值任意的字尾為ServiceImpl包下的所有方法,任意引數 * com.fei.ServiceDemo..*ServiceImpl.*(..) 預設許可權為public,在ServiceDemo包及其子包下的,返回值任意的字尾為ServiceImpl包下的在所有方法,任意引數 --> <aop:pointcut expression="execution(* com.fei.ServiceDemo.UserServiceImpl.*())" id="pc"/> <aop:aspect ref="myAdvice"> <!-- 提前通知 --> <aop:before method="before" pointcut-ref="pc"/> <!-- 之後通知 --> <aop:after method="after" pointcut-ref="pc"/> <!-- 環繞通知 --> <aop:around method="around" pointcut-ref="pc"/> <!-- 異常通知 --> <aop:after-throwing method="afterException" pointcut-ref="pc"/> <!-- 之後通知,異常會不通知 --> <aop:after-returning method="afterReturning" pointcut-ref="pc"/> <!-- 提前通知 --> </aop:aspect> </aop:config>

我們看結果:

這是提前通知
環繞前通知
儲存
之後通知
環繞後通知!
之後通知,無視異常

好,到這裡,spring的aop已經瞭解一些了。

相關推薦

JAVA框架spring通知目標物件

準備:1導包,如圖:2準備目標物件:我們這裡以一個service為例:public class UserServiceImpl { public void save() { System.out.println("儲存"); //int i = 1/0; }

java框架spring的依賴註初步理解

而是 理念 依賴 註入 屬於 程序設計 之前 調用 每次   java框架的spring作為整個工程的統領者,可以有效地管理各層的對象,有效的協調運行,當系統西藥重構時,可以極大地減少改寫代碼的量。   依賴註入和控制反轉屬於同一個概念,在java中當某個類(調用者)需要另

JAVA框架 Spring 依賴註

div 設置 color pack ssp getbean lap support .com 一:介紹 情景:我們在給程序分層的時候:web層、業務層、持久層,各個層之間會有依賴。比如說:業務層和持久層,業務層的代碼在調用持久層的時候,傳統方式:new 持久層類。 進而進行

JAVA框架 Spring 註解註

.html class IT soft pri 涵蓋 java 復制 掃描 一、首先需要引入jar包:spring-aop-4.2.4.RELEASE.jar。(在spring解壓包libs內)。 二、如果註解方式註入依賴的對象,需要引用新的約束。 內的:xsd-conf

Java框架spring Boot學習筆記(八):Spring相關概念

擴展 靜態 輕量級 想要 spring配置 核心 使用 oot 調用方法 Spring是開源、輕量級、一站式框架。 Spring核心主要兩部分 aop:面向切面編程,擴展功能不是修改源代碼實現 ioc:控制反轉,比如一個類,在類裏面有方法(不是靜態的方法),想要調用類

Java框架spring Boot學習筆記(十四):log4j介紹

inf alt 技術分享 images 使用 image 詳細 配置文件 -128 功能 日誌功能,通過log4j可以看到程序運行過程的詳細信息。 使用 導入log4j的jar包 復制log4j的配置文件,復制到src下面         3.設置日誌級別    

Java框架-Spring MVC理解001

welcome 如果 bean resource onf lang spa lan 檢測 Spring MVC理解 最近在讀一本《看透springMVC》的書,從了解到了一些更加精細系統的知識,邊讀變分享吧。 1.servlet--Spring MVC的本質 2.Sprin

Java框架-Spring MVC理解002-關聯源代碼

java 精華 -a lib info style png 搜索結果 優秀 Spring MVC-關聯源代碼 首先說一下我們為什麽要關聯源代碼:   其實,我覺得閱讀源碼是一個非常好的學習方式,在我們日常工作中或多或少都會接觸一些開源代碼,比如說最常用的非常流行的Strut

JAVA 框架-Spring-AOP面向切面

類型 .com fig cto assert onf con app urn AOP(Aspect Orient Programming),我們一般稱為面向方面(切面)編程,作為面向對象的一種補充,用於處理系統中分布於各個模塊的橫切關註點,比如事務管理、日誌、緩存等等。AO

Java框架-Spring的jdbc、連線池及事務管理

1. Spring的AOP程式設計 1.1 純xml程式設計 <!--通知配置型別--> <aop:config> <!--設定切面--> <aop:aspect ref="logger"> <!-

Java框架-Spring基於註解的IOC配置及純註解

註解配置與xml配置都實現了減低程式間耦合的功能。 不同公司由不同習慣,有可能是純xml、純註解(很少)或者xml與註解混合使用(基於註解的IOC配置)。 1. 基於註解的IOC配置 1.1 建立一個簡單案例 1.1.1 建立專案,新增依賴(pom.xml)

Java框架-Spring概念及純xml配置

1. 三層架構中的spring及spring概述 1.1 三層架構中的spring Spring框架對三層架構都有支援,dao提供支援(如JDBCTemplate)、service提供事務支援、web提供了springmvc框架支援等。 1.2 Spring的

Spring AOP @Aspect不生效,不執行前置增強@Before

想寫一個AOP,主要有2個用意,, 第一個用意是做後端的防表單重複提交的token驗證。 第二個用意是對後臺JSR303 Validator的校驗結果做一個統一處理,不想把對校驗結果的處理分散在每個controller方法中   @ResponseBody @Request

自己試驗在spring的環繞通知裡獲取目標物件的類名和目標方法的引數類名,用於根據自定義註解判斷訪問許可權,有沒有更好的辦法,高手指點一下

public Object doInBusiness(ProceedingJoinPoint pjp) throws Throwable{   Object[] args = pjp.getArgs();   Class[] argsClass = new Class[ar

Spring 請求引數封裝成物件

簡單描述:最近手裡的模組,前後臺之間需要傳遞很多的引數,使用封裝的PageData,來獲取請求引數的,作微服務遷移的時候,就涉及到需要把引數從pagedata裡取出來,一個一個的放到物件的屬性中。就很麻煩。後來老大在點評大家的程式碼的時候,就說了,這樣寫雖然能實現功能,但是效果很不好,體現不出java面向物件

反射3:利用java反射技術查詢結果封裝成物件

package cn.itcast.domain; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.PreparedStatement; import j

Spring AOP-通知-為目標方法多個切面

AOP-通知-為目標方法織入多個切面 開發中可能會遇到為目標方法織入多個切面,比如前置。後置通知都需要 介面 package com.hk.spring.aop06; public interface SomeService { publi

AOP 為目標方法多個通知

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSc

spring源碼導到eclipse中

所有 eas build clas ges neon 不同 路徑 系統變量 前置條件: 1. 正確安裝jdk,並配置好JAVA_HOME、PATH。(我這裏安裝的是jdk1.8) 2. 正確安裝好eclipse。(我的eclipse版本是: Neon Release (4.

Spring MVC框架數據庫內容前臺頁面顯示完整版【獲取數據庫人員參與的事件列表】

XML 獲取 utf-8 字段 eas jsp r.java 增刪 otp 1.書寫jsp頁面包括要顯示的內容【people.jsp】 <!-- 此處包括三個方面內容: 1.包含 文本輸入框 查詢按鈕 查詢結果顯示位置 (p