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

使用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);}}

结果:

http://www.jsqmd.com/news/339985/

相关文章:

  • NGUI裁剪Shader的底层逻辑与性能优化
  • 2026年热门的网红穿衣镜用户好评厂家推荐 - 行业平台推荐
  • 低空环境智能感知关键技术及应用
  • 2026年质量好的卧室穿衣镜品牌厂商推荐(更新) - 行业平台推荐
  • apollo学习之借道超车的速度规划
  • 橙色工作汇报PPT模板
  • 开源的自动驾驶框架
  • 谷歌云存储长期优惠解析:精打细算的云上存储策略
  • 本地搭建 Clawdbot + ZeroNews 访问
  • Java套接字编程:深入解析多线程回显服务器的实现
  • 如何在vue3+ts项目中实现zebra扫描枪扫码效果
  • 【python 列表(list)和元组(tuple)】创建、访问、基本操作及各自的特点
  • 2026年知名的彩色纸箱印刷厂家口碑推荐汇总 - 行业平台推荐
  • 告别建站难 + 访问限!Halo+cpolar 让个人博客从局域网飞向全网
  • 贪心算法-递增的三页子序列
  • 【微实验】Zhang-Suen 快速并行细化算法与MATLAB实现
  • ESP32-S3入门教程:配置芯片
  • 转行网络安全,学历到底重不重要?
  • 龙魂模型这模型会说谎吗?
  • ESP32-S3入门教程:#include无法找到的解决方案
  • 2025年程序员都转行,我该何去何从呢!
  • 2026年比较好的印刷/彩盒印刷优质厂家推荐汇总 - 行业平台推荐
  • 机器学习入门(二十)支持向量机SVM
  • 2026年河南复合肥优质厂家盘点与采购参考 - 2026年企业推荐榜
  • 2026年口碑好的白酒包装人气实力厂商推荐 - 行业平台推荐
  • 基于动态规划算法的混合动力汽车能量管理建模与计算
  • 深圳跨境电商中的“亚马逊精品模式“详解
  • Phlux Technology 荣获 SPIE 棱镜奖
  • 原子层加工技术推动碳化硅量子光子电路发展
  • 英国团队展示砷化镓量子点发光波长的可调谐对准