news 2026/3/30 15:39:31

使用Spring的BeanFactoryPostProcessor扩展点完成自定义注解扫描

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用Spring的BeanFactoryPostProcessor扩展点完成自定义注解扫描

使用Spring的BeanFactoryPostProcessor扩展点完成自定义注解扫描

一、概述

本次实验是上一次https://blog.csdn.net/2301_80749359/article/details/157651601?fromshare=blogdetail&sharetype=blogdetail&sharerId=157651601&sharerefer=PC&sharesource=2301_80749359&sharefrom=from_link的扩展,只是加了自定义注解较为方便。

二、具体步骤

2.1创建自定义注解

packagecom.itheima.ano;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;//设定在哪些类型上可以使用@Target(ElementType.TYPE)//设定作用的范围@Retention(RetentionPolicy.RUNTIME)public@interfaceMyComponent{// 配置value属性,以代表bean的名字Stringvalue();}

2.2引入扫描注解包的工具类

packagecom.itheima.utils;importcom.itheima.ano.MyComponent;importorg.springframework.core.io.Resource;importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;importorg.springframework.core.io.support.ResourcePatternResolver;importorg.springframework.core.type.classreading.CachingMetadataReaderFactory;importorg.springframework.core.type.classreading.MetadataReader;importorg.springframework.core.type.classreading.MetadataReaderFactory;importorg.springframework.util.ClassUtils;importjava.lang.annotation.Annotation;importjava.util.HashMap;importjava.util.List;importjava.util.Map;publicclassBaseClassScanUtils{//设置资源规则privatestaticfinalStringRESOURCE_PATTERN="/**/*.class";publicstaticMap<String,Class>scanMyComponentAnnotation(StringbasePackage){//创建容器存储使用了指定注解的Bean字节码对象Map<String,Class>annotationClassMap=newHashMap<String,Class>();//spring工具类,可以获取指定路径下的全部类ResourcePatternResolverresourcePatternResolver=newPathMatchingResourcePatternResolver();try{Stringpattern=ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX+ClassUtils.convertClassNameToResourcePath(basePackage)+RESOURCE_PATTERN;Resource[]resources=resourcePatternResolver.getResources(pattern);//MetadataReader 的工厂类MetadataReaderFactoryrefractory=newCachingMetadataReaderFactory(resourcePatternResolver);for(Resourceresource:resources){//用于读取类信息MetadataReaderreader=refractory.getMetadataReader(resource);//扫描到的classStringclassname=reader.getClassMetadata().getClassName();Class<?>clazz=Class.forName(classname);//判断是否属于指定的注解类型if(clazz.isAnnotationPresent(MyComponent.class)){//获得注解对象MyComponentannotation=clazz.getAnnotation(MyComponent.class);//获得属value属性值StringbeanName=annotation.value();//判断是否为""if(beanName!=null&&!beanName.equals("")){//存储到Map中去annotationClassMap.put(beanName,clazz);continue;}//如果没有为"",那就把当前类的类名作为beanNameannotationClassMap.put(clazz.getSimpleName(),clazz);}}}catch(Exceptionexception){}returnannotationClassMap;}publicstaticvoidmain(String[]args){Map<String,Class>stringClassMap=scanMyComponentAnnotation("com.itheima");System.out.println(stringClassMap);}}

2.3利用工具类扫描包

利用工具类扫描包(包括该包及其子包下)中带有@MyComponent注释的类,然后遍历Map进行相关的操作(具体见代码注释)

packagecom.itheima.processor;importcom.itheima.utils.BaseClassScanUtils;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.config.BeanDefinition;importorg.springframework.beans.factory.config.ConfigurableListableBeanFactory;importorg.springframework.beans.factory.support.BeanDefinitionRegistry;importorg.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;importorg.springframework.beans.factory.support.RootBeanDefinition;importjava.util.Map;publicclassMyComponentBeanFactoryPostProcessorimplementsBeanDefinitionRegistryPostProcessor{@OverridepublicvoidpostProcessBeanDefinitionRegistry(BeanDefinitionRegistrybeanDefinitionRegistry)throwsBeansException{//先是使用扫描的工具进行扫描Map<String,Class>myComponentAnnotationMap=BaseClassScanUtils.scanMyComponentAnnotation("com.itheima");// 然后是遍历这个map,得到bbeanDefinitionmyComponentAnnotationMap.forEach((beanName,beanClass)->{// 先是获取到全限制名(转为String类型的)StringclassName=beanClass.getName();// 然后是定义bbeanDefinitionBeanDefinitionbeanDefinition=newRootBeanDefinition();beanDefinition.setBeanClassName(className);// 再是进行注册,这就是放到单例池单中了beanDefinitionRegistry.registerBeanDefinition(beanName,beanDefinition);});}@OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactoryconfigurableListableBeanFactory)throwsBeansException{}}

2.4测试:

packagecom.itheima.test;importcom.alibaba.druid.pool.DruidDataSource;importcom.itheima.beans.OthrerBean;importcom.itheima.beans.Xxxbean;importcom.itheima.dao.impl.UserDaoImpl;importcom.itheima.dao.personDao;importcom.itheima.service.UserService;importcom.mysql.jdbc.Connection;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.springframework.beans.factory.config.BeanDefinition;importorg.springframework.beans.factory.support.DefaultListableBeanFactory;importorg.springframework.beans.factory.xml.XmlBeanDefinitionReader;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importjavax.xml.bind.annotation.XmlAccessOrder;importjava.io.IOException;importjava.io.InputStream;importjava.sql.DriverManager;publicclassBeanFactoryTest{publicstaticvoidmain(String[]args)throwsException{ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext_beanfac.xml");OthrerBeanothrerBean=(OthrerBean)applicationContext.getBean("otherBean");System.out.println(othrerBean);}}

结果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/28 1:29:53

开源的自动驾驶框架

目前主流的开源自动驾驶框架&#xff0c;这类框架覆盖了从入门学习、算法研发到工程落地、实车部署的全场景&#xff0c;核心分为全栈式框架&#xff08;覆盖感知/预测/决策/规划/控制全流程&#xff0c;可直接对接实车&#xff09;和模块化框架&#xff08;聚焦单一环节&#…

作者头像 李华
网站建设 2026/3/26 22:55:53

STM32F407通过UART读取JY-901加速度数据方案

一、硬件连接与配置 1. 引脚连接 JY-901与STM32F407的UART接口连接如下&#xff08;以USART2为例&#xff09;&#xff1a;JY-901引脚STM32引脚功能TXPA3JY-901发送端RXPA2JY-901接收端VCC3.3V电源供电GNDGND共地2. 波特率设置 JY-901默认波特率为9600bps&#xff0c;需在STM32…

作者头像 李华
网站建设 2026/3/26 15:39:51

转行网络安全,学历到底重不重要?

转行网络安全&#xff0c;学历到底重不重要&#xff1f; 之前在网上看到一个话题&#xff0c;说的是网络安全从业者里有多少是“科班出生”的话题评论区那叫一个壮观&#xff0c;全是吐槽。 有兄弟说&#xff1a;“技术牛逼的大佬&#xff0c;很多都是高中毕业的。” 也有兄弟…

作者头像 李华
网站建设 2026/3/27 13:07:29

再也不用手动配环境了,这个镜像全包了

再也不用手动配环境了&#xff0c;这个镜像全包了 你有没有经历过这样的深夜&#xff1a; 装CUDA版本不对&#xff0c;报错&#xff1b; pip install ms-swift卡在编译&#xff0c;等了40分钟没反应&#xff1b; 下载Qwen2.5-7B模型时断线重连三次&#xff0c;最后发现磁盘空间…

作者头像 李华
网站建设 2026/3/27 2:24:18

世毫九实验室简介·方见华致各界书

世毫九实验室方见华致各界书 近日&#xff0c;关于“世毫九”及本人的诸多言论&#xff0c;在网络间引发热议与误读。在此&#xff0c;我谨以“世毫九实验室”负责人的身份&#xff0c;作一简要澄清与说明。 首先&#xff0c;我必须坦诚&#xff0c;由于个人表达上的急切与不够…

作者头像 李华
网站建设 2026/3/28 17:42:01

测试新手百科:Postman简介、安装、入门使用方法详细攻略!

一、Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的&#xff0c;用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调试工具不仅可以调试简单的css、html、脚本等简单的网…

作者头像 李华