首页 > 其他分享 >关于Spring5新增的Indexed注解

关于Spring5新增的Indexed注解

时间:2024-02-01 18:56:34浏览次数:38  
标签:stereotype spring Component springframework org Indexed 注解 Spring5

前言

如果我们应用中使用@ComponentScan注解扫描的package包含的类很多的时候,Spring解析耗时就会很多,相应的应用启动时间也就更长,Spring 5.0 引入了一个新的注解@Indexed ,它可以为Spring的模式注解添加索引,以提升应用启动性能。

使用

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context-indexer</artifactId>
   <version>5.3.18</version>
</dependency>

注意,现在Spring中的Component注解上已经默认添加了Indexed注解

项目编译之后,会自动生成一个 META-INT/spring.components 文件,Spring 处理 ComponentScan 注解扫描时,会先读取此文件,而不会去实际的扫描 package,这样就加快了应用启动速度。

内容为

com.imooc.messagequeue.Application=org.springframework.stereotype.Component
com.imooc.messagequeue.config.RabbitMqConfig=org.springframework.stereotype.Component
com.imooc.messagequeue.config.WebConfig=org.springframework.stereotype.Component
com.imooc.messagequeue.service.RabbitMqOrderPayConsumer=org.springframework.stereotype.Component
com.imooc.messagequeue.service.RabbitMqSender=org.springframework.stereotype.Component
com.imooc.messagequeue.web.TestController=org.springframework.stereotype.Component

原理分析

  1. CandidateComponentsIndexer 是一个注解处理器,类似于lombok中的注解处理器,在编译时解析所有 class 文件,找到其中包含 Indexed 注解的类,并最终写入到 spring.components 文件中。
  2. CandidateComponentsIndexLoader 在应用启动时,会读取 spring.components 文件,封装为 CandidateComponentsIndex 对象,如果我们配置了 启动参数 -Dspring.index.ignore=true,就不会读取此文件。
  3. ClassPathScanningCandidateComponentProvider 在处理 ComponentScan 注解时,如果发现 CandidateComponentsIndex 对象存在(表示成功读取了 spring.components 文件),就会直接获取到扫描类信息,而不会再去实际扫描 package。

总结

此功能就是将原本在运行期的扫描工作提前到了编译期,以此来加快应用启动速度。

注意:spring.index.ignore=true 这个配置必须是启动参数的配置,而不是 application.yml 中配置,不然读取不到。

参考

SpringFramework5.0 @Indexed注解 简单解析

标签:stereotype,spring,Component,springframework,org,Indexed,注解,Spring5
From: https://www.cnblogs.com/strongmore/p/17973698

相关文章

  • 深入理解spring注解之@ComponentScan注解
    今天主要从以下几个方面来介绍一下@ComponentScan注解:@ComponentScan注解是什么@ComponentScan注解的详细使用 1,@ComponentScan注解是什么 其实很简单,@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中  2,@Compone......
  • springboot整合mybatis(纯注解版)
    springboot整合mybatis1、注解:参考表@ResponseBody:表示该方法的返回结果直接写入HTTPresponsebody中,一般在异步获取数据时使用,用于构建RESTful的api。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTPres......
  • 使用注解替换Spring配置文件&SpringMVC的配置文件
    创建初始化类,替换web.xml在Servlet3.0环境中,Web容器(Tomcat)会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebA......
  • SpringBoot自定义注解+反射实现 excel 导入的数据组装及字段校验
    本次给大家带来的SpringBoot中通过自定义注解+反射实现excel导入数据组装及字段校验的实现方式。这种实现方式其实是很普通、常规的方法,但很多同学在开发过程中,可能却不太容易想到他。当然我也是众多同学中的一员。1背景在前段时间的开发工作中,接手了一个很简单,很普通的开发任务。......
  • java反射获取类字段值以及注解描述
    publicstaticMap<String,String>getFieldNameAndDescriptionMap(Objectentity)throwsIllegalAccessException{Class<?>clazz=entity.getClass();Field[]fields=clazz.getDeclaredFields();//获取所有字段Map<String,String&g......
  • spring框架 - 通过 @Conditional注解来条件化地应用注解
    条件化地应用注解什么意思呢?参考chatGPT的回答:Spring框架允许您通过@Conditional注解来条件化地应用注解。@Conditional注解用于在特定条件下决定是否应用某个注解或配置。这在很多情况下是非常有用的,特别是在需要根据应用的运行时环境或配置来动态地选择性地应用某些注解......
  • MyBatis注解模式和优化
    MyBatis注解模式之前我们使用xml文件方式实现sql语句的编写,我们也可以使用注解模式编写sql语句。前面的基本配置一致,不再叙述。第一步:创建实体类根据数据库的列名与表名设计实体类数据库信息:(表名t_student)实体类:@Data@NoArgsConstructor@AllArgsConstructorpubliccla......
  • 注解@CrossOrigin详解
    转载自:https://blog.csdn.net/MobiusStrip/article/details/84849418文章目录注解@CrossOrigin一、跨域(CORS)支持:二、使用方法:1、controller配置CORS1.1、controller方法的CORS配置1.2、为整个controller启用@CrossOrigin1.3、同时使用controller和方法级别的C......
  • springBoot自定义参数注解
    springBoot自定义参数注解前置条件:新建一个springboot项目1.新建一个标记注解@Authimportjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/***@authorwa......
  • 注解
    @Override:用于重写方法的前面,例如只能写在fly的上面,不能写在classSon的上面,即使删掉了override,重写了还是重写了,不会受影响。 总结:1、@Override表示指定重写父类的方法(从编译层面验证),如果父类没有fly方法,则会报错2、如果不写@Override注解,而父类......