spring-applicationContext-bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd ">
<!--<context:property-placeholder location="classpath:/config/properties/*.properties"/>-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!--<value>classpath:config/properties/jdbc.properties</value>-->
<!--<value>classpath:config/properties/system.properties</value>-->
<value>classpath:config/properties/*.properties</value>
</list>
</property>
</bean>
<!--Spring线程池-->
<!--<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">-->
<!--<!– 线程池维护线程的最少数量 –>-->
<!--<property name="corePoolSize" value="5" />-->
<!--<!– 允许的空闲时间 –>-->
<!--<property name="keepAliveSeconds" value="3000" />-->
<!--<!– 线程池维护线程的最大数量 –>-->
<!--<property name="maxPoolSize" value="10" />-->
<!--<!– 缓存队列 –>-->
<!--<property name="queueCapacity" value="20" />-->
<!--<!– 对拒绝task的处理策略 –>-->
<!--<property name="rejectedExecutionHandler">-->
<!--<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />-->
<!--</property>-->
<!--</bean>-->
<!--
@Resource(name = "threadPoolTaskExecutor")
private ThreadPoolTaskExecutor taskExecutor;
taskExecutor.execute(new Runnable(){
public void run() {
try {
LOG.info("执行线程任务开始前");
Thread.currentThread().sleep(10000);
if (LOG.isDebugEnabled()) {
LOG.info("执行线程任务结束");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
-->
<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="5" />
<task:annotation-driven executor="executor" scheduler="scheduler" />
</beans>
spring-applicationContext-database.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
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">
<description>数据源相关定义</description>
<!-- 阿里 druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 给数据源取个名字 -->
<property name="name" value="${name}"/>
<!-- 数据库基本信息配置 -->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="driverClassName" value="${driverClassName}"/>
<!-- 最大并发连接数 -->
<property name="maxActive" value="${maxActive}"/>
<!-- 初始化连接数量 -->
<property name="initialSize" value="${initialSize}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${maxWait}"/>
<!-- 最小空闲连接数 -->
<property name="minIdle" value="${minIdle}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}"/>
<property name="validationQuery" value="${validationQuery}"/>
<property name="testWhileIdle" value="${testWhileIdle}"/>
<property name="testOnBorrow" value="${testOnBorrow}"/>
<property name="testOnReturn" value="${testOnReturn}"/>
<property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}"/>
<!-- 打开 removeAbandoned 功能 -->
<property name="removeAbandoned" value="${removeAbandoned}"/>
<!-- 1800 秒,也就是 30 分钟 -->
<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}"/>
<!-- 关闭 abanded 连接时输出错误日志 -->
<property name="logAbandoned" value="${logAbandoned}"/>
<!--属性类型是字符串,通过别名的方式配置扩展插件,
常用的插件有:
监控统计用的filter:stat
日志用的filter:log4j
防御sql注入的filter:wall-->
<property name="filters" value="${filters}"/>
</bean>
<!-- MYBATIS 配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:config/xml/mybatis-config.xml" />
<property name="dataSource" ref="dataSource"/>
<!--<property name="mapperLocations" value="classpath*:sql-mappers/**/*.xml"/>-->
<property name="mapperLocations">
<list>
<value>classpath*:sql-mappers/**/*.xml</value>
</list>
</property>
<!-- 分页插件 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
helperDialect=mysql
closeConn=false
pageSizeZero=true
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
<!--<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">-->
<!--<property name="mapperInterface" value="nightelf.dao.BaseDao"/>-->
<!--<property name="sqlSessionFactory" ref="sqlSessionFactory"/>-->
<!--</bean>-->
<!-- 扫描数据访问层,组装数据访问接口实现类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="nightelf.dao"/>
</bean>
<!-- 配置SqlSessionTemplate -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!--事务配置-->
<!--声明式事务 Start -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
<!--声明式事务 End -->
<!-- 通用事务通知 -->
<!--
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config expose-proxy="true">
<aop:pointcut id="txPointcut" expression="execution(* com.digitalchina.*.service.*(..))"/>
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
-->
<!-- hibernate -->
<!--
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<!– 可以加多个包 –>
<!–<value>com.wq.entity</value>–>
</list>
</property>
<property name="hibernateProperties">
<!–
<props>
<prop key="hibernate.hbm2ddl.auto">none</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.query.substitutions">true 1, false 0</prop>
<prop key="hibernate.default_batch_fetch_size">16</prop>
<prop key="hibernate.max_fetch_depth">2</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.bytecode.use_reflection_optimizer">true</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
</props>
–>
<value>
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=false
#开启二级缓存
hibernate.cache.use_second_level_cache=true
#开启二级查询缓存
hibernate.cache.use_query_cache=true
#设置二级缓存的提供者
hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
</value>
</property>
</bean>
-->
</beans>
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 注解式 AOP @aspectJ -->
<!-- 激活自动代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<context:component-scan base-package="nightelf.**.mapping, nightelf.**.impl, nightelf.lib.service"/>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/>
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 让SpringMVC使用默认的Servlet来响应静态文件 -->
<!-- 配置默认Servlet来处理静态资源访问 -->
<!-- <mvc:default-servlet-handler default-servlet-name=""/> -->
<!-- 配置根视图 -->
<!--<mvc:view-controller path="/" view-name="index" />-->
<!-- 文件上传必须定义此bean -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
<property name="defaultEncoding" value="utf-8"></property>
</bean>
<!-- 定义不被SpringMVC过滤的静态资源 -->
<mvc:resources location="/resources/" mapping="/resources/**"/>
<mvc:resources location="/html/" mapping="/html/**"/>
<!-- SpringMVC 异常拦截 -->
<!-- <controller class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> -->
<!-- 表示当抛出NumberFormatException的时候就返回名叫number的视图 -->
<!--
<property name="exceptionMappings">
<props>
<prop key="java.lang.NullPointerException">WEB-INF/error/error</prop>
</props>
</property>
-->
<!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<!--<property name="suffix" value=".jsp"/>-->
<!-- 需要引入jstl包-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
</bean>
<bean class="nightelf.lib.exception.RequestMappingExceptionManager"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!--<mvc:exclude-mapping path="/src/**" />-->
<bean class="nightelf.lib.Interceptor.NightElfInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 配个日志 -->
<configuration>
<settings>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="cacheEnabled" value="false"/>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--<typeAliases>-->
<!--<package name="com.entityVo.common.log"/>-->
<!--</typeAliases>-->
</configuration>
log4j.properties
# Set log levels
log4j.rootLogger = ${log4j.log.level},LogFile,Console
# Output the log info to the Java Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
# Save the log info to the log file one day.
log4j.appender.LogFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.LogFile.File = ${log4j.logfile.path}
log4j.appender.LogFile.Append = true
log4j.appender.LogFile.ImmediateFlush = true
log4j.appender.LogFile.Threshold = ${log4j.log.level}
log4j.appender.LogFile.Encoding = UTF-8
log4j.appender.LogFile.layout = org.apache.log4j.PatternLayout
log4j.appender.LogFile.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
log4j.appender.LogFile.DatePattern ='.'yyyy-MM-dd-HH
#ibatis logger config
log4j.logger.com.ibatis=${log4j.log.level}
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=${log4j.log.level}
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=${log4j.log.level}
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=${log4j.log.level}
log4j.logger.java.sql.Connection=${log4j.log.level}
log4j.logger.java.sql.Statement=${log4j.log.level}
log4j.logger.java.sql.PreparedStatement=${log4j.log.level}
log4j.logger.java.sql.ResultSet =${log4j.log.level}
log4j.logger.druid.sql.Statement=debug,Console
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>interface</display-name>
<welcome-file-list>
<welcome-file>/html/index.html</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 解决java.beans.Introspector导致的内存泄漏的问题 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/xml/spring-applicationContext-bean.xml</param-value>
</context-param>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<!--<dispatcher>INCLUDE</dispatcher>-->
</filter-mapping>
<!-- 可以继承一下 processHandlerException -->
<servlet>
<servlet-name>springMvc</servlet-name>
<!--<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>-->
<servlet-class>nightelf.lib.servlet.NightelfDispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/xml/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/</url-pattern>
<!--<url-pattern>*.do</url-pattern>-->
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<!-- 这个是阿里连接池的查看工具,前提要在dataSource里面配置好 -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
<!-- spring 代理 filter-->
<!--
<filter>
<filter-name>SSOSessionFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>ssoSessionFilter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SSOSessionFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
-->
<!--
<servlet>
<servlet-name>ErrorServlet</servlet-name>
<servlet-class>nightelf.lib.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ErrorServlet</servlet-name>
<url-pattern>/nightelf_error</url-pattern>
</servlet-mapping>-->
<!--
<filter>
<filter-name>NightElfFilter</filter-name>
<filter-class>nightelf.lib.filter.NightElfFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NightElfFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->
<!--
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/nightelf_error</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/nightelf_error</location>
</error-page>
<error-page>
<error-code>400</error-code>
<location>/nightelf_error</location>
</error-page>
<error-page>
<error-code>405</error-code>
<location>/nightelf_error</location>
</error-page>
-->
<!--<error-page>-->
<!--<error-code>500</error-code>-->
<!--<location>/nightelf_error</location>-->
<!--</error-page>-->
<!-- 这个配置就是指定log4j 配置文件路径 -->
<!--<listener>-->
<!--<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>-->
<!--</listener>-->
<!--<context-param>-->
<!--<param-name>log4jConfigLocation</param-name>-->
<!--<param-value>classpath*:log4j.properties</param-value>-->
<!--</context-param>-->
<!--log4jRefreshInterval为60000表示 开一条watchdog线程每60秒扫描一下配置文件的变化;这样便于日志存放位置的改变-->
<!--<context-param>-->
<!--<param-name>log4jRefreshInterval</param-name>-->
<!--<param-value>60000</param-value>-->
<!--</context-param>-->
</web-app>