解决springboot生成bean名称冲突(AnnotationBeanNameGenerator)

目录
  • springboot生成bean名称冲突
    • 问题描述
    • 解决问题
  • 自定义bean对象重名问题

springboot生成bean名称冲突

问题描述

我们再使用springboot的时候,在不同的文件目录下,可能存在相同名称的java类,这个时候会报bean name冲突错误

首先我们来了解下,springboot生成bean名称的原理

当Component,Respository,Service,Controller注解的value树形没有自定义时,会根据类的名称生成一个短的bean name。例如: com.xyz.FooServiceImpl -> fooServiceImpl

也就是说,会忽略路径,生成首字母小写的bean name,所以,上面哪种情况会导致冲突

但是由于我们平时编码的习惯,几乎避免了这个重名文件的存在,所以,没遇到过这个错误

解决问题

使用自定义AnnotationBeanNameGenerator

@SpringBootApplication
@RestController
@ComponentScan(nameGenerator = DatabasesApplication.SpringBeanNameGenerator.class)
public class DatabasesApplication {
    public static class SpringBeanNameGenerator extends AnnotationBeanNameGenerator {
        @Override
        protected String buildDefaultBeanName(BeanDefinition definition) {
            return definition.getBeanClassName();
        }
    }
    public static void main(String[] args) {
        SpringApplication.run(DatabasesApplication.class, args);
    }
    @GetMapping("/hello")
    public String hello(){
        return "hello databases!";
    }
}

我是在做springboot实现多数据源时还有个其他地方使用

MapperScan注解中使用

@MapperScan(basePackages = "com.databases.databases.dao.one", sqlSessionFactoryRef = "oneSqlSessionFactory",nameGenerator = DatabasesApplication.SpringBeanNameGenerator.class)

自定义bean对象重名问题

在已经有对象的情况下,设置bean加载的时候注意不要重名

