国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring下掃描特定包下特定注解的類并動態(tài)注冊bean

vibiu / 994人閱讀

摘要:動態(tài)注冊掃描提取包路徑下,標(biāo)記了注解的類出現(xiàn)異常注冊檢查當(dāng)前掃描到的類是否含有任何一個指定的注解標(biāo)記過濾匹配類型時出錯

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 static  T 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();
    }
    /**
     * 動態(tài)注冊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... annotationTags){
        Set> resClazzSet = new HashSet<>();
        List typeFilters = new LinkedList<>();
        if (ArrayUtils.isNotEmpty(annotationTags)){
            for (Class 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)記了注解[{}]的類出現(xiàn)異常", pattern,StringUtils.join(typeFilters,","));
                }
            }
        }
        return resClazzSet;
    }

    /**
     * 注冊Bean
     * @param classList
     */
    public void regist(List> classList){
        for(Class clzz:classList){
            SpringContextHolder.registerBean(SpringContextHolder.getBeanDefinitionBuilder(clzz).getBeanDefinition());
        }
    }

    /**
     * 檢查當(dāng)前掃描到的類是否含有任何一個指定的注解標(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("過濾匹配類型時出錯 {}",e.getMessage());
                }
            }
        }
        return false;
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66900.html

相關(guān)文章

  • Spring詳解3.Bean的裝配

    摘要:的依賴關(guān)系,根據(jù)依賴關(guān)系配置完成之間的裝配。的行為信息,如生命周期范圍及生命周期各過程的回調(diào)函數(shù)。使用該種裝配模式時,優(yōu)先匹配參數(shù)最多的構(gòu)造函數(shù)。如果提供了默認的構(gòu)造函數(shù),則采用否則采用進行自動裝配。 點擊進入我的博客 1 Spring容器與Bean配置信息 Bean配置信息 Bean配置信息是Bean的元數(shù)據(jù)信息,它由一下4個方面組成: Bean的實現(xiàn)類 Bean的屬性信息,如數(shù)...

    endiat 評論0 收藏0
  • 看起來很長但還是有用的Spring學(xué)習(xí)筆記

    摘要:關(guān)于依賴注入注入的注解提供的注解不僅僅是對象,還有在構(gòu)造器上,還能用在屬性的方法上。與之相反,的限定符能夠在所有可選的上進行縮小范圍的操作,最終能夠達到只有一個滿足所規(guī)定的限制條件。注解是使用限定符的主要方式。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... Spring致力于提供一種方法管理你的業(yè)務(wù)對象。在大量Java EE的應(yīng)用中,隨處可...

    DTeam 評論0 收藏0
  • 3.1、定義一個控制器:使用 @Controller 和 @RequestMapping

    摘要:用定義一個控制器注解指定一個特定的類擔(dān)任控制器的角色。典型地,類級別的注解映射一個指定的請求路徑或者是路徑匹配模式到一個控制器,使用額外的方法層注解縮小主要映射的范圍。第一處是類級別的,它指出這個控制器中的所有方法都與路徑相關(guān)。 1)用 @Controller 定義一個控制器 ????注解 @Controller 指定一個特定的類擔(dān)任控制器的角色。Spring 不要求你集成任何控制器基...

    Render 評論0 收藏0
  • Spring 各種注解備注

    摘要:注解,以明確指出該類是配置的信息源注解會告知掃描指定的包來初始化這能夠確保我們聲明的能夠被發(fā)現(xiàn)。注解加載配置文件禁用特定的自動配置注解等價于以默認屬性使用,和。使用這個注釋將警告信息去掉。 @ConditionalOnBean 配置了某個特定Bean@ConditionalOnMissingBean 沒有配置特定的Bean@ConditionalOnClass Classpath里有指...

    hosition 評論0 收藏0
  • springmvc常用注解標(biāo)簽詳解

    摘要:分發(fā)處理器將會掃描使用了該注解的類的方法,并檢測該方法是否使用了注解。作用該注解用于將的方法返回的對象,通過適當(dāng)?shù)霓D(zhuǎn)換為指定格式后,寫入到對象的數(shù)據(jù)區(qū)。用于注解層,在類上面注解。使用標(biāo)記的參數(shù)。 1、@Controller 在SpringMVC 中,控制器Controller 負責(zé)處理由DispatcherServlet 分發(fā)的請求,它把用戶請求的數(shù)據(jù)經(jīng)過業(yè)務(wù)處理層處理之后封裝成一個M...

    notebin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<