【spring】@Component注解学习

@Component介绍

@Component 是 Spring 框架中的一个注解,用于将一个类标记为 Spring 上下文中的一个组件。当一个类被标记为 @Component 时,Spring 容器会在启动时自动扫描并实例化这个类,并将其注册到 Spring 上下文中。

@Component 注解可以用于任何类,包括控制器、服务、DAO 等。当一个类被标记为 @Component 时,它就成为了 Spring 上下文中的一个 bean,可以被其他 bean 通过依赖注入的方式使用。

除了 @Component 注解之外,Spring 框架还提供了其他一些类似的注解,例如 @Controller、@Service、@Repository 等,它们分别用于标记控制器、服务、DAO 等不同类型的组件。这些注解都是 @Component 的子注解,它们的作用和 @Component 类似,只是它们在 Spring 上下文中的作用域和生命周期可能会有所不同。

在 org.springframework.stereotype下还有这些:

@Component源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {String value() default "";
}
源代码截图

org.springframework.stereotype下其他源码
@Controller
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {@AliasFor(annotation = Component.class)String value() default "";}
@Repository
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {@AliasFor(annotation = Component.class)String value() default "";}
@Service
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {@AliasFor(annotation = Component.class)String value() default "";}
@Indexed
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Indexed {
}

@Component属性介绍

  • value:用于指定注入容器时Bean的id。如果没有指定Bean的id,默认值为当前类的名称。

@Component注解使用场景

  1. 自动组件扫描:当你使用@ComponentScan注解指定了扫描路径后,Spring会自动扫描这些路径下的类,并将所有带有@Component及其衍生注解(如@Service@Repository@Controller)的类注册为Spring容器中的Bean。这样做可以避免手动在XML配置文件中声明每一个Bean,从而简化了配置。

  2. 依赖注入@Component注解的类可以利用Spring的依赖注入机制。这意味着你可以在这些类中通过构造函数、Setter方法或者字段注入它们所依赖的其他Bean。

  3. 自定义Bean:开发者可以通过自定义注解来标记特定的组件。例如,如果你有一个@MyCustomComponent注解,你可以在配置类中声明这个注解,并将其与@Component注解一起使用,以便Spring容器能够识别并管理这些自定义组件。

  4. 条件化配置:通过结合@Conditional注解,@Component可以实现条件化的Bean创建。这意味着你可以根据不同的条件(如环境属性、系统属性等)来控制某些Bean是否被创建。

  5. 生命周期管理@Component注解的类可以利用Spring容器提供的生命周期管理功能。你可以实现InitializingBeanDisposableBean接口或者使用@PostConstruct@PreDestroy注解来自定义Bean的初始化和销毁过程。

  6. 服务层、数据访问层和控制器:虽然@Service@Repository@Controller都是@Component的特化,但它们各自用于标记不同的层次。@Service用于标记业务层组件,@Repository用于数据访问层(DAO)组件,而@Controller用于Web层的控制器。这种分层的标记有助于代码的组织和维护。

  7. 提高组件扫描效率:在Spring 5.0中引入的@Indexed元注解可以与@Component一起使用,用于在项目编译打包时生成META-INF/spring.components文件,建立索引,从而提高组件扫描效率,减少应用启动时间。

@Component测试示例代码

