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
spring中aop的前值增強
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
spring中applicationContex.xml文件
span -name start resource oca default spa 文件 mapping <mvc:resources mapping="/js/**" location="/WEB_INF/js"/>主要用於靜態資源的訪問. 使用springM
Spring中Ordered接口簡介
tle r.js 意義 supported cnblogs 模式 instance val sub 前言 Spring中提供了一個Ordered接口。Ordered接口,顧名思義,就是用來排序的。 Spring是一個大量使用策略設計模式的框架,這意味著有很多相同接口的實現類
spring中InitializingBean接口使用理解
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
Spring中Bean的生命周期
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
Spring中property-placeholder的使用與解析
sso 標簽 code doc 就會 prot generator nconf tel Spring中property-placeholder的使用與解析 我們在基於spring開發應用的時候,一般都會將數據庫的配置放置在properties文件中. 代碼分析的時候,涉及的
Spring 中的IOC和DI
註入 機制 容器 返回 其他 工作 一個 請求 功能 IOC是一種叫做“控制反轉”的設計思想。 1、較淺的層次——從名字上解析 “控制”就是指對 對象的創建、維護、銷毀等生命周期的控制,這個過程一般是由我們的程序去主動控制的,如使用new關鍵字去創建一個對象(創建),在使用