以下是Spring中通過接口引入實現功能增強的完整示例:
// 1. 目標接口及實現類
package com.example;public interface Service {void doSomething();
}@Component
class ServiceImp implements Service {@Overridepublic void doSomething() {System.out.println("執行核心業務邏輯");}
}
// 2. 要引入的新接口
package com.example;public interface AuditLog {void logAuditInfo();
}
// 3. 切面實現類
package com.example;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Aspect
@Component
public class AuditAspect {// 使用@DeclareParents聲明引入關系@DeclareParents(value = "com.example.ServiceImp", // 目標beandefaultImpl = AuditLogImpl.class // 實現類)private AuditLog auditLog; // 引入的接口類型// 定義接口實現類private static class AuditLogImpl implements AuditLog {@Overridepublic void logAuditInfo() {System.out.println("記錄審計日志信息");}}
}
// 4. Spring配置類
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {@Beanpublic ServiceImp serviceImp() {return new ServiceImp();}
}
// 5. 測試類
public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);Service service = context.getBean(ServiceImp.class);// 強轉為引入的接口AuditLog auditLog = (AuditLog) service;service.doSomething(); // 執行原有功能auditLog.logAuditInfo(); // 調用增強功能}
}
輸出結果:
執行核心業務邏輯
記錄審計日志信息
關鍵點總結表格:
特性 | 說明 |
---|---|
@DeclareParents | 聲明接口引入關系,通過value 指定目標bean,defaultImpl 指定實現類 |
接口實現類 | 需要作為內部類或靜態類實現引入的接口 |
動態類型轉換 | 目標bean在運行時會自動具備引入接口的類型,可通過強制類型轉換調用方法 |
作用范圍 | 僅對聲明時指定的bean生效 |
依賴配置 | 需要開啟AOP代理(@EnableAspectJAutoProxy ) |
該方案通過AOP的接口引入機制,在不修改原有代碼結構的前提下,實現了:
- 功能增強的解耦
- 接口實現的動態綁定
- 代碼的橫向擴展能力
- 更清晰的模塊化邊界