摘要:動(dòng)態(tài)注冊(cè)掃描提取包路徑下,標(biāo)記了注解的類(lèi)出現(xiàn)異常注冊(cè)檢查當(dāng)前掃描到的類(lèi)是否含有任何一個(gè)指定的注解標(biāo)記過(guò)濾匹配類(lèi)型時(shí)出錯(cuò)
public class SpringContextHolder implements ApplicationContextAware{ private static ApplicationContext context; private static BeanDefinitionRegistry beanDefinitonRegistry; public static ApplicationContext getApplicationContext() { return context; } public static Object getBean(String name){ return context.getBean(name); } public staticT getBean(Class clz){ return context.getBean(clz); } public static T getBean(String name , Class clz){ return context.getBean(name, clz); } @Override public void setApplicationContext(ApplicationContext ac) throws BeansException { context = ac; //DefaultListableBeanFactory acf = (DefaultListableBeanFactory) app.getAutowireCapableBeanFactory(); ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) context; beanDefinitonRegistry = (BeanDefinitionRegistry) configurableApplicationContext .getBeanFactory(); } /** * 動(dòng)態(tài)注冊(cè)bean * @param beanName * @param beanDefinition */ public synchronized static void registerBean(String beanName, BeanDefinition beanDefinition){ //DefaultListableBeanFactory beanDefinitonRegistry = (DefaultListableBeanFactory) app.getAutowireCapableBeanFactory(); if(!beanDefinitonRegistry.containsBeanDefinition(beanName)){ beanDefinitonRegistry.registerBeanDefinition(beanName, beanDefinition); } } public static void registerBean(BeanDefinition beanDefinition){ //DefaultListableBeanFactory beanDefinitonRegistry = (DefaultListableBeanFactory) app.getAutowireCapableBeanFactory(); String simpleNameString=beanDefinition.getBeanClassName(); if(simpleNameString.contains(".")){ simpleNameString=simpleNameString.substring(simpleNameString.lastIndexOf(".")+1); } simpleNameString=StringUtil.lowerFirstChar(simpleNameString); registerBean(simpleNameString,beanDefinition); } public static BeanDefinitionBuilder getBeanDefinitionBuilder(Class clazz){ return BeanDefinitionBuilder.genericBeanDefinition(clazz); } }
public class ClassScanner { private final Logger logger = LoggerFactory.getLogger(getClass()); private static final String RESOURCE_PATTERN = "**/%s/**/*.class"; private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); public ClassScanner(){ } @SafeVarargs public final Set> scan(String[] confPkgs, Class extends Annotation>... annotationTags){ Set > resClazzSet = new HashSet<>(); List typeFilters = new LinkedList<>(); if (ArrayUtils.isNotEmpty(annotationTags)){ for (Class extends Annotation> annotation : annotationTags) { typeFilters.add(new AnnotationTypeFilter(annotation, false)); } } if (ArrayUtils.isNotEmpty(confPkgs)) { for (String pkg : confPkgs) { String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + String.format(RESOURCE_PATTERN,ClassUtils.convertClassNameToResourcePath(pkg)); try { Resource[] resources = this.resourcePatternResolver.getResources(pattern); MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(this.resourcePatternResolver); for (Resource resource : resources) { if (resource.isReadable()) { MetadataReader reader = readerFactory.getMetadataReader(resource); String className = reader.getClassMetadata().getClassName(); if (ifMatchesEntityType(reader, readerFactory,typeFilters)) { Class> curClass = Thread.currentThread().getContextClassLoader().loadClass(className); resClazzSet.add(curClass); } } } } catch (Exception e) { logger.error("掃描提取[{}]包路徑下,標(biāo)記了注解[{}]的類(lèi)出現(xiàn)異常", pattern,StringUtils.join(typeFilters,",")); } } } return resClazzSet; } /** * 注冊(cè)Bean * @param classList */ public void regist(List > classList){ for(Class> clzz:classList){ SpringContextHolder.registerBean(SpringContextHolder.getBeanDefinitionBuilder(clzz).getBeanDefinition()); } } /** * 檢查當(dāng)前掃描到的類(lèi)是否含有任何一個(gè)指定的注解標(biāo)記 * @param reader * @param readerFactory * @return ture/false */ private boolean ifMatchesEntityType(MetadataReader reader, MetadataReaderFactory readerFactory,List typeFilters) { if (!CollectionUtils.isEmpty(typeFilters)) { for (TypeFilter filter : typeFilters) { try { if (filter.match(reader, readerFactory)) { return true; } } catch (IOException e) { logger.error("過(guò)濾匹配類(lèi)型時(shí)出錯(cuò) {}",e.getMessage()); } } } return false; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66900.html
摘要:的依賴(lài)關(guān)系,根據(jù)依賴(lài)關(guān)系配置完成之間的裝配。的行為信息,如生命周期范圍及生命周期各過(guò)程的回調(diào)函數(shù)。使用該種裝配模式時(shí),優(yōu)先匹配參數(shù)最多的構(gòu)造函數(shù)。如果提供了默認(rèn)的構(gòu)造函數(shù),則采用否則采用進(jìn)行自動(dòng)裝配。 點(diǎn)擊進(jìn)入我的博客 1 Spring容器與Bean配置信息 Bean配置信息 Bean配置信息是Bean的元數(shù)據(jù)信息,它由一下4個(gè)方面組成: Bean的實(shí)現(xiàn)類(lèi) Bean的屬性信息,如數(shù)...
摘要:關(guān)于依賴(lài)注入注入的注解提供的注解不僅僅是對(duì)象,還有在構(gòu)造器上,還能用在屬性的方法上。與之相反,的限定符能夠在所有可選的上進(jìn)行縮小范圍的操作,最終能夠達(dá)到只有一個(gè)滿(mǎn)足所規(guī)定的限制條件。注解是使用限定符的主要方式。 本文首發(fā)于泊浮目的專(zhuān)欄:https://segmentfault.com/blog... Spring致力于提供一種方法管理你的業(yè)務(wù)對(duì)象。在大量Java EE的應(yīng)用中,隨處可...
摘要:用定義一個(gè)控制器注解指定一個(gè)特定的類(lèi)擔(dān)任控制器的角色。典型地,類(lèi)級(jí)別的注解映射一個(gè)指定的請(qǐng)求路徑或者是路徑匹配模式到一個(gè)控制器,使用額外的方法層注解縮小主要映射的范圍。第一處是類(lèi)級(jí)別的,它指出這個(gè)控制器中的所有方法都與路徑相關(guān)。 1)用 @Controller 定義一個(gè)控制器 ????注解 @Controller 指定一個(gè)特定的類(lèi)擔(dān)任控制器的角色。Spring 不要求你集成任何控制器基...
摘要:注解,以明確指出該類(lèi)是配置的信息源注解會(huì)告知掃描指定的包來(lái)初始化這能夠確保我們聲明的能夠被發(fā)現(xiàn)。注解加載配置文件禁用特定的自動(dòng)配置注解等價(jià)于以默認(rèn)屬性使用,和。使用這個(gè)注釋將警告信息去掉。 @ConditionalOnBean 配置了某個(gè)特定Bean@ConditionalOnMissingBean 沒(méi)有配置特定的Bean@ConditionalOnClass Classpath里有指...
摘要:分發(fā)處理器將會(huì)掃描使用了該注解的類(lèi)的方法,并檢測(cè)該方法是否使用了注解。作用該注解用于將的方法返回的對(duì)象,通過(guò)適當(dāng)?shù)霓D(zhuǎn)換為指定格式后,寫(xiě)入到對(duì)象的數(shù)據(jù)區(qū)。用于注解層,在類(lèi)上面注解。使用標(biāo)記的參數(shù)。 1、@Controller 在SpringMVC 中,控制器Controller 負(fù)責(zé)處理由DispatcherServlet 分發(fā)的請(qǐng)求,它把用戶(hù)請(qǐng)求的數(shù)據(jù)經(jīng)過(guò)業(yè)務(wù)處理層處理之后封裝成一個(gè)M...
閱讀 1140·2021-11-24 10:21
閱讀 2576·2021-11-19 11:35
閱讀 1678·2019-08-30 15:55
閱讀 1307·2019-08-30 15:54
閱讀 1205·2019-08-30 15:53
閱讀 3519·2019-08-29 17:21
閱讀 3319·2019-08-29 16:12
閱讀 3428·2019-08-29 15:23