利用WebMvcConfigurerAdapter来配置springmvc相关内容

前言

最近,接手了一个项目,要开发迭代版本,那么久势必要看看这个项目原来的架构。
首先就去找了spring相关的配置文件,发现竟然没有,就奇怪了,那是怎么配置的呢?然后就想到了可能是用java类来配置的,果不其然,找到了相关的类,该类继承了WebMvcConfigurerAdapter,达到配置的目的。

配置代码

下面说说几个重要的配置,其他的都是大同小异,与xml配置一样,只是写法不一样罢了。
首先上代码:

@Configuration
@EnableWebMvc
@EnableCaching
@Import({ 
    CacheConfiguration.class,
    RedisConfiguration.class,
    MemcachedConfiguration.class
})
@ComponentScan(basePackages = { 
        "com.test.demo.app.converter"
        ,"com.test.demo.app.api"
        ,"com.test.demo.app.aop"
        ,"com.test.demo.app.mvc"
        ,"com.test.demo.app.config" })
@ImportResource({ "classpath:/dubbo-consumer.xml"
    })
public class MvcConfiguration extends WebMvcConfigurerAdapter {

    private Logger logger = LoggerFactory.getLogger(MvcConfiguration.class);

    @Bean
    //@Lazy
    public SpringContextHolder springContextHolder() {
        return new SpringContextHolder();
    }

    @Bean
    public FreeMarkerConfigurer freemarkerConfig(){
        FreeMarkerConfigurer config = new FreeMarkerConfigurer();
        config.setTemplateLoaderPath("/WEB-INF/template/");
        config.setDefaultEncoding("utf-8");
        Properties properties = new Properties();
        properties.setProperty("locale", "zh_CN");
        properties.setProperty("datetime_format", "yyyy-MM-dd HH:mm:ss");
        properties.setProperty("date_format", "yyyy-MM-dd");
        properties.setProperty("number_format", "#.##");
        properties.setProperty("template_exception_handler", "rethrow");
        properties.setProperty("object_wrapper", "beans");
        config.setFreemarkerSettings(properties);
        return config;
    }

    @Bean
    public FreeMarkerViewResolver viewResolver(){
        FreeMarkerViewResolver viewResover = new FreeMarkerViewResolver();
        viewResover.setCache(false);
        viewResover.setPrefix("");
        viewResover.setSuffix(".ftl");
        viewResover.setContentType("text/html;charset=UTF-8");
        viewResover.setRequestContextAttribute("request");
        viewResover.setExposeRequestAttributes(true);
        viewResover.setExposeSessionAttributes(true);
        viewResover.setExposeSpringMacroHelpers(true);
        return viewResover;
    }



    @Bean
    public static PropertyPlaceholderConfigurer properties() {
        PropertyPlaceholderConfigurer propertyPlaceholder = new PropertyPlaceholderConfigurer();
        ClassPathResource[] resources = new ClassPathResource[] { new ClassPathResource("app.properties") };
        propertyPlaceholder.setLocations(resources);
        propertyPlaceholder.setIgnoreUnresolvablePlaceholders(true);
        return propertyPlaceholder;
    }

    @Bean
    public CacheManager cacheManager(EhCacheManagerFactoryBean factory) {
        return new EhCacheCacheManager(factory.getObject());
    }

    @Bean
    public EhCacheManagerFactoryBean ehCacheCacheManager() {
        EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
        cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
        cmfb.setShared(true);
        return cmfb;
    }

    @Bean(name="localeResolver")
    public CookieLocaleResolver cookieLocaleResolver(){
        CookieLocaleResolver localResovler = new CookieLocaleResolver();
        localResovler.setDefaultLocale(Locale.CHINA);
        localResovler.setCookieName("locale");
        return localResovler;
    }


    /**
     * multipart上传配置
     * @return
     */
    @Bean
    public CommonsMultipartResolver multipartResolver(){
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(50 * 1024 * 1024l);  //50m
        return multipartResolver;
    }

    /**
     * api转发拦截器
     */
    @Bean
    public ApiForwardInterceptor apiForwardInterceptor() {
        logger.info("initializing ApiForwardInterceptor ...");
        return new ApiForwardInterceptor();
    }

    /**
     * web转发拦截器
     */
//  @Bean
//  public WebInterceptor webInterceptor(){
//      logger.info("initializing WebInterceptor ...");
//      return new WebInterceptor();
//  }

    /**
     * 拦截器配置
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(apiForwardInterceptor()).addPathPatterns("/test/**");
//      registry.addInterceptor(webInterceptor()).addPathPatterns("/qr/**");
        registry.addInterceptor(localeChangeInterceptor());
        super.addInterceptors(registry);
    }

      @Override  
      public void addResourceHandlers(ResourceHandlerRegistry registry) {  
          registry.addResourceHandler("/resources/**")  
          .addResourceLocations("/resources/");  
      }  

    /**
     * 国际化语言切换拦截器
     * @return
     */
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        logger.info("initializing LocaleChangeInterceptor ...");
        return new LocaleChangeInterceptor();
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Charset gbk = Charset.forName("GBK");
        Charset utf8 = Charset.forName("UTF-8");

        MyFastJsonHttpMessageConverter jsonConverter = new MyFastJsonHttpMessageConverter();
        jsonConverter.setSupportedMediaTypes(Arrays.asList(
                new MediaType("text", "html", utf8)
                , new MediaType("application", "json"), new MediaType("application", "*+json", gbk)
                , new MediaType("application", "json", utf8), new MediaType("application", "*+json", utf8)
                ));
        jsonConverter.setFeatures(
                SerializerFeature.DisableCircularReferenceDetect, 
                SerializerFeature.WriteMapNullValue, 
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteNullStringAsEmpty, 
                SerializerFeature.WriteNullBooleanAsFalse);
        converters.add(jsonConverter);
        super.configureMessageConverters(converters);
    }
}

解析

这里对上面的配置稍作解释:

1、关于注解

@Configuration :表示该类是一个配置类
@EnableWebMvc : 表示这个类开启了java webmvc 配置,与xml配置中的<mvc:annotation-driven>效果一致
@EnableCaching : 表示开启缓存
@Import({
CacheConfiguration.class,
RedisConfiguration.class,
MemcachedConfiguration.class
})
导入缓存配置,这里导入了多个缓存,可以根据自己需求增删。
@ComponentScan(basePackages = {
“com.test.demo.app.converter”
,”com.test.demo.app.api”
,”com.test.demo.app.aop”
,”com.test.demo.app.mvc”
,”com.test.demo.app.config” })
自动扫描包,basePackages指明基础包
@ImportResource({ “classpath:/dubbo-consumer.xml”
})
导入资源文件

2、配置bean

这里说几个一般都用的到的bean配置
SpringContextHolder : 用于持有ApplicationContext,方便获得springbean;
freemarkerConfig : freemarker的相关配置,用其他模板的也可以配置成其他模板;
PropertyPlaceholderConfigurer : 加载配置文件;
CommonsMultipartResolver : 上传相关配置;
addInterceptors :拦截器配置,增加拦截器钱,先要把相应的拦截器配置为bean;
configureMessageConverters : 数据转换bean

总结

大致的配置就是这些,其他还有很多配置就和xml是一致的,都是一样的道理,读者可自行研究。

猜你喜欢

转载自blog.csdn.net/u010398838/article/details/80053392