前言
最近,接手了一个项目,要开发迭代版本,那么久势必要看看这个项目原来的架构。
首先就去找了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是一致的,都是一样的道理,读者可自行研究。