利用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是一致的,都是一样的道理,读者可自行研究。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
配置SpringMVC,您可以按照以下步骤进行操作: 1. 在您的项目中打开`src/main/webapp/WEB-INF/web.xml`文件。 2. 在`web.xml`文件中,配置SpringMVC的Servlet。您需要添加以下代码片段: ```xml <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置springmvc.xml的路径 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 3. 创建一个名为`springmvc.xml`的配置文件,并将其放置在`src/main/resources`目录下。在`springmvc.xml`中,您可以配置SpringMVC相关组件,如DispatcherServlet、HandlerMapping、HandlerAdapter等。 4. 在`springmvc.xml`中,您可以使用以下核心组件来实现MVC设计模式: - DispatcherServlet:前置控制器 - Handler:处理器,完成具体业务逻辑 - HandlerMapping:将请求映射到Handler - HandlerInterceptor:处理器拦截器 - HandlerExecutionChain:处理器执行链 - HandlerAdapter:处理器适配器 - ModelAndView:装载模型数据和视图信息 - ViewResolver:视图解析器 5. 完成以上配置后,SpringMVC的工作流程将会如下所示: - 当有请求进入时,DispatcherServlet将会拦截并处理该请求。 - 根据配置的HandlerMapping,DispatcherServlet将会将请求映射到相应的Handler。 - Handler将会处理具体的业务逻辑并生成相应的ModelAndView。 - ModelAndView将会被传递给ViewResolver,以解析到对应的视图。 - 最终,DispatcherServlet将会将处理结果返回给客户端。 通过以上步骤,您就可以成功配置SpringMVC并使用它来实现MVC设计模式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值