绝密档案:在“91精品”与“芒果影视”的流光溢彩中,探寻吴梦梦的谍战诱惑

核心内容摘要

深夜里的数字绿洲:野草社区免费在线观看带来的影音革命
文化碰撞下的激情交响:当非洲的热情遇上中国女性的内敛与力量

极致视听盛宴:亚洲中文字幕专区最新资源合集深度解析与观影指南

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

香蕉文化漫画最新版下载-香蕉文化漫画最新版下载应用

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

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