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

Spring AOP 實戰全攻略:四種配置方式完整示範

     編輯:Java 相關知識

核心組件定義

// 目標介面
public interface Sleepable { void sleep(); }

// 目標實作
public class ChenLliNa implements Sleepable {
    public void sleep() { System.out.println("乖,該睡覺了!"); }
}

// 橫切關注點(增強)
public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {
    public void before(Method m, Object[] args, Object target) {
        System.out.println("睡覺前要敷面膜");
    }
    public void afterReturning(Object ret, Method m, Object[] args, Object target) {
        System.out.println("睡覺後要作美夢");
    }
}

四種 AOP 配置方式

1. ProxyFactoryBean 手動代理(Spring 1.x 風格)

<bean id="sleepHelper" class="...SleepHelper"/>
<bean id="lina" class="...ChenLliNa"/>
<bean id="sleepPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
    <property name="pattern" value=".*sleep"/>
</bean>
<bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
    <property name="advice" ref="sleepHelper"/>
    <property name="pointcut" ref="sleepPointcut"/>
</bean>
<bean id="linaProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref="lina"/>
    <property name="interceptorNames" value="sleepHelperAdvisor"/>
</bean>

2. DefaultAdvisorAutoProxyCreator 自動代理

<bean id="sleepHelper" class="...SleepHelper"/>
<bean id="lina" class="...ChenLliNa"/>
<bean id="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice" ref="sleepHelper"/>
    <property name="pattern" value=".*sleep"/>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

3. @AspectJ 註解模式

@Aspect @Component
public class SleepHelper03 {
    @Pointcut("execution(* *.sleep(..))") public void sleepPoint() {}
    @Before("sleepPoint()") public void beforeSleep() { System.out.println("睡覺前要敷面膜"); }
    @AfterReturning("sleepPoint()") public void afterSleep() { System.out.println("睡覺後要作美夢"); }
}
<context:component-scan base-package="com.tgb"/>
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="lina" class="...ChenLliNa"/>

4. XML Schema 配置(推薦,最簡潔)

<bean id="lina" class="...ChenLliNa"/>
<bean id="sleepHelper" class="...SleepHelper02"/> <!-- 純 POJO -->
<aop:config>
    <aop:aspect ref="sleepHelper">
        <aop:before method="beforeSleep" pointcut="execution(* *.sleep(..))"/>
        <aop:after method="afterSleep" pointcut="execution(* *.sleep(..))"/>
    </aop:aspect>
</aop:config>

測試驗證

四種配置對應的測試方法均從容器獲取 lina 或 linaProxy 呼叫 sleep(),輸出結果一致:

睡覺前要敷面膜
乖,該睡覺了!
睡覺後要作美夢

最佳實踐建議

  • 新專案優先使用 XML Schema(方式 4) 或 @AspectJ(方式 3),語意清晰、維護性佳。
  • 增強類建議設計為純 POJO(方式 4),不依賴 Spring API,便於單元測試與遷移。
  • 切入點表達式盡量精確,避免誤攔截非目標方法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved