1. 程式人生 > >Spring中的引介增強

Spring中的引介增強

(spring 3.x企業應用開發 第6章例項)

通過一個變數來開啟效能監視服務。

代理類

public interface Monitorable {
   void setMonitorActive(boolean active);
}
public class ControllablePerformaceMonitor	extends
			DelegatingIntroductionInterceptor implements Monitorable, Testable {
	
	/*
	 *  用於儲存效能監視開關
	 *  這個控制狀態使代理類變成了非執行緒安全的例項
	 *  它可以解決單例項的執行緒安全問題
	 */
	private ThreadLocal<Boolean> MonitorStatusMap = new ThreadLocal<Boolean>();
	
	public void setMonitorActive(boolean active) {
		MonitorStatusMap.set(active);
	}
	
	// 攔截目標類方法的呼叫
	public Object invoke(MethodInvocation mi) throws Throwable {
		Object obj = null;
		
		// 對於支援效能監視可控代理,通過判斷其狀態決定是否開啟效能監控功能
		if (MonitorStatusMap.get() != null && MonitorStatusMap.get()) {
			PerformanceMonitor.begin(mi.getClass().getName() + "." + mi.getMethod().getName());
			obj = super.invoke(mi);
			PerformanceMonitor.end();
		} else {
			obj = super.invoke(mi);
		}
		return obj;
	}

}

如上類如果不使用ThreadLocal類來解決執行緒安全問題,還可以配置為prototype,這樣當使用getBean()時會返回一個新的代理例項。但是CGLib建立新代理的花費太大,大大損耗效能。

完成了主要的代理,然後還需要配置,如下:

<bean id="pmonitor" class="com.baobaotao.introduce.ControllablePerformaceMonitor" />
	<bean id="forumServiceTarget" class="com.baobaotao.introduce.ForumService" />
	<!-- 
	    p:interfaces 引介增強所例項的介面 
	    p:target-ref 指定對哪個Bean進行代理
	    p:interceptorNames 需要植入目標物件的Bean列表 
	    p:proxyTargetClass 引介增強一定要通過建立子類來生成代理,所以需要強制使用CGLib代理
	-->
	<bean id="forumService" class="org.springframework.aop.framework.ProxyFactoryBean"
		p:interfaces="com.baobaotao.introduce.Monitorable" 
		p:target-ref="forumServiceTarget"
		p:interceptorNames="pmonitor" 
		p:proxyTargetClass="true" />

下面來實現目標類和增強類。

目標類

public class ForumService {
	public void removeTopic(int topicId) {
		System.out.println("模擬刪除Topic記錄:"+topicId);
	}

	public void removeForum(int forumId) {
		System.out.println("模擬刪除Forum記錄:"+forumId);
	}
}

增強類
public class PerformanceMonitor {
	private static ThreadLocal<MethodPerformace> performaceRecord = new ThreadLocal<MethodPerformace>();

	public static void begin(String method) {
		System.out.println("begin monitor...");
		MethodPerformace mp = performaceRecord.get();
		if (mp == null) {
			mp = new MethodPerformace(method);
			performaceRecord.set(mp);
		} else {
			mp.reset(method);
		}
	}

	public static void end() {
		System.out.println("end monitor...");
		MethodPerformace mp = performaceRecord.get();
		mp.printPerformace();
	}
}

如上需要注意,增強類的方法有static修飾。所以會產生執行緒問題,需要使用ThreadLocal變數來解決。

測試如下:
String configPath = "com/baobaotao/introduce/beans.xml";
		ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
		
        ForumService forumService = (ForumService)ctx.getBean("forumService");
        forumService.removeForum(10);
        forumService.removeTopic(1022);
        
        Monitorable moniterable = (Monitorable)forumService;
        moniterable.setMonitorActive(true);
        forumService.removeForum(10);
        forumService.removeTopic(1022); 

結果如下:
模擬刪除Forum記錄:10
模擬刪除Topic記錄:1022
begin monitor...
模擬刪除Forum記錄:10
end monitor...
org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.removeForum花費1毫秒。
begin monitor...
模擬刪除Topic記錄:1022
end monitor...
org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.removeTopic花費0毫秒。






















相關推薦

Spring增強型別

Spring通過增強型別定義橫切邏輯,同時由於Spring只支援方法連線點,增強還包括了在方法的哪一點加入橫切程式碼的方位資訊,所以增強既包括橫切邏輯,還包括部分連線點的資訊。 增強包括以下幾類: 前置增強:org.springframework.aop.

Spring引介增強

(spring 3.x企業應用開發 第6章例項)通過一個變數來開啟效能監視服務。代理類public interface Monitorable { void setMonitorActive(boolean active); }public class Controll

Spring的異常增強

