Win11开发环境配置:Visual Studio编译DeepSeek-OCR C++接口
使用Spring的BeanFactoryPostProcessor扩展点完成自定义注解扫描
概述本次实验是上一次https://blog.csdn.net/2301_80749359/article/details/157651601?fromshareblogdetailsharetypeblogdetailsharerId157651601sharereferPCsharesource2301_80749359sharefromfrom_link的扩展只是加了自定义注解较为方便。
具体步骤
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)publicinterfaceMyComponent{// 配置value属性以代表bean的名字Stringvalue();}
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;publicstaticMapString,ClassscanMyComponentAnnotation(StringbasePackage){//创建容器存储使用了指定注解的Bean字节码对象MapString,ClassannotationClassMapnewHashMapString,Class();//spring工具类可以获取指定路径下的全部类ResourcePatternResolverresourcePatternResolvernewPathMatchingResourcePatternResolver();try{StringpatternResourcePatternResolver.CLASSPATH_ALL_URL_PREFIXClassUtils.convertClassNameToResourcePath(basePackage)RESOURCE_PATTERN;Resource[]resourcesresourcePatternResolver.getResources(pattern);//MetadataReader 的工厂类MetadataReaderFactoryrefractorynewCachingMetadataReaderFactory(resourcePatternResolver);for(Resourceresource:resources){//用于读取类信息MetadataReaderreaderrefractory.getMetadataReader(resource);//扫描到的classStringclassnamereader.getClassMetadata().getClassName();Class?clazzClass.forName(classname);//判断是否属于指定的注解类型if(clazz.isAnnotationPresent(MyComponent.class)){//获得注解对象MyComponentannotationclazz.getAnnotation(MyComponent.class);//获得属value属性值StringbeanNameannotation.value();//判断是否为if(beanName!null!beanName.equals()){//存储到Map中去annotationClassMap.put(beanName,clazz);continue;}//如果没有为,那就把当前类的类名作为beanNameannotationClassMap.put(clazz.getSimpleName(),clazz);}}}catch(Exceptionexception){}returnannotationClassMap;}publicstaticvoidmain(String[]args){MapString,ClassstringClassMapscanMyComponentAnnotation(com.itheima);System.out.println(stringClassMap);}}
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{//先是使用扫描的工具进行扫描MapString,ClassmyComponentAnnotationMapBaseClassScanUtils.scanMyComponentAnnotation(com.itheima);// 然后是遍历这个map得到bbeanDefinitionmyComponentAnnotationMap.forEach((beanName,beanClass)-{// 先是获取到全限制名(转为String类型的)StringclassNamebeanClass.getName();// 然后是定义bbeanDefinitionBeanDefinitionbeanDefinitionnewRootBeanDefinition();beanDefinition.setBeanClassName(className);// 再是进行注册这就是放到单例池单中了beanDefinitionRegistry.registerBeanDefinition(beanName,beanDefinition);});}OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactoryconfigurableListableBeanFactory)throwsBeansException{}}
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{ApplicationContextapplicationContextnewClassPathXmlApplicationContext(applicationContext_beanfac.xml);OthrerBeanothrerBean(OthrerBean)applicationContext.getBean(otherBean);System.out.println(othrerBean);}}结果
美女姐姐跳舞视频大全-美女姐姐跳舞视频大全应用