【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.mzph.cn/news/775244.shtml

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

相关文章

通过Appium和Xcode Accessibility Inspector获取iOS应用元素定位的方法

在 iOS 移动应用程序上使用选择器查找元素定位是我们在移动端 UI 自动化测试的先决条件。 但是&#xff0c;由于应用程序内容在原生 iOS 应用程序中的呈现方式&#xff0c;我们可以用来定位应用程序元素的选择器与 Web 浏览器元素有很大不同。 在本文中&#xff0c;我们将了解 …

wordcloud-1.9.2(1.9.3) for python 3.6/python3.X增强补丁

wordcloud-1.9.1开始无法在python3.6和海龟编辑器内正常使用&#xff0c;特做了一个whl 提供给python3.6使用。 另外我自己使用Python3.8 &#xff0c;因此wordcloud-1.9.2-cp36-cp36-win_amd64.whl 和wordcloud-1.9.3-cp38-cp38-win_amd64.whl&#xff0c;词云图上有前20个单…

未来制造:机器人行业新质生产力提升策略

机器人行业新质生产力提升咨询方案 一、机器人行业目前发展现状及特点&#xff1a; 创新活跃、应用广泛、成长性强。 二、机器人企业发展新质生产力面临的痛点&#xff1a; 1、高端人才匮乏 2、核心技术受限 3、竞争日益国际化 4、成本控制挑战 5、用户体验提升需求 三…

浅谈电商网络爬虫技术

摘 要 目前网络上存在着海量的数据资料&#xff0c;将这些数据爬取保存下来&#xff0c;并进行进一步操作&#xff0c;即可挖掘出数据的潜在价值。如今的互联网存在的缺陷是用户很难获得有用的数据资料&#xff0c;虽然传统的搜索引擎可以为用户返回大量信息&#xff0c;但是…

react native 使用ScrollView实现下拉更新,上拉加载更多

在React Native中&#xff0c;要实现下拉更新和上拉加载更多的功能&#xff0c;你需要自定义ScrollView组件&#xff0c;监听滚动事件并根据滚动的位置来判断何时触发更新和加载更多的操作。以下是一个基本的实现思路&#xff1a; 监听滚动事件&#xff1a;使用ScrollView的on…

PyTorch----torch.nn.init.kaiming_normal_

神经网络为什么要进行权重初始化&#xff1f; 神经网络进行权重初始化的目的在于促进网络的有效训练和收敛。正确的权重初始化可以帮助缓解梯度消失或梯度爆炸等问题&#xff0c;并且有助于加速训练过程。以下是权重初始化的几个重要原因&#xff1a; 1. **避免梯度消失或梯度…

设计模式之组合模式解析

组合模式 1&#xff09;概述 1.定义 组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。 组合模式对单个对象&#xff08;即叶子对象&#xff09;和组合对象&#xff08;即容器对象&#xff09;的使用具有一致性&#xff0c;组合模式又称为“整体—部分”(…

2024-03-27 问AI: 介绍一下深度学习中的 Darknet

文心一言 在深度学习中&#xff0c;Darknet是一个开源的神经网络框架&#xff0c;由Joseph Redmon开发&#xff0c;主要用于实现深度学习算法。它以其高效的实现和速度受到广泛关注&#xff0c;并在许多计算机视觉竞赛中取得了优异的结果。 Darknet的特点包括&#xff1a; 轻…

学习java第二十五天

a. IOC和DI是什么 控制反转IoC是一种设计思想&#xff0c;而依赖注入DI(Dependency Injection)是IOC的一种实现方法。一般来说&#xff0c;对象的创建源自程序本身&#xff0c;而IoC反转了这种模式&#xff0c;将创建对象的控制转移给了第三方&#xff08;用户&#xff09;。这…

SpringBoot整合Redis:缓存击穿--互斥锁解决

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

数字时代的风向标:Facebook如何引领社交媒体的发展方向

引言 在当今数字时代&#xff0c;社交媒体已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为其中的领军者&#xff0c;不仅影响着亿万用户的生活&#xff0c;也在塑造着整个社交媒体行业的发展方向。本文将深入探讨Facebook在数字时代的地位、影响力以及对社交媒…

3d放上模型为什么渲染不出来---模大狮模型网

如果在3D软件中放置模型后无法正确渲染出来&#xff0c;可能有几个常见的原因导致这种情况发生&#xff1a; 材质设置问题&#xff1a;确保所放置的模型具有正确的材质和纹理&#xff0c;并且材质设置正确。如果材质设置有误&#xff0c;可能会导致模型无法正确显示。 光照设置…

flink: 从pulsar中读取数据

一、依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

配置小程序的服务器域名

准备工作 拥有一个已注册的域名&#xff1a;确保您已经注册了一个符合国家和地区相关法律法规要求的域名。 完成域名备案&#xff08;如有必要&#xff09;&#xff1a;根据国家和地区的法律法规&#xff0c;某些情况下可能需要对域名进行备案才能用于互联网服务。 配置 DNS&…

Vue 二次封装组件的艺术与实践

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

备考ICA----Istio实验9---熔断Circuit Breaking 实验

备考ICA----Istio实验9—熔断Circuit Breaking 实验 1. 环境准备 创建httpbin环境 kubectl apply -f istio/samples/httpbin/httpbin.yaml kubectl get svc httpbin2. 创建测试用客户端 kubectl apply -f istio/samples/httpbin/sample-client/fortio-deploy.yaml3. 创建Ht…

python笔记进阶--模块、文件及IO操作(1)

目录 一&#xff0e;模块 1.模块的导入和使用 1.1导入整个模块 1.2导入函数 1.3使用as给模块指定别名 2.常见标准库 2.1 import random&#xff1a; 2.2 import math&#xff1a; 2.3正则表达式处理 2.4turtle 二&#xff0e;文件及IO操作 1.文件 1.1绝对路径与相…

Intellij IDEA 类注释模板设置

1、配置全局USER 在此配置全局USER&#xff0c;用于填充自动生成的注释中的作者author属性。 注释模板中的user参数是默认是获取系统的用户&#xff08;当然注释作者也可以直接写固定值&#xff09;&#xff0c;如果不想和系统用户用同一个信息&#xff0c;可以在IDEA中进行配…

【自我提升】一、Hyperledger Fabric 概念梳理

写在前面&#xff1a;最近因为业务需要&#xff0c;开始学习Hyperledger Fabric了&#xff0c;做java全栈工程师可真难搞。现在算是啥类型的都在涉及了&#xff0c;现在这个技术啥都不懂&#xff0c;就先开个学习专栏&#xff0c;记录记录。顺带也给各位道友参考参考。 目录 …

「媒体宣传」媒体邀约几种常见方法!-51媒体

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约的常见方法确实包括电话邀约、邮件邀约、社交媒体邀约以及通过媒体公关公司代邀约等。 电话邀约&#xff1a;这是一种直接且高效的方式&#xff0c;可以通过电话与媒体记者沟通&…