news 2026/6/10 1:47:05

使用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/6/10 2:18:49

谷歌云存储长期优惠解析:精打细算的云上存储策略

把数据放到云端&#xff0c;现在基本是企业和开发者的常规操作了。谷歌云存储大家用得不少&#xff0c;毕竟它稳定、安全&#xff0c;性能也够全球化。但说到花钱&#xff0c;很多人心里都会嘀咕&#xff1a;这玩意儿有没有长期优惠啊&#xff1f;毕竟这直接关系到项目未来几年…

作者头像 李华
网站建设 2026/6/10 1:06:26

【微实验】Zhang-Suen 快速并行细化算法与MATLAB实现

目录 &#x1f58b;️ 序章&#xff1a;笔墨间的骨架&#xff0c;时光里的轮廓 &#x1f914; 发现问题&#xff1a;机器的 “线条困惑” &#x1f4a1; 技术思路&#xff1a;用 “两轮温柔侵蚀”&#xff0c;保留核心骨架 &#x1f4da; 数学之美&#xff1a;从邻域判断到像…

作者头像 李华
网站建设 2026/6/10 12:31:04

Phlux Technology 荣获 SPIE 棱镜奖

英国红外传感器制造商 Phlux Technology 凭借其 Aura 系列 1550nm 无噪铟镓砷&#xff08;InGaAs&#xff09;雪崩光电二极管&#xff08;APD&#xff09;传感器&#xff0c;荣膺享有盛誉的 SPIE 棱镜奖。这一奖项的颁发仪式于 Photonics West 2026 会议期间的盛大晚宴上隆重举…

作者头像 李华
网站建设 2026/6/10 14:37:01

短视频内容打标:笑声密集段自动标记为‘搞笑’

短视频内容打标&#xff1a;笑声密集段自动标记为‘搞笑’ 在短视频运营中&#xff0c;一个常被忽视却极其关键的环节是内容语义打标——不是简单贴上“美食”“旅行”这类粗粒度标签&#xff0c;而是精准识别音频中隐藏的情绪信号与声音事件&#xff0c;比如某段视频里突然爆…

作者头像 李华
网站建设 2026/6/10 18:01:12

Banana Vision Studio入门指南:快速掌握4种工业美学方案

Banana Vision Studio入门指南&#xff1a;快速掌握4种工业美学方案 Banana Vision Studio不是又一个花哨的AI图片生成器&#xff0c;而是一把专为产品设计师、工业设计师和创意工作者打造的结构可视化手术刀。它不追求天马行空的幻想&#xff0c;而是聚焦于真实世界中那些被忽…

作者头像 李华