【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));
    }
}

运行结果




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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

玩转云计算:教你在Akamai Linode上构建IT架构–定义项目

时至今日&#xff0c;选择以云计算方式来运维业务&#xff0c;已经成为大部分情况下的最优选。那么如果要从零开始开发一个新应用&#xff0c;并依托云平台来设计、开发、部害和远维&#xff0c;具体该从何处下手&#xff1f;这一系列文章将介绍如何基于Akamai Linode平台实现这…

Matlab基础入门

基础操作&#xff1a; matlab命令行操作&#xff1a; matlab可以使用命令行执行程序&#xff0c;例如下图运行后在右边工作区会产生响应的变量&#xff0c;如不写分号&#xff0c;则会直接运行。 clear命令&#xff1a;clear用于清除变量。clc命令&#xff1a;clc用于清屏。 m…

全球首位AI程序员诞生,技术革新还是职业威胁?

目录 导语&#xff1a; 一、2024年的第一丝凉意 二、AI在编程领域的应用现状 三、关于Devin的现状 四.未来展望 五.面对未来挑战&#xff0c;我们应该 结语&#xff1a; 导语&#xff1a; 时间回调到两周前的3月13号&#xff0c;世界上第一位AI程序员Devin诞生&#xff…

数据分析之POWER Piovt透视表分析与KPI设置

将几个数据表之间进行关联 生成数据透视表 超级透视表这里的字段包含子字段 这三个月份在前面的解决办法 1.选中这三个月份&#xff0c;鼠标可移动的时候移动到后面 2.在原数据进行修改 添加列获取月份&#xff0c;借助month的函数双击日期 选择月份这列----按列排序-----选择月…

C++类模板详解

在学习类模板之前可以了解一下函数模板&#xff0c;可以参考我的另一篇文章C函数模板详解&#xff08;结合代码&#xff09;-CSDN博客 讲解的比较详细&#xff0c;有助于理解类模板。 目录 1、什么是类模板&#xff1f; 2、类模板与函数模板区别 3、类模板对象做函数参数 …

STM32的SPI通信介绍

SPI简介 SPI:串行外设接口,与IIC一样都是通用数据总线。四根通信线&#xff1a;SCK&#xff0c;MOSI&#xff08;DO&#xff09;&#xff0c;MISO&#xff08;DI&#xff09;&#xff0c;SS。同步&#xff08;共用一根时钟线&#xff09;&#xff0c;全双工&#xff08;数据发…

怎么卸载Mybatis?(仅需三步)

解决办法如下&#xff1a; 第一步&#xff1a;选择文件→设置 第二步&#xff1a;找到插件→输入Mybatis找到这个标志 第三步&#xff1a;把这个勾勾取消掉&#xff0c;点击确定&#xff0c;就可以轻松卸载了

对AOP的理解

目录 一、为何需要AOP&#xff1f;1、从实际需求出发2、现有的技术能解决吗&#xff1f;3、AOP可以解决 二、如何实现AOP&#xff1f;1、基本使用2、更推荐的做法2.1 “基本使用”存在的隐患2.2 最佳实践2.2.1 参考Transactional&#xff08;通过AOP实现事务管理&#xff09;2.…

glibc内存管理ptmalloc - 实时打印bin链的变化

前言 在《glibc内存管理ptmalloc - largebin》中我们详细解释了 largebins共63个&#xff0c;并用表格点出了每个bin的size的范围largebin在free一些内存后的状态 特别是第2点&#xff0c;我其实不太满意&#xff0c;因为只有全部free后的一个结果&#xff0c;并没有中间状态…

LeetCode刷题---查询近30天活跃用户数

1.给出满足的条件&#xff0c;截止至2019-07-27的近30天 activity_date BETWEEN DATE_ADD(2019-07-27,INTERVAL -29 day) and 2019-07-27这里使用了Between and 函数和 Date_add函数 2.按照日期分组&#xff0c;统计活跃用户个数 select activity_date day,count(distinct(us…

《Attention Is All You Need》

参考&#xff1a; Attention Is All You Need 论文解读:Attention is All you need Transformer模型中的attention结构作用是什么&#xff1f; 如何最简单、通俗地理解Transformer&#xff1f; Transformer 新型神经网络&#xff0c;基于注意力机制 的 编码器-解码器 的序列处…

Windows服务器性能监控

Windows服务器操作系统设计用于运行在客户端-服务器架构内的服务器上&#xff0c;这些服务器通常设计用于处理繁重的工作负载&#xff0c;并作为企业中涉及的大多数软件操作的骨干。因此&#xff0c;为了防止由于性能问题而导致的任何服务损失并保持操作的无缝流&#xff0c;Wi…

STM32使用HAL库SPI驱动W25Q16 使用FATFS文件系统+USB虚拟U盘

概述 使用stm32F407驱动W25Q16&#xff0c;使用FATFS文件系统&#xff0c;USB虚拟优盘功能&#xff0c;W25Q16一共512个扇区&#xff0c;其中128作为flash存取相关数据&#xff0c;其他的384个扇区用作虚拟U盘使用 CubeMax配置过程 代码 W25Q16.c /***********************…

idea使用git笔记

1.创建分支和切换分支 创建分支 切换分支 2.把新创建的分支提交到远程服务器上&#xff08;注&#xff1a;如果没有提交的&#xff0c;随便找个文件修改再提交&#xff09; (1)切换到要提交的分支&#xff0c;add (2)commit (3)push 3.在自己分支修改代码及提交到自己的远…

What‘s new in PikiwiDB (Pika) v3.5.3 (正式版)

随着 Redis 宣布采用双协议以维护其商业利益&#xff0c;PikiwiDB (Pika) 社区非常荣幸地宣布之际&#xff0c;我们的最新 v3.5.3 正式生产可用版本现已发布。 v3.5.3 版本不仅修复了长期存在的 Bug&#xff0c;还引入了一系列新特性。这些新特性包括 Pika 对 ACL 的支持、移除…

USART发送单字节数据原理及程序实现

硬件接线&#xff1a; 显示屏的SCA接在B11&#xff0c;SCL接在B10&#xff0c;串口的RX连接A9&#xff0c;TX连接A10。 新建Serial.c和Serial.h文件 在Serial.c文件中&#xff0c;实现初始化函数&#xff0c;等需要的函数&#xff0c;首先对串口进行初始化&#xff0c;只需要…

@Value注解的使用方式

Value 注解用于从配置文件中获取特定的属性值&#xff0c;并注入到 Spring Bean 中。它有多种使用方式&#xff0c;下面列举了一些常见的用法&#xff1a; 先贴图&#xff1a; 1. 注入单个属性值 Component public class MyBean {Value("${my.property}")private S…

DVB-S系统仿真学习

DVB-S系统用于卫星电视信号传输&#xff0c;发送端框图如下所示 扰码 实际数字通信中&#xff0c;载荷数据的码元会出现长连0或长连1的情况&#xff0c;不利于接收端提取时钟信号&#xff0c;同时会使得数据流中含有大量的低频分量&#xff0c;使得QPSK调制器的相位长时间不变…

2024.3.25 QT

思维导图 作业&#xff1a;完善对话框&#xff0c;点击登录对话框 如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个0k按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面如果账号和密码不…

JAVA面试大全之JVM和调休篇

目录 1、类加载机制 1.1、类加载的生命周期&#xff1f; 1.2、类加载器的层次? 1.3、Class.forName()和ClassLoader.loadClass()区别? 1.4、JVM有哪些类加载机制&#xff1f; 2、内存结构 2.1、说说JVM内存整体的结构&#xff1f;线程私有还是共享的&#xff1f; 2.2…