hiberna-validator 首次調用性能優化

 

spring集成hibernate-validator後,使用校驗器第一次進行校驗時,由於需要初始化導致第一次調用耗時過長,rpc中校驗很可能導致調用超時,所以下面使用啓動時初始化來解決

spring集成hibernate-validator配置:

 <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass"  value="org.hibernate.validator.HibernateValidator"/>
        <!--不設置則默認爲classpath下的 ValidationMessages.properties-->
        <!--<property name="validationMessageSource" ref="validatemessageSource"/>-->
    </bean>

 

掃描路徑下的class ,啓動時執行初始化方法

  /**
     * jsr-349校驗器
     */
    @Autowired
    private LocalValidatorFactoryBean localValidatorFactoryBean;



/**
     * valid預加載
     */
    @PostConstruct
    public void valideBoost(){
        scanFrom("需要掃描的包名");
        scanFrom("com.xxx.order.trade.export.req");

    }

    /**
     * 啓動加速!!!
     * @param basePackage
     */
    private void scanFrom(String basePackage){
        int count=0;
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        final String resourcePattern = "/**/*.class";
        String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(basePackage)
                + resourcePattern;
        try {
            Resource[] resources = resourcePatternResolver.getResources(pattern);
            MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(resourcePatternResolver);
            for (Resource resource : resources) {
                if (resource.isReadable()) {
                    MetadataReader reader = readerFactory.getMetadataReader(resource);
                    //掃描到的class
                    String className = reader.getClassMetadata().getClassName();
                    Class<?> clazz = Class.forName(className);
                    localValidatorFactoryBean.getConstraintsForClass(clazz);
                    count++;
                }
            }
        } catch (Exception e) {
            log.error("掃描包異常basePackage:{},e:{}",basePackage,e);
        }
        log.info("validator預加載:package:{},總數:{}",basePackage,count);
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章