摘要:動態注冊掃描提取包路徑下,標記了注解的類出現異常注冊檢查當前掃描到的類是否含有任何一個指定的注解標記過濾匹配類型時出錯
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(); } /** * 動態注冊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("掃描提取[{}]包路徑下,標記了注解[{}]的類出現異常", pattern,StringUtils.join(typeFilters,",")); } } } return resClazzSet; } /** * 注冊Bean * @param classList */ public void regist(List > classList){ for(Class> clzz:classList){ SpringContextHolder.registerBean(SpringContextHolder.getBeanDefinitionBuilder(clzz).getBeanDefinition()); } } /** * 檢查當前掃描到的類是否含有任何一個指定的注解標記 * @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("過濾匹配類型時出錯 {}",e.getMessage()); } } } return false; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66900.html
摘要:的依賴關系,根據依賴關系配置完成之間的裝配。的行為信息,如生命周期范圍及生命周期各過程的回調函數。使用該種裝配模式時,優先匹配參數最多的構造函數。如果提供了默認的構造函數,則采用否則采用進行自動裝配。 點擊進入我的博客 1 Spring容器與Bean配置信息 Bean配置信息 Bean配置信息是Bean的元數據信息,它由一下4個方面組成: Bean的實現類 Bean的屬性信息,如數...
摘要:關于依賴注入注入的注解提供的注解不僅僅是對象,還有在構造器上,還能用在屬性的方法上。與之相反,的限定符能夠在所有可選的上進行縮小范圍的操作,最終能夠達到只有一個滿足所規定的限制條件。注解是使用限定符的主要方式。 本文首發于泊浮目的專欄:https://segmentfault.com/blog... Spring致力于提供一種方法管理你的業務對象。在大量Java EE的應用中,隨處可...
摘要:用定義一個控制器注解指定一個特定的類擔任控制器的角色。典型地,類級別的注解映射一個指定的請求路徑或者是路徑匹配模式到一個控制器,使用額外的方法層注解縮小主要映射的范圍。第一處是類級別的,它指出這個控制器中的所有方法都與路徑相關。 1)用 @Controller 定義一個控制器 ????注解 @Controller 指定一個特定的類擔任控制器的角色。Spring 不要求你集成任何控制器基...
摘要:注解,以明確指出該類是配置的信息源注解會告知掃描指定的包來初始化這能夠確保我們聲明的能夠被發現。注解加載配置文件禁用特定的自動配置注解等價于以默認屬性使用,和。使用這個注釋將警告信息去掉。 @ConditionalOnBean 配置了某個特定Bean@ConditionalOnMissingBean 沒有配置特定的Bean@ConditionalOnClass Classpath里有指...
摘要:分發處理器將會掃描使用了該注解的類的方法,并檢測該方法是否使用了注解。作用該注解用于將的方法返回的對象,通過適當的轉換為指定格式后,寫入到對象的數據區。用于注解層,在類上面注解。使用標記的參數。 1、@Controller 在SpringMVC 中,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把用戶請求的數據經過業務處理層處理之后封裝成一個M...
閱讀 1125·2021-11-24 10:21
閱讀 2561·2021-11-19 11:35
閱讀 1662·2019-08-30 15:55
閱讀 1293·2019-08-30 15:54
閱讀 1192·2019-08-30 15:53
閱讀 3499·2019-08-29 17:21
閱讀 3308·2019-08-29 16:12
閱讀 3412·2019-08-29 15:23