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

自定义BeanNameGenerator生成规则

通过点进ComponentScan注解进入源码可以看到

在这里插入图片描述

追随BeanNameGenerator进入源码可以看到该类是个借口且只有一个方法

在这里插入图片描述

点击上面黑色箭头出现两个实现方法在这里插入图片描述

点击第一个方法

在这里插入图片描述

进入determineBeanNameFromAnnotation方法中在这里插入图片描述

通过上诉自定义一个生成beanName方法

  • 先创建一个CustomeBeanNameGenerator类
  • 实现BeanNameGenerator接口
  • 重写generateBeanName方法
public class CustomeBeanNameGenerator implements BeanNameGenerator {@Overridepublic String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {//定义Bean的名称String beanName = null;//1.判断当前bean的定义信息是否是注解的if(definition instanceof AnnotatedBeanDefinition){//2.把definition转成注解的bean定义信息AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition)definition;//2.获取注解Bean定义的元信息AnnotationMetadata annotationMetadata = annotatedBeanDefinition.getMetadata();//3.获取定义信息中的所有注解Set<String> types = annotationMetadata.getAnnotationTypes();//4.遍历types集合for(String type : types){//5.得到注解的属性AnnotationAttributes attributes = AnnotationAttributes.fromMap(annotationMetadata.getAnnotationAttributes(type, false));//6.判断attributes是否为null,同时必须是@Component及其衍生注解if (attributes != null && isStereotypeWithNameValue(type, annotationMetadata.getMetaAnnotationTypes(type), attributes)) {//7.获取value属性的值Object value = attributes.get("value");//8.判断value属性是否为String类型if (value instanceof String) {String strVal = (String) value;//9.判断value属性是否有值if (StringUtils.hasLength(strVal)) {if (beanName != null && !strVal.equals(beanName)) {throw new IllegalStateException("Stereotype annotations suggest inconsistent " +"component names: '" + beanName + "' versus '" + strVal + "'");}beanName = strVal;}}}}}return beanName != null ? "my"+beanName : "my"+buildDefaultBeanName(definition);}private static final String COMPONENT_ANNOTATION_CLASSNAME = "org.springframework.stereotype.Component";private boolean isStereotypeWithNameValue(String annotationType,Set<String> metaAnnotationTypes, @Nullable Map<String, Object> attributes) {boolean isStereotype = annotationType.equals(COMPONENT_ANNOTATION_CLASSNAME) ||metaAnnotationTypes.contains(COMPONENT_ANNOTATION_CLASSNAME) ||annotationType.equals("javax.annotation.ManagedBean") ||annotationType.equals("javax.inject.Named");return (isStereotype && attributes != null && attributes.containsKey("value"));}private String buildDefaultBeanName(BeanDefinition definition) {String beanClassName = definition.getBeanClassName();Assert.state(beanClassName != null, "No bean class name set");String shortClassName = ClassUtils.getShortName(beanClassName);return Introspector.decapitalize(shortClassName);}
}

相关文章:

  • Mac清理电脑垃圾工具CleanMyMac X4.15中文免费版下载
  • javascript中的class基础入门(1)
  • Mybatis学习笔记:缓存(未完成)
  • 电子电器架构新趋势 —— 最佳着力点:域控制器
  • 【BUG 记录】史诗级 BUG - MYSQL 删库删表却没有备份如何恢复数据
  • DS注解作用
  • http状态,cookie、session、token的对比
  • COMSOL传热建模
  • etcd java 客户端jetcd库踩坑日志
  • 【HDFS】Decommision(退役) EC数据节点剩最后几个块卡住的问题
  • 超低功耗32位单片机MM32L0130
  • 【Android】隐藏settings中的二级菜单
  • 【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?
  • 【比较mybatis、lazy、sqltoy、mybatis-flex操作数据】操作批量新增、分页查询(二)
  • 计算机网络(2)-----数据链路层
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • JAVA并发编程--1.基础概念
  • Java面向对象及其三大特征
  • JSONP原理
  • js面向对象
  • Linux Process Manage
  • Python语法速览与机器学习开发环境搭建
  • Vim Clutch | 面向脚踏板编程……
  • WebSocket使用
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 探索 JS 中的模块化
  • Spring第一个helloWorld
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 容器镜像
  • 如何用纯 CSS 创作一个货车 loader
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (10)ATF MMU转换表
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (六)vue-router+UI组件库
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原)Matlab的svmtrain和svmclassify
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET 使用配置文件
  • .NET 中的轻量级线程安全
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @Query中countQuery的介绍
  • @SpringBootApplication 包含的三个注解及其含义
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网