刘涛范冰冰大战巨茎引发热议

核心内容摘要

从“亲密”到“体面”:成年人处理前任关系的心理学与边界艺术
张津瑜:镜头下的光影变幻,镜头外的别样人生

17c.起草:穿越时空的灵感,点亮现代生活

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

91视频官网-91视频官网应用

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

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