首页 > 其他分享 >spring中的扫描机制

spring中的扫描机制

时间:2023-04-10 17:56:59浏览次数:30  
标签:spring BeanNameGenerator 扫描 ComponentScan bean nameGenerator 机制

背景

项目中出现,一个bean 在 @ComponentScan 注解的包下面却没有被扫描,并创建为bean的bug。所以需要了解spring的扫描机制。

原因以及源码位置

当项目里面有 resources/META-INF/spring.components 文件的时候,spring进入这个if判断 if (this.componentsIndex != null && indexSupportsIncludeFilters()), ,扫描机制的ComponentScan失效了

gh

当进入这个判断之后,spring就会只扫描 resources/META-INF/spring.components 文件 中的bean。所以其他的bean并不会被扫描进来。

spring中 ComponentScan 的 nameGenerator 属性

nameGenerator 用来指定 beanName的生成器

源码位置

// @ComponentScan 注解的 nameGenerator 属性  , beanName 生成器  
// Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;  
// 默认值 BeanNameGenerator.classClass<? extends BeanNameGenerator> generatorClass = componentScan.getClass("nameGenerator");  
boolean useInheritedGenerator = (BeanNameGenerator.class == generatorClass);

自定义beanName生成器例子


## 设置 ComponentScan 的 nameGenerator 属性
...
nameGenerator = CustomerBeanNameGenerator.class
...




public class CustomerBeanNameGenerator implements BeanNameGenerator {  
   @Override  
   public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {  
      // beanName 从 userService 变成了 customerPrefixcn.xiaosy.springdemo.scanner.service.UserService      
      return "customerPrefix" + definition.getBeanClassName();  
   }  
}

spring中的其他属性就不再举例子了。和这个的源码在同一个地方。

扫描机制中用到的asm技术

通过反射的方式获取类的元信息,会需要把所有的类都加载到 jvm 中去
所以用 ASM 技术
不用去加载类,用 ASM 解析类

后面会根据类的元信息等,来判断是否能成为一个候选bean

gh

标签:spring,BeanNameGenerator,扫描,ComponentScan,bean,nameGenerator,机制
From: https://www.cnblogs.com/xiaosiyuan88888888/p/17303740.html

相关文章

  • spring中bean的生命周期
    背景bean在创建过程中会出现各种各样的循环依赖。了解spring如何用三级缓存机制解决循环依赖,解决spring没有解决的循环依赖。所以需要了解bean的生命周期原理。出现属性的循环依赖时,bean的生命周期spring用三级缓存机制来解决属性的循环依赖。以UserService和OrderService......
  • spring中事务的原理
    背景spring在使用事务的时候会出现事务失效的情况。这里了解spring中事务原理,以及事务失效的原理和解决方案。原因spring中事务是基于AOP的,如果不是代理对象执行的话就不会有事务。比如,加上@Transactional的事务方法,是被包裹起来的。publicclassUserServiceProxyextends......
  • SpringMVC怎么实现web端上传超大文件
    ​ 一、功能性需求与非功能性需求要求操作便利,一次选择多个文件和文件夹进行上传;支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务......
  • 13-springcloud-eureka-9-Eureka集群注册中心打包发布
    在实际项目中,需要将Eureka发布到具体服务器上进行部署,打包部署其实和SpringBoot里面的一样,我们可以把其达成jar包,启动时对于properties文件,不同的环境激活不同的配置文件;运行:java-jarspringcloud-service-eureka.jar--spring.profiles.active=eureka8761java-jarspringclo......
  • 56、K8S-监控机制-Prometheus-配置解析、标签管理
    Kubernetes学习目录1、配置文件1.1、配置简介1.1.1、简介Prometheus可以通过命令行或者配置文件的方式对服务进行配置。一般情况下,命令行方式一般用于不可变的系统参数配置,例如存储位置、要保留在磁盘和内存中的数据量等;配置文件用于定义与数据动态获取相关的配置选项和文件......
  • 动力节点王鹤SpringBoot3笔记——第六章 远程访问@HttpExchange[SpringBoot 3]
    第六章 远程访问@HttpExchange[SpringBoot3]远程访问是开发的常用技术,一个应用能够访问其他应用的功能。SpringBoot提供了多种远程访问的技术。基于HTTP协议的远程访问是支付最广泛的。SpringBoot3提供了新的HTTP的访问能力,通过接口简化HTTP远程访问,类似Feign功能。Spring......
  • spring注解整合mybatis
    引入依赖<!--mybatis-spring与mybatis使用低版本适配--><!--https://mvnrepository.com/artifact/org.mybatis/mybatis-spring--><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version&......
  • Spring Security系列教程-初识Spring Security
    前言在开始学习SpringSecurity系列教程之前,小千先带大家来了解一下SpringSecurity,看看它到底是什么,有哪些功能,有什么特点,以及它与别的同类框架相比,有什么不同,我们以后学习任何一个新技术,其实都可以遵循"3W1H"法则,这样学习起来才能更有条理。一.SpringSecurity概念首先请各位跟......
  • 【Spring MVC】第一个程序
    添加Maven依赖:<!--spring核心类--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version></dependency>&......
  • MIT 6.5840 2023 Spring(6.824)LAB1:MapReduce
    MIT6.58402023Spring(6.824)LAB1:MapReduce前言本次lab主要是完成一个基于RPC远程调用的单机单文件系统的简单MapReduce框架,并完成单词计数任务。基于golang实现,单Master,多Worker。实现worker的奔溃恢复(FaultTorrance),通过超时重新执行实现。主要的任务有,RPC调用参数及返回参数......