跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Spring引入通知(Introduction Advice)
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Spring引入通知(Introduction Advice) = '''Spring引入通知'''(Introduction Advice)是Spring AOP(面向切面编程)中的一种特殊通知类型,它允许动态地为目标对象添加新的接口实现。与常规通知(如前置通知、后置通知等)不同,引入通知不是修改方法的行为,而是修改目标对象的类型结构。 == 核心概念 == 引入通知通过为目标类引入新的接口和默认实现,扩展了对象的功能。它在运行时动态地为对象添加新的方法,而无需修改原始类的代码。这种机制常用于以下场景: * 为对象添加监控或日志功能 * 实现混合(mixin)模式 * 动态添加横切关注点 === 技术原理 === Spring AOP使用JDK动态代理或CGLIB代理来实现引入通知: * 对于接口代理(JDK动态代理),引入通知会添加新的接口 * 对于类代理(CGLIB),引入通知会创建目标类的子类并实现新接口 == 语法与实现 == 引入通知需要通过`@DeclareParents`注解或XML配置来定义。 === 注解方式 === <syntaxhighlight lang="java"> public interface Monitorable { void setMonitorActive(boolean active); } public class DefaultMonitorable implements Monitorable { private boolean active; @Override public void setMonitorActive(boolean active) { this.active = active; } } @Aspect public class MonitoringIntroductionAspect { @DeclareParents(value="com.example.service.*+", defaultImpl=DefaultMonitorable.class) public static Monitorable mixin; } </syntaxhighlight> === XML配置方式 === <syntaxhighlight lang="xml"> <aop:config> <aop:aspect id="monitoringAspect" ref="monitoringIntroductionAspect"> <aop:declare-parents types-matching="com.example.service.*" implement-interface="com.example.Monitorable" default-impl="com.example.DefaultMonitorable"/> </aop:aspect> </aop:config> </syntaxhighlight> == 实际案例 == 考虑一个电商系统中的订单服务,我们想在不修改原始类的情况下为其添加审计功能: <syntaxhighlight lang="java"> // 原始服务类 public class OrderServiceImpl implements OrderService { public void createOrder(Order order) { // 业务逻辑 } } // 审计接口 public interface Auditable { void setAuditLogger(AuditLogger logger); void logAuditEvent(String event); } // 审计实现 public class DefaultAuditable implements Auditable { private AuditLogger auditLogger; public void setAuditLogger(AuditLogger logger) { this.auditLogger = logger; } public void logAuditEvent(String event) { if(auditLogger != null) { auditLogger.log(event); } } } // 引入切面 @Aspect public class AuditingIntroductionAspect { @DeclareParents(value="com.example.service.OrderServiceImpl", defaultImpl=DefaultAuditable.class) public static Auditable auditable; } // 使用示例 OrderService orderService = applicationContext.getBean(OrderService.class); ((Auditable)orderService).setAuditLogger(auditLogger); ((Auditable)orderService).logAuditEvent("Order created"); </syntaxhighlight> == 工作原理 == <mermaid> sequenceDiagram participant Client participant Proxy participant Target participant Introduction Client->>Proxy: 调用引入的方法 Proxy->>Introduction: 委托给引入实现 Introduction-->>Proxy: 返回结果 Proxy-->>Client: 返回结果 </mermaid> == 注意事项 == 1. 引入通知只能应用于Spring管理的bean 2. 引入的接口方法不能与目标类现有方法冲突 3. 性能考虑:引入通知会创建额外的代理对象 4. 与CGLIB代理一起使用时,目标类和方法不能是final的 == 数学表示 == 引入通知可以形式化表示为: <math> T' = T \cup \{I\} </math> 其中: * <math>T</math>是原始目标类 * <math>I</math>是新引入的接口 * <math>T'</math>是增强后的类 == 总结 == Spring引入通知提供了一种强大的AOP机制,可以在不修改源代码的情况下为现有类动态添加新功能。这种技术特别适合横切关注点的实现,如审计、监控等功能。理解引入通知的工作原理有助于设计更灵活、可扩展的应用程序架构。 [[Category:后端框架]] [[Category:Spring]] [[Category:Spring AOP]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)