@Component 注解高端玩法【策略模式】

news2024/9/28 19:26:01

优质博文:IT-BLOG-CN

在这里插入图片描述

Spring框架中,@Component注解本身并不支持直接通过注解参数来定义一个key值。不过,你可以通过自定义注解和@Qualifier注解来实现类似的功能。

以下是一个示例,展示如何通过自定义注解和@Qualifier来实现将不同的实现类注入到Map中,并为每个实现类定义不同的key值。

一、定义接口和实现类

首先,定义一个接口和它的多个实现类。

MyService.java

public interface MyService {
    void execute();
}

MyServiceImpl1.java

import org.springframework.stereotype.Component;

@Component("service1")
public class MyServiceImpl1 implements MyService {
    @Override
    public void execute() {
        System.out.println("Executing MyServiceImpl1");
    }
}

MyServiceImpl2.java

import org.springframework.stereotype.Component;

@Component("service2")
public class MyServiceImpl2 implements MyService {
    @Override
    public void execute() {
        System.out.println("Executing MyServiceImpl2");
    }
}

自动注入所有实现类到Map

接下来,在需要使用这些实现类的地方,使用@Autowired注解和一个 Map<String, MyService>来自动注入所有实现类。

MyServiceConsumer.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class MyServiceConsumer {

    @Autowired
    private Map<String, MyService> myServices;

    public void executeAll() {
        for (Map.Entry<String, MyService> entry : myServices.entrySet()) {
            System.out.println("Executing service with key: " + entry.getKey());
            entry.getValue().execute();
        }
    }
}

当我们可以拿到一个Map的时候,就可以根据客户端传递过来的key获取到对应的实现类进行处理了。

自动注入所有实现类List 接下来,在需要使用这些实现类的地方,使用@Autowired注解和一个ListMap来自动注入所有实现类。

MyServiceConsumer.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class MyServiceConsumer {
    @Autowired
    private final List<MyService> myServices;

    public void executeAll() {
        for (MyService myService : myServices) {
            myService.execute();
        }
    }
}

最后,配置Spring应用程序上下文并执行所得实现类。

Application.java

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {
            MyServiceConsumer myServiceConsumer = ctx.getBean(MyServiceConsumer.class);
            myServiceConsumer.executeAll();
        };
    }
}

二、@Component 和 @Qualifier 区别

Spring框架中,@Qualifier@Component是两个常用的注解,但它们有不同的用途和作用。

【1】@Component @Component是一个通用的Spring组件注解。它用于将一个类标记为Spring的组件,使其能够被Spring容器自动检测和注册为一个Bean。这个注解通常用于那些没有特定角色的类。

示例:

import org.springframework.stereotype.Component;

@Component
public class MyService {
    // 业务逻辑
}

Spring扫描类路径时,带有@Component注解的类会被自动注册为Spring容器中的Bean

【2】@Qualifier @Qualifier注解通常与@Autowired注解一起使用,用于消除Bean注入时的歧义。当有多个相同类型的Bean可供注入时,@Qualifier可以指定要注入的具体Bean

示例:假设我们有两个实现了相同接口的类:

import org.springframework.stereotype.Component;

@Component
public class ServiceA implements MyService {
    // 实现
}

@Component
public class ServiceB implements MyService {
    // 实现
}
import org.springframework.stereotype.Component;

如果我们在某个地方自动注入MyService,会产生歧义:

@Autowired
private MyService myService; // Spring 不知道注入 ServiceA 还是 ServiceB

这时,我们可以使用@Qualifier来指定具体的Bean

@Autowired
@Qualifier("serviceA")
private MyService myService; // 明确指定注入 ServiceA

在这个例子中,"serviceA"ServiceA类的默认Bean名称(类名首字母小写)。

三、源码

Component注解的源码实现主要涉及到两个方面:自动扫描和注册。

首先,Spring框架通过类路径扫描机制自动扫描带有Component注解的类。这是通过使用Java的反射机制实现的。下面是Component注解的简化源码示例:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Component {

}

@Component注解的元注解中,@Retention注解表示Component注解的生命周期为运行时;@Target注解表示Component注解可以标记在类上。

接下来,Spring框架通过BeanDefinition对象将扫描到的类注册到Spring容器中。BeanDefinition包含了类的一些元数据信息,如类名、类的全限定名、类的父类、类实现的接口等。下面是BeanDefinition的简化源码示例:

