前言
传统的 XML 文件配置整合 SSM 框架是不是很繁琐? 如果框架搭建好了想移植到另外一个项目,又要在各种 XML 文件中许多参数, 缺少很快的配置移植性。
针对这些麻烦的问题,我做了一种 JavaConfig 自动整合方案,几乎不需要编写任何 XML 文件,包括 web.xml 文件。仅仅配置数据库的连接属性,三个框架就搭建完成了。
项目结构
Application.java 是核心配置类,所有的整合配置全部在里面。该类使用注解的方式配置了 Spring Bean ,使用 WebApplicationInitializer 接口配置了 web.xml 中的内容。
application.xml 是 Spring 的核心配置文件,主要只需要配置扫描的包即可
Application.java
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletRegistration;
/**
* SSMBoot Core Configuration Object 简化版
*
* Application.java 位置必须在项目最外层
* application.xml 配置文件名必须一致, 所有 Spring 的配置必须在该文件内
*
* @author haidnor
*/
public class Application {
static final String DRUID_URL = "jdbc:mysql://wangxiang.zone:33061/ssm";
static final String DRUID_USERNAME = "root";
static final String DRUID_PASSWORD = "root";
static final String DRUID_DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
/* Default ------------------------------------------------------------------------------------------------------ */
static final String SPRING_MVC_VIEW_RESOLVER_PREFIX = "/";
static final String SPRING_MVC_VIEW_RESOLVER_SUFFIX = ".html";
static final String APPLICATION = Application.class.getPackage().getName();
static final String MAPPER_PACKAGE = APPLICATION;
static final String MYBATIS_TYPE_ALIASES_PACKAGE = APPLICATION;
static final String MYBATIS_MAPPER_LOCATIONS = "classpath*:" + APPLICATION.replace('.', '/') + "/**.xml";
/* WebApplicationInitializer ------------------------------------------------------------------------------------ */
static class WebContext implements WebApplicationInitializer {
ServletContext servletContext = null;
@Override
public void onStartup(ServletContext container) {
servletContext = container;
addDispatcherServlet();
addDruidStatViewServlet();
addCharacterEncodingFilter();
addContextLoaderListener();
addDruidWebStatFilter();
}
void addDispatcherServlet() {
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("classpath:application.xml");
ServletRegistration.Dynamic dispatcherServlet =
servletContext.addServlet("DispatcherServlet", new DispatcherServlet(appContext));
dispatcherServlet.setLoadOnStartup(1);
dispatcherServlet.addMapping("/");
}
void addDruidStatViewServlet() {
StatViewServlet statViewServlet = new StatViewServlet();
ServletRegistration.Dynamic druidStatView =
servletContext.addServlet("DruidStatView", statViewServlet);
}
void addDruidWebStatFilter() {
WebStatFilter webStatFilter = new WebStatFilter();
webStatFilter.isExclusion("*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
FilterRegistration.Dynamic druidWebStatFilter =
servletContext.addFilter("DruidWebStatFilter", webStatFilter);
druidWebStatFilter.addMappingForUrlPatterns(null, false, "/*");
}
void addCharacterEncodingFilter() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
FilterRegistration.Dynamic encodingFilter =
servletContext.addFilter("characterEncodingFilter", characterEncodingFilter);
encodingFilter.addMappingForUrlPatterns(null, false, "/");
}
void addContextLoaderListener() {
servletContext.setInitParameter("contextConfigLocation", "classpath:application.xml");
servletContext.addListener(new ContextLoaderListener());
}
}
// Components ------------------------------------------------------------------------------------------------------
@Configuration
static class DataSource {
static final DruidDataSource DRUID_DATA_SOURCE = druidDataSource();
@Bean
MapperScannerConfigurer mapperScanner() {
MapperScannerConfigurer mapperScanner = new MapperScannerConfigurer();
mapperScanner.setBasePackage(MAPPER_PACKAGE);
mapperScanner.setSqlSessionFactoryBeanName("sqlSessionFactory");
return mapperScanner;
}
@Bean("sqlSessionFactory")
SqlSessionFactoryBean sqlSessionFactoryBean() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(DRUID_DATA_SOURCE);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MYBATIS_MAPPER_LOCATIONS));
sqlSessionFactoryBean.setTypeAliasesPackage(MYBATIS_TYPE_ALIASES_PACKAGE);
return sqlSessionFactoryBean;
}
@Bean
DataSourceTransactionManager dataSourceTransactionManager() {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(DRUID_DATA_SOURCE);
return transactionManager;
}
@Bean
static DruidDataSource druidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(DRUID_DRIVER_CLASS_NAME);
dataSource.setUrl(DRUID_URL);
dataSource.setUsername(DRUID_USERNAME);
dataSource.setPassword(DRUID_PASSWORD);
return dataSource;
}
}
@Configuration
@EnableWebMvc
static class Web {
@Bean
ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix(SPRING_MVC_VIEW_RESOLVER_PREFIX);
viewResolver.setSuffix(SPRING_MVC_VIEW_RESOLVER_SUFFIX);
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}
}
}
application.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
maven
UTF-8
1.8
1.8
4.11
1.2
1.2.17
5.0.8.RELEASE
1.8.13
1.0
5.1.49
1.0.9
3.4.5
1.3.1
7.0
2.9.5
junit
junit
${junit.version}
test
commons-logging
commons-logging
${commons-logging.version}
javax
javaee-api
jar
${javaee-api.version}
compile
false
log4j
log4j
${log4j.version}
org.springframework
spring-beans
${org.springframework.version}
org.springframework
spring-core
${org.springframework.version}
org.springframework
spring-context
${org.springframework.version}
org.springframework
spring-expression
${org.springframework.version}
org.springframework
spring-context-support
${org.springframework.version}
org.springframework
spring-context-indexer
${org.springframework.version}
org.springframework
spring-aop
${org.springframework.version}
org.springframework
spring-aspects
${org.springframework.version}
org.springframework
spring-instrument
${org.springframework.version}
org.springframework
spring-messaging
${org.springframework.version}
org.springframework
spring-jdbc
${org.springframework.version}
org.springframework
spring-orm
${org.springframework.version}
org.springframework
spring-oxm
${org.springframework.version}
org.springframework
spring-jms
${org.springframework.version}
org.springframework
spring-tx
${org.springframework.version}
org.springframework
spring-websocket
${org.springframework.version}
org.springframework
spring-web
${org.springframework.version}
org.springframework
spring-webmvc
${org.springframework.version}
org.springframework
spring-webflux
${org.springframework.version}
org.springframework
spring-test
${org.springframework.version}
mysql
mysql-connector-java
${mysql-connector-java.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
${mybatis-spring.version}
com.alibaba
druid
${druid.version}
com.fasterxml.jackson.core
jackson-core
${jackson.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
com.fasterxml.jackson.core
jackson-annotations
${jackson.version}
com.fasterxml.jackson.module
jackson-module-jaxb-annotations
${jackson.version}
SSMBoot
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
/
8080
src/main/java
**/*.*
src/main/resources
**/*.*
true