当前位置: 首页 >服务端 > Spring-扫描注解原理,注解自动扫描原理分析

Spring-扫描注解原理,注解自动扫描原理分析

 

注解自动扫描原理分析

 

在spring的配置文件中加入如下代码,spring便开启了自动扫描,那么它的底层到底是如何实现的呢?

<context:component-scan base-package="com.wisely.highlight_spring4.ch1"/>

 

  1. 首先找到解析这个标签的地方,spring 中解析具体的标签都有相应的解析器,且都继承了NamespaceHandlerSupport
    Spring-扫描注解原理,注解自动扫描原理分析 _ JavaClub全栈架构师技术笔记
    Spring-扫描注解原理,注解自动扫描原理分析 _ JavaClub全栈架构师技术笔记

  2. 查看 ComponentScanBeanDefinitionParserparse方法
    Spring-扫描注解原理,注解自动扫描原理分析 _ JavaClub全栈架构师技术笔记

  3. 真正的逻辑其实是在ClassPathBeanDefinitionScannerdoScan方法中
    Spring-扫描注解原理,注解自动扫描原理分析 _ JavaClub全栈架构师技术笔记

  4. 测试一下扫描过程

Spring-扫描注解原理,注解自动扫描原理分析 _ JavaClub全栈架构师技术笔记
 1 package com.wisely.highlight_spring4.ch1.di; 2  3 import java.io.IOException; 4 import java.util.LinkedHashSet; 5 import java.util.Set; 6  7 import org.springframework.beans.factory.config.BeanDefinition; 8 import org.springframework.context.annotation.ScannedGenericBeanDefinition; 9 import org.springframework.core.io.Resource;10 import org.springframework.core.io.support.PathMatchingResourcePatteResolver;11 import org.springframework.core.io.support.ResourcePatteResolver;12 import org.springframework.core.type.classreading.MetadataReader;13 import org.springframework.core.type.classreading.MetadataReaderFactory;14 import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;15 import org.springframework.stereotype.Component;16 import org.springframework.stereotype.Controller;17 import org.springframework.stereotype.Service;18 19 public class BeanFactoryTest20 {21 public static void main(String[] args) throws IOException, ClassNotFoundException {22 Set<BeanDefinition> candidates = new LinkedHashSet<>();23 24 ResourcePatteResolver resourcePatteResolver = new PathMatchingResourcePatteResolver();  25 //这里特别注意一下类路径必须这样写26 //获取指定包下的所有类27 Resource[] resources = resourcePatteResolver.getResources("classpath*:com\\wisely\\highlight_spring4\\ch1\\di\\*");  28  29 MetadataReaderFactory metadata=new SimpleMetadataReaderFactory();30 for(Resource resource:resources) {31 System.out.println(resource);32 MetadataReader metadataReader=metadata.getMetadataReader(resource);33 ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);34 sbd.setResource(resource);35 sbd.setSource(resource);36 candidates.add(sbd);37 }38 for(BeanDefinition beanDefinition : candidates) {  39 String classname=beanDefinition.getBeanClassName();40 //扫描controller注解41 Controller c=Class.forName(classname).getAnnotation(Controller.class);42 //扫描Service注解43 Service s=Class.forName(classname).getAnnotation(Service.class);44 //扫描Component注解45 Component component=Class.forName(classname).getAnnotation(Component.class);46 if(c!=null ||s!=null ||component!=null){47 System.out.println(classname);48 }49 } 50 }51 }
View Code

 

  1. 我的项目包结构
    Spring-扫描注解原理,注解自动扫描原理分析 _ JavaClub全栈架构师技术笔记

  2. 控制台输出结果
    Spring-扫描注解原理,注解自动扫描原理分析 _ JavaClub全栈架构师技术笔记

 

作者:Hoonick
来源链接:https://www.cnblogs.com/hoonick/p/9820674.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/server/113028.html

标签:Spring注解
分享给朋友:

“Spring-扫描注解原理,注解自动扫描原理分析” 的相关文章

go系列之利用Gin框架获取form参数 2022年05月15日 02:49:59
CentOS yum 源的配置与使用 2022年05月19日 19:54:27
常用日志框架介绍 2022年05月19日 20:04:06
ubuntu 20.04修改数据源配置 2022年05月20日 10:09:56
多线程编程(1) 2022年05月20日 21:26:51
投票统计,遍历数据 2022年05月21日 11:41:42
信息系统项目文档及其管理 2022年05月24日 20:53:47
信息系统项目管理师之风险管理 2022年05月24日 23:52:04