public interface BeanDefinition {

    String getBeanName();

    String getBeanClassName();

    Class<?> getBeanClass();

    Class<?>[] getInterfaces();

    Class<?> getSuperClass();

    // ...省略其他方法
}

Spring框架通过解析Component注解,将扫描到的类封装成BeanDefinition对象,并将其注册到BeanFactory中。BeanFactorySpring容器的核心接口,可以通过该接口获取和管理BeanDefinition对象。

Component注解的解析和注册过程一般在Spring容器启动时进行。Spring框架会扫描指定的包路径下的所有类,并解析其中的Component注解,将其注册为BeanDefinition对象。开发者可以通过配置文件指定要扫描的包路径,也可以使用@ComponentScan注解指定扫描范围。

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

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

相关文章

芯片行业ERP相比于传统ERP到底有什么区别

在数字化发展时代&#xff0c;ERP系统已成为企业管理和运营的重要工具。然而&#xff0c;在高度正规化的芯片行业中&#xff0c;传统ERP系统往往难以满足其独特的业务需求。本文将带大家一起来探讨芯片行业ERP与传统ERP之间的主要区别。 1. 专业化与定制化需求 芯片行业ERP系统…

【教资 · 科目二】教育知识与能力

【教资 科目二】教育知识与能力 官网&#xff1a;https://ntce.neea.edu.cn/ ‍ 题型 教育学&#xff1a;1、2、3、7、8&#xff08;前&#xff09; 心理学&#xff1a;4、5、6、8&#xff08;后&#xff09; ​ ​ 黄色&#xff1a;重点 蓝色&#xff1a;次重点 灰色…

C++商店管理系统

代码中使用了C11的特性 后面有些输出(cout输出的)的提示文本是英文&#xff0c;因为懒得敲中文 源码在最后面 文末投票参与一下谢谢 商品数据保存在 items.txt 用户数据保存在 users.txt 实现功能 1.添加商品&#xff08;商品ID,商品名&#xff0c;库存数量&#xff0c;价格&a…

卓越运营必备神器:规划复杂项目、使用标准的项目模板,看Minitab Workspace!

可确保过程与产品卓越性的可视化工具 您是否知道Minitab Workspace是专门为Minitab统计软件配套而设计的&#xff1f; 您和您的团队或许会面临以下相关问题: 1) 在规划复杂项目上存在困难&#xff0c;如业务优化项目; 2) 因完成工作需要而使用多种未知品牌的产品; 3) 缺乏…

Python 设计模式之抽象工厂模式

文章目录 从一个例子谈起抽象工厂模式的组件构成根据抽象工厂模式实现抽象工厂模式的缺点 抽象工厂模式属于创建型设计模式&#xff0c;一般用来创建复杂的对象&#xff0c;这种对象由许多小对象组成&#xff0c;这些小对象都属于某个特定的类别。 从一个例子谈起 常见的例子是…

springboot企业人力资源管理系统-计算机毕业设计源码29005

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

【Windows 11 】Missing Customize FOlder OPtion 文件夹右键自定义消失

突然发现win11 无法修改文件夹的默认图标原来是因为没有自定义选项了。微软有人问&#xff0c;大神解决了这个问题 右键缺少的是自定义这个标签 自定义长这样子&#xff1a; HKEY_CLASSES_ROOT\Directory\shellex\PropertySheetHandlers 下已经有了 {ef43ecfe-2ab9-4632-bf21…

uniapp 让同一个子组件重新加载

给子组件添加不同的 “key” 值&#xff0c;当 key 值改变时&#xff0c;Vue 会认为这是一个不同的组件&#xff0c;并重新创建它

C语言——贪吃蛇游戏

用c语言在window环境的控制台中模拟写出贪吃蛇小游戏。 一.要实现的基本的功能 如下&#xff1a; 贪吃蛇的地图绘制 贪吃蛇吃食物的功能&#xff08;方向控制蛇的动作&#xff09; 贪吃蛇撞墙死亡判断 贪吃蛇撞自己死亡判断 计算得分 贪吃蛇的速度 暂停游戏 二 贪吃蛇的铺垫准…

【HTML入门】第二十二课 - 【实战】做一个注册页面

