当前位置: 首页 > news >正文

@DeclareParents 注解实现接口功能增强:Spring中通过接口引入实现功能增强的完整示例

以下是Spring中通过接口引入实现功能增强的完整示例:

// 1. 目标接口及实现类
package com.example;

public interface Service {
    void doSomething();
}

@Component
class ServiceImp implements Service {
    @Override
    public 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",  // 目标bean
        defaultImpl = AuditLogImpl.class  // 实现类
    )
    private AuditLog auditLog; // 引入的接口类型

    // 定义接口实现类
    private static class AuditLogImpl implements AuditLog {
        @Override
        public void logAuditInfo() {
            System.out.println("记录审计日志信息");
        }
    }
}
// 4. Spring配置类
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    @Bean
    public 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的接口引入机制,在不修改原有代码结构的前提下,实现了:

  1. 功能增强的解耦
  2. 接口实现的动态绑定
  3. 代码的横向扩展能力
  4. 更清晰的模块化边界

相关文章:

  • 保存预测图像时出现的文件名错误
  • Python----机器学习(KNN:决策边界,决策边界计算,交叉验证步骤)
  • ansible介绍以及安装
  • C++练习
  • C# dataGridView 自动生成几行几列及手动输入整型字符
  • nginx https配置
  • 【算法】并查集基础讲解
  • 每日c/c++题 备战蓝桥杯(全排列问题)
  • DEEPSEEK创业项目推荐:
  • pytorch中不同的mask方法:masked_fill, masked_select, masked_scatter
  • MySQL 当中的锁
  • 网络运维学习笔记(DeepSeek优化版)026 OSPF vlink(Virtual Link,虚链路)配置详解
  • 深度学习 Deep Learning 第13章 线性因子模型
  • PyQt6实例_批量下载pdf工具_批量pdf网址获取
  • 3.30学习总结 Java包装类+高精度算法+查找算法
  • 开发环境解决Secure Cookie导致302重定向
  • VUE实现框架搭建(纯手写)
  • 【Python爬虫神器】requests库常用操作详解 ,附实战案例
  • RocketMQ - 从消息可靠传输谈高可用
  • Cookie可以存哪些指?
  • 深圳外贸营销型网站建设/百度seo网站优化 网络服务
  • 做儿童文学有哪些的网站/广告公司招聘
  • 在线网页转pdf/南宁seo外包靠谱吗
  • 做全屏的网站 一屛多高/营销类网站
  • wordpress插件使用数量/seo网络推广专员
  • 辽宁 政府网站信息内容建设/全球搜钻是什么公司