spring boot项目中设置默认的方法实现

在spring boot项目中,我要实现一个方法的默认实现和重构。

可以定义一个接口,这个接口中的方法是一个默认方法。我们可以直接通过匿名内部类,或者直接调用这个接口的默认实现类都可以。

但是现在,我的这个接口要交给spring进行管理,也就是说这个接口要是spring中的一个bean。

并且,当这个接口有自定义的实现类时,我们就使用自定义的实现类。当这个接口没有自定义的实现类时,我们就是用默认的实现类。

但是注意,不管是那种实现,都要求我们的实现类是spring中的一个bean。

我们可以使用Conditional注解有条件的去注入bean,这样就能保证不会出现相同的bean了。

复制代码
public interface TestIntface {

  default   String getDataVslue(String name,Integer age){
      System.out.println("默认方法的实现");
      return "name:"+name+" age:"+age;
  };
  
     String getMeaage(String param);
}

我们定义了一个接口,接下来我们要定义一个实现类去实现这个接口。

复制代码
// 当没有其他 TestIntface 实现时生效
public class TestIntfaceImpl implements TestIntface {
    
    @Override
    public String getMeaage(String param) {
        // 默认逻辑
        return "Default processing for: " + param;
    }

}

然后,我们,在使用ConditionalOnMissingBean注解去有条件的注入我们这个默认的bean实现。

复制代码
@Configuration
public class AutoConfig {

@Bean
@ConditionalOnMissingBean(TestIntface.class)
public TestIntface testIntface() {
        return new TestIntfaceImpl();
    }
}

这样,就能保证这个接口中的方法有一个默认的实现类,并且,当有其他的自定义实现时,我们这个默认的实现类会被覆盖掉。也同时能保证这个接口在spring的bean容器中,能够与其他bean进行交互。当然,如果,你这个接口不需要与其他的bean进行交互,就不需要这么麻烦了,直接使用匿名类把。

最后,说明一点,不能使用类级别的注解去定义我们的默认实现类,如:
@Component + @ConditionalOnMissingBean

这样会导致我们默认的实现类(bean)加载不到,原因是Spring Bean 加载顺序和条件注解的冲突导致。

Springboot 启动时首先扫描所有 @Component 注解的类 然后检查条件注解 最后创建 Bean 并注入依赖 。当扫描到 TestUserController时,需要注入 TestIntface bean,但是此时TestIntfaceImpl 还没有被判断是否应该创建 导致 Spring 认为没有 TestIntface 的实现。所以就会报错。

相关推荐
星恒随风8 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
金銀銅鐵8 小时前
带您看懂字节码指令(二):空循环里有什么
java·后端·ai编程
吴名氏.10 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
爱码少年10 小时前
Springboot下如何将CSV文件数据导入H2、Mysql数据库表
数据库·mysql·csv
.痞老板.11 小时前
java ee--多线程(进阶)
java·java-ee
可乐ea11 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
深入云栈12 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
Jackzhang12 小时前
[运维排障实录] 第一次遇到 502 别急着重启:按「一条线」把问题查清楚
spring boot
阿义有问题13 小时前
MySQL 迁移达梦全流程实战:DTS 七步图解 + 对象名全大写适配(附踩坑清单)
数据库
wang_shu_mo_ran14 小时前
MyBatis 从入门到进阶(一)
java·spring·mybatis