不然启动不了,会给你提示在配置文件中添加spring.main.allow-bean-definition-overriding=true  这个东西的意思是当有重名bean的时候覆盖上一个,不建议使用,毕竟每个bean对象都是独特的

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决Spring Boot 多模块注入访问不到jar包中的Bean问题

    情景描述 一个聚合项目spring-security-tutorial,其中包括4个module,pom如下所示: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://mav

  • SpringBoot通过注解注入Bean的几种方式解析

    目录 1.背景 xml扫描包的方式 2.通过注解注入的一般形式 2.1.Bean类 2.2.Configuration类 2.3.Test类 3.通过构造方法注入Bean 3.1.Bean类 3.2.AnotherBean类 3.3.Configuration类 4.通过set方法注入Bean 4.1.MyBean类 4.2.Configuration类和Test类 5.通过属性去注入Bean 6.通过List注入Bean 6.1.MyBeanList类 6.2.MyConfiguration类

  • springboot-启动bean冲突的解决

    目录 启动bean冲突 启动提示bean重复问题 先说结论 原理 启动bean冲突 在一次启动中遇到了bean冲突的问题,提示存在两个名称重复的bean org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.test.api.Application]; nested exception is org.springframework.conte

  • springboot中如何判断某个bean是否存在

    目录 如何判断某个bean是否存在 使用@Bean的好处与坏处 如何判断某个bean是否存在 ApplicationContext ctx = SpringUtil.getContext(); String[] beanNames = ctx.getBeanDefinitionNames(); Arrays.sort(beanNames); for (String beanName : beanNames) { //全部bean System.out.println(beanName); } /

  • 解决springboot生成bean名称冲突(AnnotationBeanNameGenerator)

    目录 springboot生成bean名称冲突 问题描述 解决问题 自定义bean对象重名问题 springboot生成bean名称冲突 问题描述 我们再使用springboot的时候,在不同的文件目录下,可能存在相同名称的java类,这个时候会报bean name冲突错误 首先我们来了解下,springboot生成bean名称的原理 当Component,Respository,Service,Controller注解的value树形没有自定义时,会根据类的名称生成一个短的bean name.

  • PowerShell中运行CMD命令的技巧总结(解决名称冲突和特殊字符等问题)

    引言 我从老旧的 CMD.EXE 命令行换到优秀的 POWSERSHELL.EXE 已经有一段时间啦.您可能知道新的 Windows PowerShell 可以运行任何旧命令.不过有些旧命令的名称或语法可能会产生问题.但这都不是事儿. 麻烦 1:名称冲突 PowerShell 的 cmdlet 别名和旧命令的名称有冲突是个常见的问题.比如说您喜欢的服务控制命令 SC.EXE.SC.EXE 非常灵活!我能理解您为什么喜欢它(不要为用 NET.EXE 管理服务找借口).如果您想查看 SMB Serv

  • 详解关于spring bean名称命名的那些事

    目录 前言 02源码查看 01从main方法直接调试断点 02带着问题查看,靠猜加验证的方式 03源码验证 04总结 前言 用了多年spring,一直想当然把spring默认的beanName当成是类名的首字母小写,比如HelloService其beanName为helloService.直到有天对接了供方厂商的接口,他有个类形如ABService,于是用 getBean("aBService") 的方式获取bean,结果取到是null,一开始以为是ABservice没注入,后面采用

  • 如何正确控制springboot中bean的加载顺序小结篇

    1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功能. 在一般业务场景,可能你不大关心一个bean是如何被注册进spring容器的.只需要把需要注册进容器的bean声明为@Component即可,spring会自动扫描到这个Bean完成初始化并加载到spring上下文容器. 而当你在项目启动时需要提前做一个业务的初始化工作时,或者你正在开发某个中间

  • 解决springboot中配置过滤器以及可能出现的问题

    在springboot添加过滤器有两种方式: 1.通过创建FilterRegistrationBean的方式(建议使用此种方式,统一管理,且通过注解的方式若不是本地调试,如果在filter中需要增加cookie可能会存在写不进前端情况) 2.通过注解@WebFilter的方式 通过创建FilterRegistrationBean的方式创建多个filter以及设置执行顺序: 1.创建两个实现Filter接口的类TestFilter1 .TestFilter2 package com.aoxun.c

  • 解决springboot项目上传文件出现临时文件目录为空的问题

    最近写文件上传到服务器读取的代码,前端使用FormData上传,服务端用MultipartFile接收,自己测试了下MultipartFile对象有什么东西,结果一般属性都能出来,测试getInputStrea()方法的时候出现了以下错误,简单一看这是什么目录,从来没见过啊: 百度一番之后发现了这是临时文件存放的路径,不清楚根据什么去放在这个目录的,但是这个目录本机的确没有,linux系统下好像系统会10天清空一次,翻阅了API底下有这个 百度的时候也发现另外一个坑,spring配置的MaxIn

  • 解决SpringBoot webSocket 资源无法加载、tomcat启动报错的问题

    问题描述: 1. 项目集成WebSocket,且打包发布tomcat时出现websocket is already in CLOSING or CLOSE state这样的问题,建议参考"解决方法二",但是"解决方法一"请要了解查看 ,因为解决方法二是在一的基础上进行更正 2. 如果出现javax.websocket.server.ServerContainer not available这样的错误,请参考"解决方法一"中步骤3 解决方法一:(常

  • 解决Springboot项目启动后自动创建多表关联的数据库与表的方案

    熬夜写完,尚有不足,但仍在努力学习与总结中,而您的点赞与关注,是对我最大的鼓励! 在一些本地化项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表. 若要解决这类需求,其实现在已有不少开源框架都能实现自动生成数据库表,如mybatis plus.spring JPA等,但您是否有想过,若要自行构建一套更为复杂的表结构时,这种开源框架是否也能满足呢,若满足不了话,又该如何才能实现呢? 我在前面写过一篇 Activiti工作流学习笔记(

  • java集成开发SpringBoot生成接口文档示例实现

    目录 为什么要用Swagger ? Swagger集成 第一步: 引入依赖包 第二步:修改配置文件 第三步,配置API接口 Unable to infer base url For input string: "" Swagger美化 第一步: 引入依赖包 第二步:启用knife4j增强 Swagger参数分组 分组使用说明 1.在bean对象的属性里配置如下注释 2.在接口参数的时候加入组规则校验 小结 大家好,我是飘渺. SpringBoot老鸟系列的文章已经写了两篇,每篇的阅读反

  • 解决springboot引入swagger2不生效问题

    目录 问题描述: springboot引入swagger2的步骤: ①引入依赖 ②编写Swagger2的配置类 ③在controller中添加注解:按需添加注解 ④在model(pojo)上加注解,按需添加 一些注解的使用 今天遇到跟同事遇到一个由于失误导致的问题,也可以说比较难发现了.在此记录一下(我们用的springboot是2.0.3,swagger是2.2.2) 问题描述: swagger修改title,description等都不生效.并且启动springboot,没有有去加载swag

随机推荐