千家信息网

Spring的@Component注解怎么使用

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,本篇内容介绍了"Spring的@Component注解怎么使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学
千家信息网最后更新 2025年01月31日Spring的@Component注解怎么使用

本篇内容介绍了"Spring的@Component注解怎么使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1. 前言

实现一个类似@Controller的注解(或者继承某个统一接口)来完成比如定时任务的统一注入或者Websocket处理器的统一注入等这种将某种共性的Bean动态注入。

// 模仿 Controller  @XBean(description = "ETL JOB")public class JobShedule {    @Caller(cron = "* * 0/5 * * ?")    public void exec(){        // job     }}

以上伪代码就是一个模仿Controller的定时任务Bean。

2. 设计思路

详细的开发设计思路我已经总结好了,各位同学只要按部就班就可以实现这个功能了。

2.1 定义扫描注解

定义一个类似@MappScan的进行导入自定义ImportBeanDefinitionRegistrar,并指定扫描包范围。

@Documented@Inherited@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Import(XBeanDefinitionRegistrar.class)public @interface XBeanScan {    String[] basePackages();}

我们自定义了一个扫描注解@XBeanScan。它有两个作用:

  • 通过basePackages指定扫描包的范围。

  • 导入我们自定义ImportBeanDefinitionRegistrar 的实现XBeanDefinitionRegistrar

2.2 定义目标Bean的通用标记

通常我们可以选择一个标识接口,所有其实现类都会注入Spring IoC;或者用更加方便的注解,所有被该注解标记的类都将注入Spring IoC。这里我们使用更加灵活方便的注解,实现了一个@XBean标记注解:

@Documented@Inherited@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})public @interface XBean {    String description() default "";}

2.3 实现扫描器

Spring框架为我们提供了扫描器来注册被标记的Bean,它就是上节提到的ClassPathBeanDefinitionScanner,我们继承它进行稍加改造:

public class XBeanDefinitionScanner extends ClassPathBeanDefinitionScanner {    public XBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters) {        super(registry, useDefaultFilters);        super.addIncludeFilter(new AnnotationTypeFilter(XBean.class));    }}

这里我们不使用默认的过滤器,我们指定了扫描器扫描的目标为被@XBean标记的那些Bean

2.4 实现 Bean 注册机

重头戏来了,我们需要将2.12.3定义的这些组件在ImportBeanDefinitionRegistrar的实现中组装起来。

/** * The type X bean definition registrar. * * @author felord.cn * @since 2020 /9/18 22:59 */public class XBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware {    private ResourceLoader resourceLoader;    @Override    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {        // 不使用默认过滤器        XBeanDefinitionScanner xBeanDefinitionScanner = new XBeanDefinitionScanner(registry, false);        xBeanDefinitionScanner.setResourceLoader(resourceLoader);        // 扫描XBeanScan注解指定的包        xBeanDefinitionScanner.scan(getBasePackagesToScan(importingClassMetadata));    }    @Override    public void setResourceLoader(ResourceLoader resourceLoader) {        this.resourceLoader = resourceLoader;    }    /**     * 获取{@link XBeanScan}中声明的扫描包路径     * @param metadata the meta     * @return  包路径数组     */    private String[] getBasePackagesToScan(AnnotationMetadata metadata) {        String name = XBeanScan.class.getName();        AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(name, true));        Assert.notNull(attributes, () -> "No auto-configuration attributes found. Is " + metadata.getClassName()                + " annotated with " + ClassUtils.getShortName(name) + "?");        return attributes.getStringArray("basePackages");    }}

从注解元数据importingClassMetadata解析我们需要的扫描路径basePackages等元数据,然后让扫描器在该路径扫描即可。

2.5 使用

在具有@Configuration标记的类或者Spring BootMain类上使用@XBeanScan即可,是不是非常简单!

其实@ComponentScan提供类似的功能。

"Spring的@Component注解怎么使用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

注解 标记 扫描器 路径 统一 任务 内容 功能 就是 思路 接口 数据 更多 目标 知识 范围 过滤器 设计 实用 按部就班 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全法实行期是哪一天 京东快递计算机网络技术应用 市网络安全应急指挥中心事业单位 电梯隐患排查治理台账或数据库 数据库半连接例子的意义 申论真题 网络安全 淅川网络安全知识 国家校园网络安全规定 软件开发行业财务分析 计算机网络技术教育特点 网络安全项目经验怎么办 软件开发专业作文 服务器买来安全组 苹果手机虚拟网络安全等级划分 计算机网络技术地铁工作工资 如何应对未来的网络安全威胁 广州人资优选互联网科技有限公司 切换服务器有助于提高上网质量吗 江苏正规软件开发设施 mongo数据库查询数据 当前默认服务器未更新进不去 数据库离线同步框架 广东专业服务器散热器生产厂家 扬州棋牌软件开发 网络安全审核办公室在哪里 网络安全艺术展 吉林省视频会议服务器 中国网络安全科技公司 win10退出网络安全模式 blob 转 数据库
0