示例代码 一
ComponentDemo类
package com.yang.SpringTest.annotation.componentLearn;import org.springframework.stereotype.Component;/**** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.componentLearn* Ceate Time 2024-03-22 11:42*/
@Component
public class ComponentDemo {
}
ControllerDemo类
package com.yang.SpringTest.annotation.componentLearn;import org.springframework.stereotype.Controller;/*** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.componentLearn* Ceate Time 2024-03-22 11:41*/
@Controller
public class ControllerDemo {
}
RepositoryDemo类
package com.yang.SpringTest.annotation.componentLearn;import org.springframework.stereotype.Repository;/**** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.componentLearn* Ceate Time 2024-03-22 11:41*/
@Repository
public class RepositoryDemo {
}
ServiceDemo类
package com.yang.SpringTest.annotation.componentLearn;import org.springframework.stereotype.Service;/*** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.componentLearn* Ceate Time 2024-03-22 11:41*/
@Service
public class ServiceDemo {
}
ComponentConfig配置类
package com.yang.SpringTest.annotation.componentLearn;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;/*** 配置类** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.componentLearn* Ceate Time 2024-03-22 11:47*/
@Configuration
@ComponentScan(value = {"com.yang.SpringTest.annotation.componentLearn"})
public class ComponentConfig {
}
ComponentTest测试类
package com.yang.SpringTest.annotation.componentLearn;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Arrays;/*** <p>测试类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.componentLearn* Ceate Time 2024-03-22 11:48*/
public class ComponentTest {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ComponentConfig.class);String[] definitionNames = context.getBeanDefinitionNames();Arrays.stream(definitionNames).forEach((definitionName) -> System.out.println(definitionName));}
}
运行结果




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/285856.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集合深入------理解底层。

集合的使用 前提&#xff1a;栈、堆、二叉树、hashcode、toString()、quesalus()的知识深入和底层理解。 1、什么是集合 集合就是咋们所说的容器 ​ 前面我们学习过数组 数组也是容器 ​ 容器&#xff1a;装东西的 生活中有多少的容器呀? 水杯 教室 酒瓶 水库 只要是…

Mysql的存储引擎

目录 1.存储引擎概念 2.常用的存储引擎 2.1MyISAM 2.1.1MyISAM的特点 2.1.2MyISAM表支持3种不同的存储格式&#xff1a; 2.1.3MyISAM适用的生产场景举例 2.2InnoDB 2.2.1InnoDB特点介绍 2.2.2InnoDB适用生产场景分析 2.2.3InnoDB与MyISAM 区别 3.企业选择存储引擎依据…

C++ 扫描当前路径下文件并删除大文件

C 扫描当前路径下文件并删除大文件 C获取当前路径扫描文件路径下规定后缀名称的文件计算文件大小 1. 获取当前路径 使用<Windows.h>中的GetCurrentDirectory方法实现&#xff0c;单独编写验证程序如下&#xff1a; #include<iostream> #include<Windows.h&g…

Kotlin零基础入门到进阶实战

教程介绍 Kotlin现在是Google官方认定Android一级开发语言&#xff0c;与Java100%互通&#xff0c;并具备诸多Java尚不支持的新特性&#xff0c;每个Android程序员必备的Kotlin课程&#xff0c;每个Java程序员都需要了解的Kotlin&#xff0c;掌握kotlin可以开发Web前端、Web后…

pytorch中tensor类型转换的几个函数

目录 IntTensor转FloatTensor FloatTensor转IntTensor Tensor类型变为python的常规类型 IntTensor转FloatTensor .float函数&#xff1a; FloatTensor转IntTensor .int函数 Tensor类型变为python的常规类型 item函数

java项目将静态资源中的文件转为浏览器可访问的http地址

新增一个类叫啥无所谓&#xff0c;主要是实现 WebMvcConfigurer 加上注解 Configuration项目启动时加入bean中 只操作addResourceHandlers这一个方法 其他都没用 文章下方附带一个简易的上传图片代码 package cn.exam.config;import org.springframework.context.annotati…

STM32学习笔记(2)- 软件keil5安装和新建工程

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 软件安装…

​ 翻译 《The Old New Thing》

今天开始&#xff0c;为大家翻译微软优秀的技术专栏 The Old New Thing。 由微软高级工程师 Raymond Chen 撰写。该专栏起初是一个博客&#xff0c;后来也出版了同名书籍。专栏主要围绕 Windows 操作系统的开发和设计展开&#xff0c;涵盖了 Windows 平台的历史、技术细节、编程…

JMeter CSV 参数文件的使用方法

.在 JMeter 测试中&#xff0c;参数化是非常重要的&#xff0c;参数化允许我们模拟真实世界中的各种情况。本文我们将探讨如何在 JMeter 中使用 CSV 参数文件。 创建 CSV 文件 首先&#xff0c;我们需要创建一个逗号分隔的值&#xff08;CSV&#xff09;文件&#xff0c;其中…