alt class ring 分享 ssp service eight getbean str 接口:/** * 接口 * Created by Administrator on 2017/10/7. */public interface ISomeService {

Spring(七)Spring的四種增強和顧問

print .com ima stack schema reflect 環繞增強 ace classpath Spring中的四種增強有那四種? 前置增強 後置增強 環繞增強 異常增強 先編寫接口和實體類 ISomeService和SomeServiceImpl

spring引介增強定時器例項:無侵入式動態增強類功能

引介增強例項需求在前面我們已經提到了前置、後置、環繞、最終、異常等增強形式,它們的增強物件都是針對方法級別的,而引介增強,則是對類級別的增強,我們可以通過引介增強為目標類新增新的屬性和方法,更為誘人的是,這些新屬性或方法是可以根據我們業務邏輯需求而動態變化的。怎

Spring AOP增強器&切點&通知

類圖 增強器 切點 通知 在增強其中定義了切點Pointcut,通知父類Advice 關係: spring代理類實現了處理器,bean建立時解析增強器,增強器根據包含的切點和通知生成該bean的代理類 程式設計方式定義AOP

spring aop 004: 引介增強

package com.thereisnospon.spring.demo.course.imp.c004_aop; import org.aspectj.lang.annotation.Aspect

springaop的前值增強

join 分享圖片 start ide ssp obj 並且 sys 連接點 Spring AOP的幾個概念 1.切面(Aspect):切面就是一個關註點的模塊化,如事務管理、日誌管理、權限管理等; 2.連接點(Joinpoint):程序執行時的某個特定的點,在Sprin

Spring使用Map、Set、List、數組、屬性集合的註入方法配置文件

查看 main list highlight 配置 spring配置 pla lec while (1)下邊的一個Java類包含了所有Map、Set、List、數組、屬性集合等這些容器,主要用於演示spring的註入配置; [java] view plain c

springapplicationContex.xml文件

span -name start resource oca default spa 文件 mapping <mvc:resources mapping="/js/**" location="/WEB_INF/js"/>主要用於靜態資源的訪問. 使用springM

SpringOrdered接口簡介

tle r.js 意義 supported cnblogs 模式 instance val sub 前言 Spring中提供了一個Ordered接口。Ordered接口,顧名思義,就是用來排序的。 Spring是一個大量使用策略設計模式的框架,這意味著有很多相同接口的實現類

springInitializingBean接口使用理解

path 問題: .get itme tex protected 測試程序 其中 tin   InitializingBean接口為bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是繼承該接口的類,在初始化bean的時候會執行該方法。測試

spring <bean>的id 和name 的區分

lifecycle 文件中 空格 當前 基本類 分號 推薦 第一個 沖突 1. id 和name 屬性作用上一樣,推薦使用id; 2. id取值要求嚴格些,必須滿足XML的命名規範。id是唯一的,配置文件中不允許出現兩個id相同的<bean>。 3. name取

spring構造函數註入

port package .class code ack 一個 price org stat spring中構造函數註入,簡單來說,就是通過beans.xml中,設置對應的值。而且通過bean類中的構造函數進行註入這些值。 文件結構 Goods類 package c

Spring使用屬性文件properties的兩種方式

文件 location 郵件發送 class mave red onf 路徑 文件內容 實際項目中,通常將可配置的參數放到屬性文件中,例如數據庫連接信息、redis連接信息等,便於統一管理。然後通過IoC框架spring將其加載到上下文中,使得程序可以直接使用。 創建mys

SpringBean的生命周期

spring bean生命周期 Spring 容器中的 Bean 是有生命周期的,Spring 允許在 Bean 在初始化完成後以及 Bean 銷毀前執行特定的操作,常用的設定方式有以下三種: (1)通過 <bean> 元素的 init-method/destroy-

Spring使用Log4j記錄日誌

() 歸檔 msg 含義 多個 appenders policy rop git 以下內容引用自http://wiki.jikexueyuan.com/project/spring/logging-with-log4j.html: 例子: pom.xml: <

spring操作mysql數據庫

lose jar sna mark 操作mysql red 分享 wordpress rac 就是在spring中,對mysql數據庫進行增刪改查的樣例,很easy。 文件結構 maven的pom.xml文件,裏面用到的幾個很重要的jar包都有 <pro

Springproperty-placeholder的使用與解析

sso 標簽 code doc 就會 prot generator nconf tel Spring中property-placeholder的使用與解析 我們在基於spring開發應用的時候,一般都會將數據庫的配置放置在properties文件中. 代碼分析的時候,涉及的

Spring 的IOC和DI

註入 機制 容器 返回 其他 工作 一個 請求 功能 IOC是一種叫做“控制反轉”的設計思想。 1、較淺的層次——從名字上解析 “控制”就是指對 對象的創建、維護、銷毀等生命周期的控制,這個過程一般是由我們的程序去主動控制的,如使用new關鍵字去創建一個對象(創建),在使用