借助于servlet3.0和spring3.1的功能增强吗,搭建项目不再依靠配置web.xml,可以通过扩展AbstractAnnotationConfigDispatcherServletInitializer来进行应用的配置,如下:
package com.fireyao;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.Filter;
/**
* Created by lly on 2017/8/31
*/
public class SpittrWebAppInitialzer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 加载spring相关配置
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
/**
* 加载springmvc相关配置
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
/**
* 将DispatcherServlet映射到 "/"
*
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
/**
* 这里注册的所有过滤器,都会映射到DispatcherServlet
* 就是说这里的过滤器过滤规则是 /*
* 所有的请求都会先到这里注册的过滤器中
*
* @return
*/
@Override
protected Filter[] getServletFilters() {
return new Filter[]{
new CharacterEncodingFilter("UTF-8", true)
};
}
}
spring容器配置:
package com.fireyao;
import com.alibaba.druid.pool.DruidDataSource;
import com.fireyao.aop.EncoreableIntroducer;
import com.fireyao.aop.Minstrel;
import com.fireyao.bean.*;
import org.hibernate.spatial.dialect.postgis.PostgisDialect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import javax.annotation.processing.SupportedAnnotationTypes;
import java.util.HashMap;
import java.util.Map;
/**
* 相当于applicationContext.xml
* Created by lly on 2017/8/31
*/
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@EnableJpaRepositories(basePackages = {"com.fireyao.repository"},
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager")
@PropertySource(value = {"classpath:db.properties", "classpath:hibernate.properties", "classpath:app.properties"})
@ComponentScan(basePackages = "com.fireyao",
excludeFilters = {
@ComponentScan.Filter(
type = FilterType.ANNOTATION, value = EnableWebMvc.class
)})
@EnableAspectJAutoProxy(proxyTargetClass = true)
/**
* proxyTargetClass = true ==> 使用cglib代理
* proxyTargetClass = false(默认) ==> 使用JDK代理
*/
public class RootConfig {
@Autowired
Environment environment;
@Value("${disc.title}")
private String TITLE;
@Value("${disc.artist}")
private String ARTIST;
@Value(value = "${db.driver:org.postgresql.Driver}")
private String DRIVERCLASSNAME;
@Value("${db.username}")
private String USERNAME;
@Value("${db.password}")
private String PASSWORD;
@Value("${db.jdbcURL}")
private String URL;
@Value("${hibernate.hbm2dll.create_namespaces}")
private String CREATE_NAMESPACES;
@Value("${hibernate.hbm2ddl.auto}")
private String HBM2DDL_AUTO;
@Value("${hibernate.show_sql}")
private String SHOW_SQL;
@Value("${hibernate.format_sql}")
private String FORMAT_SQL;
@Value("${hibernate.generate_statistics}")
private String GENERATE_STATISTICS;
@Bean(name = "dataSource")
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(DRIVERCLASSNAME);
dataSource.setUrl(URL);
dataSource.setUsername(USERNAME);
dataSource.setPassword(PASSWORD);
/* 配置初始化大小、最小、最大*/
dataSource.setInitialSize(5);
dataSource.setMinIdle(5);
dataSource.setMaxActive(20);
/* 配置获取连接等待超时的时间*/
dataSource.setMaxWait(30000);
/*配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒*/
dataSource.setTimeBetweenEvictionRunsMillis(60000);
/*配置一个连接在池中最小生存的时间,单位是毫秒*/
dataSource.setMinEvictableIdleTimeMillis(300000);
/*申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效*/
dataSource.setTestWhileIdle(true);
dataSource.setValidationQuery("select 1");
return dataSource;
}
@Bean
public HibernateJpaVendorAdapter hibernateJpaVendorAdapter() {
return new HibernateJpaVendorAdapter();
}
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DruidDataSource dataSource,
HibernateJpaVendorAdapter hibernateJpaVendorAdapter) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource);
entityManagerFactory.setJpaVendorAdapter(hibernateJpaVendorAdapter);
entityManagerFactory.setPackagesToScan("com.fireyao.domain");
/*指定JPA属性;如Hibernate中指定是否显示SQL的是否显示、方言等*/
Map<String, Object> jpaProp = new HashMap();
jpaProp.put("hibernate.dialect", new PostgisDialect());
jpaProp.put("hibernate.hbm2ddl.auto", HBM2DDL_AUTO);
jpaProp.put("hibernate.show_sql", SHOW_SQL);
jpaProp.put("hibernate.generate_statistics", GENERATE_STATISTICS);
jpaProp.put("hibernate.format_sql", FORMAT_SQL);
jpaProp.put("hibernate.hbm2dll.create_namespaces", CREATE_NAMESPACES);
entityManagerFactory.setJpaPropertyMap(jpaProp);
return entityManagerFactory;
}
/**
* 事务管理器
*
* @param entityManagerFactory
* @return
*/
@Bean(name = "transactionManager")
public JpaTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory.getObject());
}
@Bean
public EncoreableIntroducer encoreableIntroducer() {
return new EncoreableIntroducer();
}
@Bean
public Minstrel minstrel() {
return new Minstrel();
}
@Bean
public Quest quest() {
return new SlayDragonQuest();
}
@Bean(name = "knight")
public Knights knights() {
return new BraveKnight(quest());
}
@Bean(name = "express")
public ExpressiveBean expressiveBean() {
// return new ExpressiveBean(environment.getProperty("disc.title"),
// environment.getProperty("disc.artist"));
return new ExpressiveBean(TITLE, ARTIST);
}
}
springmvc相关配置:
package com.fireyao;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
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.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
import java.util.ArrayList;
import java.util.List;
/**
* 相当于springmvc-servlet.xml
* Created by lly on 2017/8/31
*/
@Configuration
@EnableWebMvc//启用spring mvc
@ComponentScan(basePackages = "com.fireyao.controller") //启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
fastConverter.setFastJsonConfig(fastJsonConfig);
converters.add(fastConverter);
}
/**
* Thymeleaf视图解析器
*
* @param springTemplateEngine
* @return
*/
@Bean
public ThymeleafViewResolver viewResolver(SpringTemplateEngine springTemplateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(springTemplateEngine);
viewResolver.setCharacterEncoding("utf-8");
return viewResolver;
}
/**
* 模版引擎
*
* @param iTemplateResolver
* @return
*/
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(iTemplateResolver);
return templateEngine;
}
/**
* Thymeleaf3.0之后
* Thymeleaf模版解析器
*
* @return
*/
@Bean
public ITemplateResolver iTemplateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setTemplateMode("HTML5");
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML");
templateResolver.setCharacterEncoding("utf-8");
templateResolver.setCacheable(false);
return templateResolver;
}
/**
* Thymeleaf3.0之前
* Thymeleaf模版解析器
* @return
*/
/* @Bean
public TemplateResolver templateResolver() {
TemplateResolver resolver = new ServletContextTemplateResolver();
resolver.setPrefix("/WEB-INF/VIEWS/");
resolver.setSuffix(".html");
resolver.setTemplateMode("HTML5");
resolver.setCacheable(false);
return resolver;
}*/
/**
* 配置静态资源的处理
* 要求DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上
* 而不是使用DispatcherServlet本身来处理此类请求。
*
* @param configurer
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* 配置视图解析器
* ==> JSP视图
*
* @return
*/
/*@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}*/
}
即可实现与传统web搭建一样的效果。