这一小节&#xff0c;我们继续纯HTML标签的使用&#xff0c;这一节我们做一个 注册页面。说到注册页面&#xff0c;其实大家的网站都大同小异&#xff0c;所以我们就不四处去找设计图了&#xff0c;我们自己想一个注册页面&#xff0c;想想注册页面都应该有哪些元素&#xff0c…

探究全局代理是什么?有什么作用?

今天&#xff0c;我们来聊聊一个经常被提及但很多人不太了解的概念——全局代理。那么&#xff0c;全局代理到底是什么&#xff1f;它有什么用&#xff1f;以及如何正确使用呢&#xff1f;接下来&#xff0c;小编就带大家一探究竟&#xff01; 什么是全局代理&#xff1f; 通俗…

360联合国内15个最强大模型推出“AI助手”碾压GPT4o!全球首部《人工智能法案》正式生效!|AI日报

文章推荐 GPT-4o版「Her」终于来了&#xff01;英伟达股价两周内下跌23%&#xff01;&#xff5c;AI日报 Apple Intelligence将在今年10月推出&#xff1f;AI毛绒玩具BubblePal回答人类幼崽十万个为什么&#xff01;&#xff5c;AI日报 今日热点 360放大招&#xff1a;联合…

Rodin来袭,AI建模再填猛将

AI建模&#xff0c;AI绘图&#xff0c;Rodin,人工智能&#xff0c;Stable Diffusion, Stable Diffusion,midjourney,Bing AI等人工智能在绘图界掀起腥风血雨&#xff0c;外界一致认为将取代原画师&#xff0c;但是真正的原画师却感觉良好&#xff0c;他们认为&#xff1a;“AI…

Unable to clear output directory

Bug信息 Exception in thread "main" java.io.IOException: Unable to clear output directory hdfs://xxx/warehouse/hive/xx.db/xxx prior to writing to itat org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand.deleteMatchingPart…

“智绘未来,慧聚南京”2024南京智博会

“智慧城市”一个听起来颇具未来感的词汇&#xff0c;在如今的南京市已逐步成为现实。在5G、物联网、人工智能、大数据等新一代信息技术的支撑下&#xff0c;南京市正逐渐变成一个可感知可“思考”的智能体&#xff0c;智慧社区、智慧医疗、智慧交通、智慧政务等数字化、智能化…

Flink-StarRocks详解:第六部分-即席查询大案例解析(第56天)

系列文章目录 数仓场景&#xff1a;即席查询案例 6.1 场景介绍 6.2 方案架构 6.3 方案特点 6.4 操作流程 6.4.1 步骤一&#xff1a;创建MySQL源数据表 6.4.2 步骤二&#xff1a;创建StarRocks表 6.4.3 步骤三&#xff1a;执行Flink任务&#xff0c;启动数据流 6.4.4 步骤四&am…

gemini2相机和宇树雷达L1的使用注意点

gemini2相机&#xff1a; 官方资料:Gemini2深度相机 (yahboom.com) 目前深度这一块智能提供某一点的深度数据&#xff0c;没有提供某一点的世界坐标&#xff0c;虽然网上有文章说是可以计算 已知深度图&#xff0c;获得某个像素点的三维坐标_深度图如何知道特征点的3d坐标-CS…

Windows系统下安装mujoco环境的教程【原创】

在学习Mujoco仿真的过程中&#xff0c;我先前是在linux系统下进行的研究与学习&#xff0c;今天来试试看在windows系统中安装mujoco仿真环境。 先前在linux中的一些关于mujoco学习记录的博客&#xff1a;Mujoco仿真【xml文件的学习 3】_mujoco打开xml文件-CSDN博客 下面开始wi…

怎么防止电脑上的重要视频被录屏

加密软件防录屏是通过一系列技术手段来防止视频内容在播放过程中被非法录制和传播。 一、视频加密技术 高强度加密算法&#xff1a;使用如AES256位等高强度加密算法对视频内容进行加密&#xff0c;确保视频在传输和存储过程中的安全性。这样&#xff0c;即使视频被录制&#…

黑科技,教你同时在一个电脑上同时开启多个微信

我们右键微信图标选择属性 然后 将这个目标复制下来 然后 我们新建一个文本文件 然后 在记事本中 输入 start 后面跟着微信目标内容 但是需要注意 双引号要换一下位置 换到盘符后面 例如 我的目标是 “D:\Program Files (x86)\Tencent\WeChat\WeChat.exe” 但是 我要输入 st…