智能网关DTU如何实现灌区信息化管理的节能增效

核心内容摘要

网盘解析技术解析:提升下载效率的5种突破方法
手把手教你用DCA1000和EVM板搭建毫米波雷达数据采集系统(含静态IP配置避坑指南)

10分钟速通|DVWA存储型XSS漏洞复现 弹窗+Cookie窃取实战

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

器材室轮(4)h继调2v1h-器材室轮(4)h继调应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123