最近工做須要用到springmvc4,好久沒用spring了變化仍是很大,記錄下搭建一個基於annotation的零配置文件的spring、springmvc、jpa、bootstrap的簡單框架。java
@Configuration : 相似於spring配置文件,負責註冊bean,對應的提供了@Bean註解。須要org.springframework.web.context.support.AnnotationConfigWebApplicationContext註冊到容器中。 @ComponentScan : 註解類查找規則定義 <context:component-scan/> @EnableAspectJAutoProxy : 激活Aspect自動代理 <aop:aspectj-autoproxy/> @Import @ImportResource: 關聯其它spring配置 <import resource="" /> @EnableCaching :啓用緩存註解 <cache:annotation-driven/> @EnableTransactionManagement : 啓用註解式事務管理 <tx:annotation-driven /> @EnableWebMvcSecurity : 啓用springSecurity安全驗證
#servlet3.0mysql
Servlet3.0規範,支持將web.xml相關配置也硬編碼到代碼中[servlet,filter,listener,等等],並由javax.servlet.ServletContainerInitializer的實現類負責在容器啓動時進行加載, spring提供了一個實現類org.springframework.web.SpringServletContainerInitializer, 該類會調用全部org.springframework.web.WebApplicationInitializer的實現類的onStartup(ServletContext servletContext)方法,將相關的組件註冊到服務器;web
spring同時提供了一些WebApplicationInitializer的實現類供咱們繼承,以簡化相關的配置,好比: org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer : 註冊spring DispatcherServlet org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer : 註冊springSecurityspring
同時,spring也提供了一些@Configuration的支持類供咱們繼承,以簡化相關@Configuration的配置,好比: org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport : 封裝了springmvc相關組件,咱們能夠經過註冊新的@Bean和@Override相關方法,以實現對各個組件的註冊; org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter : 封裝類springsecurity相關組件sql
#WebConfig classbootstrap
import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.web.context.support.ServletContextAttributeExporter; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.i18n.CookieLocaleResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.servlet.view.ResourceBundleViewResolver; @Configuration @EnableWebMvc @ComponentScan(basePackages="com.xxx.controller") public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(new String[] { "/resources/**" }).addResourceLocations(new String[] { "/resources/" }).setCachePeriod(360000); } @Override public void configureDefaultServletHandling( DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Bean public ServletContextAttributeExporter servletContextAttributeExporter(){ ServletContextAttributeExporter exporter =new ServletContextAttributeExporter(); Map<String, Object> attributes = new HashMap<String, Object>(); attributes.put("version", new SimpleDateFormat("yyMMddHHmmss").format(new Date())); exporter.setAttributes(attributes); return exporter; } @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); // resolver.setMaxUploadSize(102400); return resolver; } @Bean public ViewResolver resourceBundleViewResolver(){ ResourceBundleViewResolver resolver = new ResourceBundleViewResolver(); resolver.setBasename("views"); resolver.setOrder(1); return resolver; } @Bean public ViewResolver interalResourceViewResolver(){ InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setViewClass(JstlView.class); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); resolver.setOrder(2); return resolver; } @Bean public MessageSource messageSource(){ ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); messageSource.setBasenames("classpath:messages/messages", "classpath:messages/validation"); // if true, the key of the message will be displayed if the key is not // found, instead of throwing a NoSuchMessageException messageSource.setUseCodeAsDefaultMessage(true); messageSource.setDefaultEncoding("UTF-8"); // # -1 : never reload, 0 always reload messageSource.setCacheSeconds(0); return messageSource(); } @Bean public LocaleResolver localeResolver(){ CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver(); cookieLocaleResolver.setDefaultLocale(org.springframework.util.StringUtils.parseLocaleString("en")); return cookieLocaleResolver; } }
#WebInitializer class緩存
import java.util.EnumSet; import java.util.Set; import javax.servlet.FilterRegistration; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import javax.servlet.SessionTrackingMode; import org.springframework.core.env.PropertyResolver; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.filter.DelegatingFilterProxy; import org.springframework.web.filter.HiddenHttpMethodFilter; import org.springframework.web.servlet.DispatcherServlet; public class WebInitializer implements WebApplicationInitializer { private PropertyResolver properties; public void onStartup(ServletContext servletContext) throws ServletException { servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE)); addRootContext(servletContext); addWebContext(servletContext); addFilters(servletContext); } private void addFilters(ServletContext servletContext) { FilterRegistration.Dynamic springSecurityFilterChain = servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy()); springSecurityFilterChain.addMappingForUrlPatterns(null, false, "/*"); FilterRegistration.Dynamic httpMethodFilter = servletContext.addFilter("httpMethodFilter", new HiddenHttpMethodFilter()); httpMethodFilter.addMappingForUrlPatterns(null, false, "/*"); } public void addRootContext(ServletContext servletContext){ AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); String profile = properties.getProperty("spring.profile", "default"); rootContext.getEnvironment().setActiveProfiles(profile); rootContext.refresh(); servletContext.addListener(new ContextLoaderListener(rootContext)); servletContext.setInitParameter("defaultHtmlEscape", "true"); } public void addWebContext(ServletContext servletContext) { AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext(); mvcContext.register(WebConfig.class); ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(mvcContext)); dispatcher.setLoadOnStartup(1); Set<String> mappingConflicts = dispatcher.addMapping("/"); if (!mappingConflicts.isEmpty()) { throw new IllegalStateException("'dispatcher' cannot be mapped to '/' under Tomcat versions <= 7.0.14"); } } }