当前位置: 首页 > wzjs >正文

没有网站备案可以做诚信认证嘛重庆网站页面优化

没有网站备案可以做诚信认证嘛,重庆网站页面优化,最新新闻事件今天国内大事,石家庄二手房Spring如何实现组件扫描与Component注解原理 注解配置与包扫描的实现机制一、概述:什么是注解配置与包扫描?二、处理流程概览三、注解定义ComponentScope 四、核心代码结构1. ClassPathScanningCandidateComponentProvider2. ClassPathBeanDefinitionSca…

Spring如何实现组件扫描与@Component注解原理

  • 注解配置与包扫描的实现机制
    • 一、概述:什么是注解配置与包扫描?
    • 二、处理流程概览
    • 三、注解定义
      • @Component
      • @Scope
    • 四、核心代码结构
      • 1. `ClassPathScanningCandidateComponentProvider`
      • 2. `ClassPathBeanDefinitionScanner`

源码见:mini-spring

在这里插入图片描述

注解配置与包扫描的实现机制

一、概述:什么是注解配置与包扫描?

在基于注解的 Spring 样式容器中,包扫描(Package Scanning)与注解配置(Annotation Configuration) 是核心的自动化注册机制:

本质上,它通过扫描指定包路径下的类,识别其中包含特定注解(如 @Component, @Scope),并将其自动注册为容器中的 Bean。


二、处理流程概览

要实现注解注册 Bean 的机制,大致流程如下:

  1. 确定扫描路径:通常由配置文件(如 XML)提供;

  2. 扫描类文件:获取指定包路径下所有类;

  3. 筛选目标类:识别包含目标注解的类,如 @Component

  4. 构建 BeanDefinition:为每个匹配类生成对应的 BeanDefinition;

  5. 注册 BeanDefinition:将生成的 BeanDefinition 注册到 BeanDefinitionMap 中。

此流程应发生在 BeanDefinition 的加载阶段,因此其集成逻辑最终应写入 XmlBeanDefinitionReader 中。我们可以将功能模块解耦为:

  • 扫描器模块:负责扫描、识别和构建 BeanDefinition;

  • 注册器集成:负责注册这些 BeanDefinition。


三、注解定义

@Component

用于标记一个类为容器可管理的组件:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {String value() default "";
}

@Scope

用于定义组件的作用域(如 singleton / prototype):

@Documented
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Scope {String value() default "singleton";
}

四、核心代码结构

1. ClassPathScanningCandidateComponentProvider

用于扫描指定包路径下所有带 @Component 注解的类,并构建对应的 BeanDefinition:

public class ClassPathScanningCandidateComponentProvider {public Set<BeanDefinition> findCandidateComponents(String basePackage) {Set<BeanDefinition> candidates = new LinkedHashSet<>();Set<Class<?>> classes = ClassUtil.scanPackageByAnnotation(basePackage, Component.class);for (Class<?> clazz : classes) {candidates.add(new BeanDefinition(clazz));}return candidates;}
}

2. ClassPathBeanDefinitionScanner

继承扫描器,实现更完整的处理逻辑:

  • 解析作用域(@Scope);

  • 解析 Bean 名称(默认类名首字母小写);

  • 完成 BeanDefinition 的注册。

public class ClassPathBeanDefinitionScanner extends ClassPathScanningCandidateComponentProvider {private final BeanDefinitionRegister register;public ClassPathBeanDefinitionScanner(BeanDefinitionRegister register) {this.register = register;}public void doScan(String... basePackages) {for (String basePackage : basePackages) {Set<BeanDefinition> candidates = super.findCandidateComponents(basePackage);for (BeanDefinition candidate : candidates) {// 设置作用域String scope = resolveBeanScope(candidate);if (StrUtil.isNotEmpty(scope)) {candidate.setScope(scope);}// 设置 Bean 名称并注册String beanName = determineBeanName(candidate);register.registerBeanDefinition(beanName, candidate);}}}private String determineBeanName(BeanDefinition definition) {Class<?> clazz = definition.getBeanClass();Component component = clazz.getAnnotation(Component.class);String value = component.value();return StrUtil.isEmpty(value) ? StrUtil.lowerFirst(clazz.getSimpleName()) : value;}private String resolveBeanScope(BeanDefinition definition) {Scope scope = definition.getBeanClass().getAnnotation(Scope.class);return scope != null ? scope.value() : StrUtil.EMPTY;}
}
http://www.dtcms.com/wzjs/291845.html

相关文章:

  • 南充市住房和城乡建设局考试网站google seo
  • 找人做网站被骗了属于诈骗吗国外搜索引擎大全
  • 珠海十大网站建设公司网址搜索引擎入口
  • 没有域名可以做网站吗石家庄最新新闻事件
  • 网站竞价怎么做汽车网络营销策划方案
  • 圣诞网站源码湖南网站制作公司
  • 海口网站建设兼职制作网页的流程
  • 商城网站建设网络公司网站制作公司高端
  • 一般网站有哪几部分构成seo免费系统
  • 档案局网站的建设网络优化软件有哪些
  • 学做ps的软件的网站seo教程优化
  • 用电脑做网站的历史在哪里找百度一下首页网址
  • 网站建设文化咨询宁波seo快速优化课程
  • wordpress漂亮轮播代码厦门seo培训
  • 青海省住房和城乡建设厅网站首页网站模板哪家好
  • wordpress 前台打不开百度关键词优化手段
  • 视频网站亏钱为什么还要继续做站长统计app软件下载2021
  • 提供盐城网站开发谷歌手机网页版入口
  • 万年历网站做广州seo优化排名推广
  • 后台管理网站建设什么推广平台好
  • 怎么看网站使用什么做的谷歌搜索引擎google
  • 如何做网站推广方法网络营销的定义
  • 搬瓦工可以长期做网站seo是什么意思seo是什么职位
  • 网站被黑能查到是谁做的吗长尾关键词是什么意思
  • wordpress关键词替换某企业网站的分析优化与推广
  • wordpress登录用户错乱昆明长尾词seo怎么优化
  • 品牌微信网站建设网页搜索关键字
  • 西安网站开发多少钱网站建设与管理
  • 专业网站建设设计seo网站推广服务
  • 赚钱的网站做任务属于免费的网络营销方式