news 2026/3/27 8:20:17

使用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/25 3:45:17

橙色工作汇报PPT模板

扫描下载文档详情页: https://www.didaidea.com/wenku/16415.html

作者头像 李华
网站建设 2026/3/23 22:57:00

本地搭建 Clawdbot + ZeroNews 访问

最近&#xff0c;一个名为 ClawdBot&#xff08;现已更名 OpenClaw&#xff09; 的项目在技术圈引起了广泛讨论。许多人称其为“真正能做实事的 AI”、“个人 AI 助理的未来形态”。它不仅仅是一个聊天机器人&#xff0c;更是一个能够接入日常工作、生活&#xff0c;直接在用户…

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

告别建站难 + 访问限!Halo+cpolar 让个人博客从局域网飞向全网

Halo 是一款轻量化的开源建站工具&#xff0c;核心功能围绕个人博客搭建展开&#xff0c;支持文章编辑、主题切换、插件拓展等基础且实用的建站需求&#xff0c;适配 Windows、Linux、macOS 多系统&#xff0c;操作界面简洁易懂&#xff0c;既适合零基础的学生、内容创作者快速…

作者头像 李华
网站建设 2026/3/23 17:32:15

机器学习入门(二十)支持向量机SVM

支持向量机全称是Supported Vector Machine&#xff08;支持向量机&#xff09;即寻找到一个超平面使样本分成两类&#xff0c;并且间隔最大。• 是一种监督学习算法&#xff0c;主要用于分类&#xff0c;也可用于回归• 与逻辑回归和决策树等其他分类器相比&#xff0c;SVM 提…

作者头像 李华
网站建设 2026/3/15 23:13:52

语音转写还能识情绪?SenseVoiceSmall让你大开眼界

语音转写还能识情绪&#xff1f;SenseVoiceSmall让你大开眼界 你有没有遇到过这样的场景&#xff1a;会议录音转成文字后&#xff0c;发现“这个方案很好”和“这个方案很好&#xff01;”——表面一样&#xff0c;语气却天差地别&#xff1b;又或者客服录音里突然响起一阵掌声…

作者头像 李华
网站建设 2026/3/26 8:09:46

2026年1月份国内3D打印行业11起融资,最高超亿元

3D打印技术参考统计发现&#xff0c;2026年1月国内3D打印行业共完成11起融资&#xff0c;覆盖消费级3D打印材料、设备&#xff0c;工业级3D打印设备、材料、制造服务&#xff0c;最高融资金额过亿。1. 中科煜宸完成C轮融资1月28日&#xff0c;南京中科煜宸激光技术有限公司完成…

作者头像 李华