http和socks5代理哪个好?

HTTP代理和SOCKS5代理各有其优缺点&#xff0c;但就隐蔽性而言&#xff0c;SOCKS5代理通常比HTTP代理更隐蔽。以下是它们的比较&#xff1a; HTTP代理&#xff1a; 透明性较高&#xff1a;HTTP代理在HTTP头中会透露原始客户端的IP地址&#xff0c;这使得它相对不太隐蔽。…

uni-app纵向步骤条

分享一下项目中自封装的步骤条&#xff0c;存个档~ 1. 话不多说&#xff0c;先看效果 2. 话还不多说&#xff0c;上代码 <template><!-- 获取一个数组&#xff0c;结构为[{nodeName:"流程发起"isAudit:falsetime:"2024-02-04 14:27:35"otherDat…

【Flink】Flink 处理函数之基本处理函数(一)

1. 处理函数介绍 流处理API&#xff0c;无论是基本的转换、聚合、还是复杂的窗口操作&#xff0c;都是基于DataStream进行转换的&#xff0c;所以统称为DataStreamAPI&#xff0c;这是Flink编程的核心。 但其实Flink为了更强大的表现力和易用性&#xff0c;Flink本身提供了多…

Qt程序可执行文件打包

目录 一、新建一个目录二、命令行2.1 添加临时变量2.2 打包命令 三、添加动态库四、普通 Qt 项目打包 Qml 项目打包 笔者写的python程序打包地址&#xff08;https://blog.csdn.net/qq_43700779/article/details/136994813&#xff09; 一、新建一个目录 新目录(例如test)用以…

Vue.js前端开发零基础教学(三)

目录 2.6 计算属性 2.7侦听器 2.8 样式绑定 2.8.1 绑定class属性 2.8.2 绑定style属性 2.9 阶段案例——学习计划表 2.6 计算属性 概念&#xff1a;Vue提供了计算属性来描述依赖响应式数据的复杂逻辑。 计算属性可以实时监听数据的变化&#xff0c;返回一个计算…

真假“长文本”,国产大模型混战

文&#xff5c;郝 鑫 Kimi有多火爆&#xff1f;凭一己之力搅乱A股和大模型圈。 Kimi概念股连日引爆资本市场&#xff0c;多个概念股随之涨停。在一片看好的态势中&#xff0c;谁都想来沾个边&#xff0c;据光锥智能不完全统计&#xff0c;目前&#xff0c;至少有包括读客…

【蓝桥杯知识点】浮点数二分(开n次方根再也不会超时啦!)

今天继续学习基础算法&#xff01;这篇文章介绍了二分的另一种应用——浮点数二分&#xff0c;可以用于开n次方根的计算&#xff0c;会使时间大大缩短&#xff01;我偷偷问过电脑编译器了&#xff0c;它说它喜欢优化过的算法哈哈哈哈~相信你也会喜欢的&#xff01; PS&#xff…

现代化应用部署工具-Docker

Docker 简介 什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上。 Docker部署的优势 通过使用Docker等容器技术&#xff0c;可以将应用程序及其依赖项…

构建品牌故事:Kompas.ai在叙事营销中的应用

引言 在数字化和全球化的浪潮中&#xff0c;品牌建设已经从单一的产品竞争演变为品牌故事的较量。叙事营销&#xff0c;作为一种通过讲述故事来传递品牌价值和理念的策略&#xff0c;已经成为连接品牌与消费者情感的桥梁。本文将深入探讨叙事营销的重要性&#xff0c;详细介绍K…

路由 (hash模式和history模式)

首先我们了解一下资源请求&#xff1a; 1.什么是资源 在浏览器需要某一个数据或文件进行解析或者浏览器在解析某个脚本的时候需要数据进行DOM渲染等工作&#xff0c;那么这个数据或文件就是浏览器的资源 2.资源怎么获取 浏览器的资源都必须通过资源请求的方式或从缓存中调出…

【Java程序设计】【C00371】基于(JavaWeb)Springboot的社区防疫物资申报系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…