首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring AOP 框架核心原理與實戰:Advice、Pointcut、Advisor 三劍客

     編輯:Java 相關知識

AOP 核心三概念

  • Advice (通知):想注入的橫切邏輯代碼(如日誌、事務)。
  • Pointcut (切點):定義攔截位置(如某類的 public 方法)。
  • Advisor (通知器):將 Advice 與 Pointcut 組裝,指導織入。

實戰:Before Advice 示例

1. 定義 Advice

public class TestBeforeAdvice implements MethodBeforeAdvice {
    public void before(Method m, Object[] args, Object target) throws Throwable {
        System.out.println("Hello world! (by " + this.getClass().getName() + ")");
    }
}

三參數:目標方法、方法參數數組、目標對象引用。

2. 目標介面與實現

public interface Bean { void theMethod(); }
public class BeanImpl implements Bean {
    public void theMethod() {
        System.out.println(this.getClass().getName() + ".theMethod() says HELLO!");
    }
}

3. XML 配置裝配 (springconfig.xml)

<beans>
    <!-- 目標 Bean -->
    <bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/>

    <!-- Advice -->
    <bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/>

    <!-- Advisor: 正則切點 + Advice -->
    <bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice"><ref local="theBeforeAdvice"/></property>
        <property name="pattern"><value>com\.company\.springaop\.test\.Bean\.theMethod</value></property>
    </bean>

    <!-- ProxyFactoryBean 創建代理 -->
    <bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces"><value>com.company.springaop.test.Bean</value></property>
        <property name="target"><ref local="beanTarget"/></property>
        <property name="interceptorNames">
            <list><value>theAdvisor</value></list>
        </property>
    </bean>
</beans>

4. 客戶端測試

ApplicationContext ctx = new FileSystemXmlApplicationContext("springconfig.xml");
Bean bean = (Bean) ctx.getBean("bean");
bean.theMethod();

輸出:

Hello world! (by com.company.springaop.test.TestBeforeAdvice)
com.company.springaop.test.BeanImpl.theMethod() says HELLO!

核心機制

  • ProxyFactoryBean 生成實現 Bean 介面的 JDK 動態代理。
  • 代理內部維護攔截器鏈,按 interceptorNames 順序調用 Advisor。
  • RegexpMethodPointcutAdvisor 用正則匹配方法簽名,性能好、可讀性強。

優缺點總結

優點缺點
非侵入式、無需預編譯/字節碼增強文檔相對較少(郵件列表補充)
輕量級,可獨立於 J2EE 任何層使用僅支援方法級攔截,無字段/構造子攔截
團隊僅需少數人懂 AOP,其餘正常開發複雜切點表達需學習正則/AspectJ 語法
整合 Spring 生態(事務、DAO、Web MVC)

工具支援

Spring IDE (Eclipse 插件) 圖形化配置切點、通知、顧問,所見即所得。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved