spring+spring mvc+mybatis plus+jpa+freeMarker+redis+swagger2集成

1、前序

    以前我集成過spring+spring mvc+mybatis+jpa+freeMarker+redis的框架,也使用了一段時間,發現其中的問題也是有不少的,至此我在原來的框架上作了升級和優化,集成了這個新的框架,一個好的框架,對於開發速度來講,是有很大提高的,反之框架很差用,開發速度也會受到很大的影響,此篇博客我會詳細說明一些這些框架的坑,以及處理方案;

   框架環境

          maven:3.0版本 阿里公開庫(http://maven.aliyun.com/nexus/content/groups/public//)

      jdk:1.8

      tomcat:8.5

      開發工具:idea2017

      數據庫:mysql 5.6

     如框架有啥不足之處,但願各位大神指出,我會積極改進優化

2、開始集成

 一、項目結構

 

 

 

 二、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.SPJ</groupId>
    <artifactId>SPJ</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>SPJ Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <properties>
        <!-- 設置項目編碼編碼 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!-- spring版本號 -->
        <spring.version>5.2.0.RELEASE</spring.version>
    </properties>

    <dependencies>

        <!-- freemarker模板-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.29</version>
        </dependency>

        <!-- java ee -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>8.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- 單元測試 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>


        <!-- jedis依賴 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.7.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-tx</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-aop</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-data-commons</artifactId>
                    <groupId>org.springframework.data</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 數據庫 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.41</version>
            <scope>runtime</scope>
        </dependency>
        <!-- mybais puls -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.2.0</version>
        </dependency>


        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-aop</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- 鏈接池配置包 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>


        <!-- spring data jpa 數據庫持久層 -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>

        <!-- hibernate核心包 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.5.Final</version>
            <exclusions>
                <exclusion>
                    <artifactId>javassist</artifactId>
                    <groupId>org.javassist</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- hibernate實體管理包 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.5.Final</version>
            <exclusions>
                <exclusion>
                    <artifactId>javassist</artifactId>
                    <groupId>org.javassist</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- optional -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-osgi</artifactId>
            <version>4.3.5.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-envers</artifactId>
            <version>4.3.5.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>4.3.5.Final</version>
            <exclusions>
                <exclusion>
                    <artifactId>mchange-commons-java</artifactId>
                    <groupId>com.mchange</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>c3p0</artifactId>
                    <groupId>com.mchange</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-proxool</artifactId>
            <version>4.3.5.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-infinispan</artifactId>
            <version>4.3.5.Final</version>
            <exclusions>
                <exclusion>
                    <artifactId>jboss-logging</artifactId>
                    <groupId>org.jboss.logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>4.3.5.Final</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>


        <!-- 上傳組件包 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-io</artifactId>
                    <groupId>commons-io</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.13</version>
        </dependency>

        <!-- 分頁依賴 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.10</version>
        </dependency>

        <!-- 解析表格依賴-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-codec</artifactId>
                    <groupId>commons-codec</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--處理2007 excel-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.16</version>
        </dependency>

        <!-- gson 解析 -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
        </dependency>

        <!-- 定時器Quertz -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.1</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>c3p0</artifactId>
                    <groupId>com.mchange</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- token使用json -->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
            <exclusions>
                <exclusion>
                    <artifactId>commons-lang</artifactId>
                    <groupId>commons-lang</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 時間格式化-->
        <!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
            <exclusions>
                <exclusion>
                    <artifactId>jackson-annotations</artifactId>
                    <groupId>com.fasterxml.jackson.core</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>


        <!-- Commons.Lang -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>


        <!-- 事物管理  -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>


        <!-- 請求頭參數分析包 -->
        <dependency>
            <groupId>eu.bitwalker</groupId>
            <artifactId>UserAgentUtils</artifactId>
            <version>1.21</version>
        </dependency>
        <!-- 請求頭參數分析包 -->
        <dependency>
            <groupId>cz.mallat.uasparser</groupId>
            <artifactId>uasparser</artifactId>
            <version>0.6.2</version>
        </dependency>
        <!-- 請求頭參數分析包 -->
        <dependency>
            <groupId>net.sourceforge.jregex</groupId>
            <artifactId>jregex</artifactId>
            <version>1.2_01</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.10</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-codec</artifactId>
                    <groupId>commons-codec</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>jackson-annotations</artifactId>
                    <groupId>com.fasterxml.jackson.core</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-aop</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>swagger-annotations</artifactId>
                    <groupId>io.swagger</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>swagger-models</artifactId>
                    <groupId>io.swagger</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.6</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.5.21</version>
            <exclusions>
                <exclusion>
                    <artifactId>jackson-annotations</artifactId>
                    <groupId>com.fasterxml.jackson.core</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>SPJ</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <!-- 設置JDK版本 -->
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

三、spring-mvc.xml(掃描bean,配置靜態資源,加載配置文件,加載ftl模板,json轉換,日期轉換,攔截器配置,線程池配置,配置log切面日誌)

<?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:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-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/tx
                            http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
                            http://www.springframework.org/schema/cache
                            http://www.springframework.org/schema/cache/spring-cache.xsd
                            xmlns:task=http://www.springframework.org/schema/task
                            http://www.springframework.org/schema/task/spring-task-3.2.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    <!-- 掃描web相關的controller -->
    <context:component-scan base-package="com.spj.controller"/>
    <!-- 掃描web相關的service -->
    <context:component-scan base-package="com.spj.service"/>
    <!-- 掃描web相關的jpa -->
    <context:component-scan base-package="com.spj.jpa"/>
    <!-- 掃描web相關的task -->
    <context:component-scan base-package="com.spj.task"/>
    <!-- 掃描web相關的config-->
    <context:component-scan base-package="com.spj.config"/>

    <!-- 映入redis配置文件 -->
    <import resource="spring-redis.xml"/>

    <!-- 靜態資源默認servlet配置 -->
    <mvc:default-servlet-handler/>

    <!-- 處理靜態資源文件 -->
    <mvc:resources mapping="/static/**" location="/static/" />


    <!-- 加載系統參數配置文件 -->
    <context:property-placeholder location="classpath:sysconfig.properties" ignore-unresolvable="true"/>

    <!-- 配置文件上傳,若是沒有使用文件上傳能夠不用配置,固然若是不配,那麼配置文件中也沒必要引入上傳組件包 -->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 默認編碼 -->
        <property name="defaultEncoding" value="utf-8"/>
        <!-- 文件大小最大值 -->
        <property name="maxUploadSize" value="10485760000"/>
        <!-- 內存中的最大值 -->
        <property name="maxInMemorySize" value="40960"/>
    </bean>

    <!-- 配置freeMarker視圖解析器 -->
    <bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
        <property name="contentType" value="text/html; charset=UTF-8"/>
        <property name="exposeRequestAttributes" value="true"/>
        <property name="exposeSessionAttributes" value="true"/>
        <property name="exposeSpringMacroHelpers" value="true"/>
        <property name="requestContextAttribute" value="request"/>
        <property name="allowSessionOverride" value="true"/>
        <property name="cache" value="true"/>
        <property name="suffix" value=".ftl"/>
        <property name="prefix" value=""/>
        <property name="order" value="0"/>
    </bean>

    <!-- 配置freeMarker的模板路徑 -->
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <!--<property name="templateLoaderPath" value="/WEB-INF/ftl/"/>-->
        <property name="templateLoaderPaths">
            <list>
                <value>/WEB-INF/views/</value>
            </list>
        </property>
        <property name="freemarkerVariables">
            <map>
                <entry key="xml_escape" value-ref="fmXmlEscape"/>
            </map>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">1</prop>
                <prop key="number_format">#.##</prop>
                <prop key="object_wrapper">freemarker.ext.beans.BeansWrapper</prop>
                <prop key="template_exception_handler">com.spj.config.MyFtlTemplateExceptionHandler</prop>
            </props>
        </property>
    </bean>
    <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>



    <!-- json轉換器 -->
    <bean id="jsonConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
                <value>application/json;charset=UTF-8</value>
            </list>
        </property>
        <property name="fastJsonConfig">
            <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
                <property name="features">
                    <list>
                        <value>AllowArbitraryCommas</value>
                        <value>AllowUnQuotedFieldNames</value>
                        <value>DisableCircularReferenceDetect</value>
                    </list>
                </property>
                <!-- 配置贊成json返回的日期格式 -->
                <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"></property>
            </bean>
        </property>
    </bean>

    <mvc:annotation-driven conversion-service="conversionService">
        <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>
    <!-- 自定義日期轉換類 -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <!--日期輸入參數轉換器 -->
                <bean class="com.spj.common.DateConverter"/>
            </set>
        </property>
    </bean>

    <!-- 自定義攔截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.spj.interceptor.BaseInterceptor"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/api/**"/>
            <bean class="com.spj.interceptor.PerformanceInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>


    <!-- 啓用緩存註解功能,這個是必須的,不然註解不會生效,另外,該註解必定要聲明在spring主配置文件中才會生效 -->
    <cache:annotation-driven cache-manager="redisCacheManager"/>

    <!-- spring線程池-->
    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <!-- 線程池維護線程的最少數量 -->
        <property name="corePoolSize" value="5" />
        <!-- 線程池維護線程所容許的空閒時間,默認爲60s  -->
        <property name="keepAliveSeconds" value="200" />
        <!-- 線程池維護線程的最大數量 -->
        <property name="maxPoolSize" value="20" />
        <!-- 緩存隊列最大長度 -->
        <property name="queueCapacity" value="20" />
        <!-- 對拒絕task的處理策略   線程池對拒絕任務(無線程可用)的處理策略,目前只支持AbortPolicy、CallerRunsPolicy;默認爲後者-->
        <property name="rejectedExecutionHandler">
            <!-- AbortPolicy:直接拋出java.util.concurrent.RejectedExecutionException異常 -->
            <!-- CallerRunsPolicy:主線程直接執行該任務,執行完以後嘗試添加下一個任務到線程池中,能夠有效下降向線程池內添加任務的速度 -->
            <!-- DiscardOldestPolicy:拋棄舊的任務、暫不支持;會致使被丟棄的任務沒法再次被執行 -->
            <!-- DiscardPolicy:拋棄當前任務、暫不支持;會致使被丟棄的任務沒法再次被執行 -->
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property>
        <property name="waitForTasksToCompleteOnShutdown" value="true" />
    </bean>


    <!-- 激活自動代理功能 -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <!-- Log切面攔截處理類-->
    <bean id="aspectService" class="com.spj.config.LogAspectService"></bean>
    <!-- AOP配置 -->
    <aop:config>
        <!-- 聲明一個切面,並注入切面Bean,至關於@Aspect -->
        <aop:aspect id="simpleAspect" ref="aspectService">
            <!-- 配置一個切入點,至關於@Pointcut -->
            <aop:pointcut expression="execution(* com.spj..*.*(..)))" id="simplePointcut"/>
            <aop:after-throwing pointcut-ref="simplePointcut" method="afterThrow" throwing="ex"/>
        </aop:aspect>
    </aop:config>

</beans>

四、spring-mybatis-jpa.xml(這裏mybatis puls 和 jpa 使用的是同一個鏈接池,這裏也能夠分開使用兩個鏈接池,單數據源使用一個鏈接池就能夠了)

  (1)mybatis puls 官網:https://mp.baomidou.com/config/#基本配置html

       (2)jpa 官網:https://spring.io/projects/spring-data-jpajava

 

<?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:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/data/jpa
       http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       ">


    <!-- 配置數據庫相關參數properties的屬性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 數據庫鏈接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
        <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
        <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/>
        <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
    </bean>


    <!-- mybatis puls配置SqlSessionFactory對象 -->
    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <!-- 注入數據庫鏈接池 -->
        <property name="dataSource" ref="dataSource"/>
        <property name="configuration" ref="configuration"/>
        <property name="globalConfig" ref="globalConfig"/>
        <!-- 掃描model包 使用別名 -->
        <property name="typeAliasesPackage" value="com.spj.model"/>
        <!-- 掃描sql配置文件:mapper須要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!--使用下面的方式配置參數,一行配置一個 -->
                        <value>
                            reasonable=true
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

    <bean id="configuration" class="com.baomidou.mybatisplus.core.MybatisConfiguration">
        <!-- 是否開啓自動駝峯命名映射 -->
        <property name="mapUnderscoreToCamelCase" value="true"></property>
    </bean>
    <bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
        <!-- 是否打印mybatis的banner -->
        <property name="banner" value="true"></property>
        <property name="dbConfig" ref="dbConfig"/>
    </bean>
    <bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
        <!-- 全局默認主鍵類型 -->
        <property name="idType" value="NONE"></property>
    </bean>

    <!-- jpa數據鏈接管理工廠 -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="FastDFSPersistenceUnit"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.spj.model" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!-- 是否自動建表 -->
                <property name="generateDdl" value="false"/>
                <!-- 是否展現sql -->
                <property name="showSql" value="true"/>
                <!-- 必要的數據庫庫使用的詳細信息 -->
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
                <!-- mysql,自行選擇 -->
                <property name="database" value="MYSQL"/>
            </bean>
        </property>
        <!-- 指定JPA屬性;如Hibernate中指定是否顯示SQL的是否顯示、方言等 -->
        <property name="jpaProperties">
            <props>
                <!--啓用駝峯命名 -->
                <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
            </props>
        </property>
    </bean>


    <!-- mybatis puls配置掃描Dao接口包,動態實現Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 給出須要掃描Dao接口包 -->
        <property name="basePackage" value="com.spj.dao"/>
    </bean>


    <!-- mybatis配置事務管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入數據庫鏈接池 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- mybatis註解方式配置事務 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!-- jpa配置啓用掃描並自動建立代理的功能  factory-class="com.monk.base.jpa.PeakJpaRepositoryFactory"本身定義的bean註解方式,能夠不寫,直接註解全部包下的 -->
    <jpa:repositories base-package="com.spj.jpa" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>

    <!-- 配置JPA的註解 -->
    <bean id="transactionJpaManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"></property>
    </bean>
    <!-- jpa配置基於註解的事務 -->
    <tx:annotation-driven transaction-manager="transactionJpaManager" proxy-target-class="true"/>



    <!-- mybatis攔截器方式配置事物 -->
    <tx:advice id="mybatisTransactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>
            <tx:method name="append*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="repair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delAndRepair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
        </tx:attributes>
    </tx:advice>

    <!-- jpa攔截器方式配置事物 -->
    <tx:advice id="jpaTransactionAdvice" transaction-manager="transactionJpaManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>
            <tx:method name="append*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="repair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delAndRepair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
        </tx:attributes>
    </tx:advice>
    <!-- mybatis把事務控制在dao層 -->
    <aop:config>
        <aop:pointcut id="mybatisPointcut" expression="execution(* com.spj.dao.*.*(..))"/>
        <aop:advisor pointcut-ref="mybatisPointcut" advice-ref="mybatisTransactionAdvice"/>
    </aop:config>
    <!-- jpa把事務控制在jpa層 -->
    <aop:config>
        <aop:pointcut id="jpaPointcut" expression="execution(* com.spj.jpa.*.*(..))"/>
        <aop:advisor pointcut-ref="jpaPointcut" advice-ref="jpaTransactionAdvice"/>
    </aop:config>

</beans>

五、redis配置

 

<?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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-4.2.xsd
                           http://www.springframework.org/schema/util
                           http://www.springframework.org/schema/util/spring-util-3.0.xsd
                           http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
                           http://www.springframework.org/schema/cache
                           http://www.springframework.org/schema/cache/spring-cache-4.2.xsd">


    <!-- 鏈接池基本參數配置,相似數據庫鏈接池 -->
    <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/>

    <!-- 啓用緩存註解功能,這個是必須的,不然註解不會生效,另外,該註解必定要聲明在spring主配置文件中才會生效 -->
    <cache:annotation-driven cache-manager="redisCacheManager"/>

    <!-- redis鏈接池 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.maxActive}"/>
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
    </bean>

    <!-- 鏈接池配置,相似數據庫鏈接池 -->
    <bean id="jedisConnectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.host}"></property>
        <property name="port" value="${redis.port}"></property>
        <!-- <property name="password" value="${redis.pass}"></property> -->
        <property name="poolConfig" ref="poolConfig"></property>
    </bean>

    <!--redis操做模版,使用該對象能夠操做redis  -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
        <!--若是不配置Serializer,那麼存儲的時候缺省使用String,若是用User類型存儲,那麼會提示錯誤User can't cast to String!!  -->
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
        </property>


        <property name="hashKeySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="hashValueSerializer">
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
        </property>
        <!--開啓事務  -->
        <property name="enableTransactionSupport" value="true"></property>



    </bean>

    <!-- spring本身的緩存管理器,這裏定義了緩存位置名稱 ,即註解中的value -->
    <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
        <property name="caches">
            <set>
                <!-- 這裏能夠配置多個redis -->
                <!-- <bean class="com.cn.util.RedisCache">
                     <property name="redisTemplate" ref="redisTemplate" />
                     <property name="name" value="default"/>
                </bean> -->
                <bean class="com.spj.cache.RedisCache">
                    <property name="redisTemplate" ref="redisTemplate"/>
                    <property name="name" value="common"/>
                    <!-- common名稱要在類或方法的註解中使用 -->
                </bean>
            </set>
        </property>
    </bean>

    <!-- 配置緩存 -->
    <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
        <constructor-arg ref="redisTemplate"/>
        <!--<property name="cacheNames">-->
            <!--<list>-->
                <!--<value>adminUserCache</value>-->
                <!--<value>lotteryTypeCache</value>-->
                <!--<value>lotteryPlayMethodCache</value>-->
                <!--<value>adminNoticeCache</value>-->
            <!--</list>-->
        <!--</property>-->
        <!--默認緩存超時時間(秒) -->
        <property name="defaultExpiration" value="${redis.defaultExpiration}"/>
        <!-- 給特定的cacheName設置超時時間 (秒)-->
        <!--<property name="expires">-->
            <!--<util:map>-->
                <!--<entry value="1800" key="adminUserCache"/>-->
                <!--<entry value="1800" key="lotteryTypeCache"/>-->
                <!--<entry value="1800" key="lotteryPlayMethodCache"/>-->
                <!--<entry value="86400" key="adminNoticeCache"/>-->
            <!--</util:map>-->
        <!--</property>-->
    </bean>

</beans>

六、spring-task.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:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
    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/context
                            http://www.springframework.org/schema/context/spring-context-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/tx
                            http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 
                            http://www.springframework.org/schema/task  
                            http://www.springframework.org/schema/task/spring-task-3.2.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">


    <!-- 配置註解掃描 -->
    <context:annotation-config/>
    <!-- Spring定時器註解開關-->
    <task:annotation-driven></task:annotation-driven>

    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
    <!-- 此處對於定時時間的配置會被註解中的時間配置覆蓋,所以,以註解配置爲準-->
    <!--<task:scheduled-tasks scheduler="myScheduler">-->
    <!--</task:scheduled-tasks>-->


    <!-- 配置線程池 -->
    <task:scheduler id="myScheduler" pool-size="20"/>



</beans>

七、applicationContext.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:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-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/tx
                            http://www.springframework.org/schema/tx/spring-tx-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/cache
                            http://www.springframework.org/schema/cache/spring-cache.xsd
                            http://www.springframework.org/schema/util
                            http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/data/jpa https://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
    <aop:aspectj-autoproxy/>
    <!-- 掃描web相關的controller -->
    <context:component-scan base-package="com.spj.controller"/>
    <!-- 掃描web相關的service -->
    <context:component-scan base-package="com.spj.service"/>
    <!-- 掃描web相關的jpa -->
    <context:component-scan base-package="com.spj.jpa"/>
    <!-- 掃描web相關的task -->
    <context:component-scan base-package="com.spj.task"/>
    <!-- 掃描配置-->
    <context:component-scan base-package="com.spj.config"/>


    <!-- 開啓SpringMVC註解模式 -->
    <mvc:annotation-driven/>
    <!-- 引入配置文件 -->
    <import resource="classpath*:environment.config.xml"/>
    <!-- 配置數據庫相關參數properties的屬性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/>
    <context:property-placeholder location="classpath:sysconfig.properties" ignore-unresolvable="true"/>
    <!-- 數據庫鏈接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
        <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
    </bean>

    <!-- jpa數據鏈接管理工廠 -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="FastDFSPersistenceUnit"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.spj.model" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!-- 是否生成ddl文件 -->
                <property name="generateDdl" value="true"/>
                <!-- 是否展現sql -->
                <property name="showSql" value="false"/>
                <!-- 必要的數據庫庫使用的詳細信息 -->
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
                <!-- mysql,自行選擇 -->
                <property name="database" value="MYSQL"/>
            </bean>
        </property>
        <!-- 指定JPA屬性;如Hibernate中指定是否顯示SQL的是否顯示、方言等 -->
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
            </props>
        </property>
    </bean>

    <!-- mybatis配置SqlSessionFactory對象 -->
    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <!-- 注入數據庫鏈接池 -->
        <property name="dataSource" ref="dataSource"/>
        <property name="configuration" ref="configuration"/>
        <property name="globalConfig" ref="globalConfig"/>
        <!-- 掃描model包 使用別名 -->
        <property name="typeAliasesPackage" value="com.spj.model"/>
        <!-- 掃描sql配置文件:mapper須要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!--使用下面的方式配置參數,一行配置一個 -->
                        <value>
                            reasonable=true
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

    <bean id="configuration" class="com.baomidou.mybatisplus.core.MybatisConfiguration">
        <!-- 是否開啓自動駝峯命名映射 -->
        <property name="mapUnderscoreToCamelCase" value="true"></property>
    </bean>
    <bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
        <!-- 是否打印mybatis的banner -->
        <property name="banner" value="true"></property>
        <property name="dbConfig" ref="dbConfig"/>
    </bean>
    <bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
        <!-- 全局默認主鍵類型 -->
        <property name="idType" value="NONE"></property>
    </bean>

    <!-- mybatis自動掃描mapper接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.spj.dao"/>
        <property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
    </bean>


    <!-- mybatis配置事務管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入數據庫鏈接池 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- mybatis註解方式配置事務 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!-- JPA配置啓用掃描並自動建立代理的功能  factory-class="com.monk.base.jpa.PeakJpaRepositoryFactory"本身定義的bean註解方式,能夠不寫,直接註解全部包下的 -->
    <jpa:repositories base-package="com.spj.jpa" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>
    <!-- JPA配置的事務管理器 -->
    <bean id="transactionJpaManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"></property>
    </bean>
    <!-- JPA配置基於註解的事務 -->
    <tx:annotation-driven transaction-manager="transactionJpaManager"/>



    <!-- mybatis攔截器方式配置事物 -->
    <tx:advice id="mybatisTransactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>
            <tx:method name="append*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="repair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delAndRepair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
        </tx:attributes>
    </tx:advice>

    <!-- JPA攔截器方式配置事物 -->
    <tx:advice id="jpaTransactionAdvice" transaction-manager="transactionJpaManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>
            <tx:method name="append*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="repair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delAndRepair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
        </tx:attributes>
    </tx:advice>
    <!-- mybatis把事務控制在service層 -->
    <aop:config>
        <aop:pointcut id="mybatisPointcut" expression="execution(* com.spj.service.*.*(..))"/>
        <aop:advisor pointcut-ref="mybatisPointcut" advice-ref="mybatisTransactionAdvice"/>
    </aop:config>

    <!-- jpa把事務控制在service層 -->
    <aop:config>
        <aop:pointcut id="jpaPointcut" expression="execution(* com.spj.jpa.*.*(..))"/>
        <aop:advisor pointcut-ref="jpaPointcut" advice-ref="jpaTransactionAdvice"/>
    </aop:config>

    <!-- rest client -->
    <bean id="httpClientFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory">
        <property name="connectTimeout" value="10000"/>
        <property name="readTimeout" value="10000"/>
    </bean>

    <!--RestTemplate-->
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <constructor-arg ref="httpClientFactory"/>
    </bean>

    <import resource="spring-redis.xml"/>

    <!-- spring線程池-->
    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <!-- 線程池維護線程的最少數量 -->
        <property name="corePoolSize" value="5" />
        <!-- 線程池維護線程所容許的空閒時間,默認爲60s  -->
        <property name="keepAliveSeconds" value="200" />
        <!-- 線程池維護線程的最大數量 -->
        <property name="maxPoolSize" value="20" />
        <!-- 緩存隊列最大長度 -->
        <property name="queueCapacity" value="20" />
        <!-- 對拒絕task的處理策略   線程池對拒絕任務(無線程可用)的處理策略,目前只支持AbortPolicy、CallerRunsPolicy;默認爲後者-->
        <property name="rejectedExecutionHandler">
            <!-- AbortPolicy:直接拋出java.util.concurrent.RejectedExecutionException異常 -->
            <!-- CallerRunsPolicy:主線程直接執行該任務,執行完以後嘗試添加下一個任務到線程池中,能夠有效下降向線程池內添加任務的速度 -->
            <!-- DiscardOldestPolicy:拋棄舊的任務、暫不支持;會致使被丟棄的任務沒法再次被執行 -->
            <!-- DiscardPolicy:拋棄當前任務、暫不支持;會致使被丟棄的任務沒法再次被執行 -->
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property>
        <property name="waitForTasksToCompleteOnShutdown" value="true" />
    </bean>


    <!-- 激活自動代理功能 -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <!-- Log切面攔截處理類-->
    <bean id="aspectService" class="com.spj.config.LogAspectService"></bean>
    <!-- AOP配置 -->
    <aop:config>
        <!-- 聲明一個切面,並注入切面Bean,至關於@Aspect -->
        <aop:aspect id="simpleAspect" ref="aspectService">
            <!-- 配置一個切入點,至關於@Pointcut -->
            <aop:pointcut expression="execution(* com.spj..*.*(..)))" id="simplePointcut"/>
            <aop:after-throwing pointcut-ref="simplePointcut" method="afterThrow" throwing="ex"/>
        </aop:aspect>
    </aop:config>

</beans>

八、jdbc.properties

 

jdbc.driver=com.mysql.jdbc.Driver
#測試數據庫
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false
#用戶名
jdbc.username=root
#密碼
jdbc.password=123456
#鏈接池中保留的最大鏈接數。Default: 15
c3p0.maxPoolSize=30
#鏈接池中保留的最小鏈接數。
c3p0.minPoolSize=10
#鏈接關閉時默認將全部未提交的操做回滾。默認爲false
c3p0.autoCommitOnClose=false
#當鏈接池用完時客戶端調用getConnection()後等待獲取新鏈接的時間,超時後將拋出SQLException,如設爲0則無限期等待。單位毫秒,默認爲0;
c3p0.checkoutTimeout=10000
#定義在從數據庫獲取新鏈接失敗後重復嘗試的次數。Default: 30
c3p0.acquireRetryAttempts=2
#每60秒檢查全部鏈接池中的空閒鏈接。Default: 0
c3p0.idleConnectionTestPeriod=60
#最大空閒時間,60秒內未使用則鏈接被丟棄。若爲0則永不丟棄。Default: 0
c3p0.maxIdleTime=60

九、redis.properties

#訪問地址
redis.host=127.0.0.1
redis.database=0
#訪問端口
redis.port=6379
#注意,若是沒有password,此處不設置值,但這一項要保留
redis.password=
#最大空閒數,數據庫鏈接的最大空閒時間。超過空閒時間,數據庫鏈接將被標記爲不可用,而後被釋放。設爲0表示無限制。
redis.maxIdle=300
#鏈接池的最大數據庫鏈接數。設爲0表示無限制
redis.maxActive=600
#最大創建鏈接等待時間。若是超過此時間將接到異常。設爲-1表示無限制。
redis.maxWait=1000
#在borrow一個jedis實例時,是否提早進行alidate操做;若是爲true,則獲得的jedis實例均是可用的;
redis.testOnBorrow=true
#最大鏈接數:可以同時創建的「最大連接個數」
redis.maxTotal=1000
#最小空閒數
redis.minIdle=3
#空閒對象被清除須要達到的最小空閒時間
redis.minEvictableIdleTimeMillis=30000
#空閒檢測線程,sleep 間隔多長時間,去處理與idle相關的事情
redis.timeBetweenEvictionRunsMillis=30000
#當客戶端閒置多長時間後關閉鏈接,若是指定爲0,表示關閉該功能
redis.timeout=2000
#默認對象過時時間(秒)
redis.defaultExpiration=3600

十、log4j.properties(我這裏的日誌工具是log4j,本身封裝了一下,經過aop切面處理,進行全局的日誌攔截以及打印)

log4j.rootLogger=DEBUG,INFO,ERROR

##控制檯日誌
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n


#info log
log4j.appender.INFO=org.apache.log4j.RollingFileAppender
log4j.appender.INFO.File=logs/INFOLOG.log
log4j.appender.INFO.Threshold=INFO
log4j.appender.INFO.MaxFileSize=10MB
log4j.appender.INFO.layout=org.apache.log4j.PatternLayout
log4j.appender.INFO.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n 
log4j.appender.INFO.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilter
log4j.appender.INFO.filter.infoFilter.LevelMin=INFO
log4j.appender.INFO.filter.infoFilter.LevelMax=INFO


#debug log
log4j.appender.ERROR=org.apache.log4j.RollingFileAppender
log4j.appender.ERROR.File=logs/ERRORLOG.log
log4j.appender.ERROR.Threshold=ERROR
log4j.appender.ERROR.MaxFileSize=10MB
log4j.appender.ERROR.MaxBackupIndex=3
log4j.appender.ERROR.layout=org.apache.log4j.PatternLayout
log4j.appender.ERROR.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
log4j.appender.ERROR.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilter
log4j.appender.ERROR.filter.infoFilter.LevelMin=ERROR
log4j.appender.ERROR.filter.infoFilter.LevelMax=ERROR


#debug sql log
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.com.pro.mapper = DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

 十一、sysconfig.properties(系統參數配置文件)

headico=com.mysql.jdbc.Driver

   SystemConfig.java

package com.spj.common;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * Created by ben on 2017-03-20 0020.
 */


@Component
public class SystemConfig{


    @Value("${headico}")
    public String headico;

    public String getHeadico() {
        return headico;
    }

    public void setHeadico(String headico) {
        this.headico = headico;
    }


}

 

十二、spring mvc 的時間處理(spirng mvc  在接收時間參數的時候,都會默認爲字符串參數,在未處理的狀況下,請求借口會報400的錯誤,參數錯誤)

          處理方式:(自定義時間類,進行時間轉換)

         (1)、spring-mvc.xml

                

    <!-- 自定義日期轉換類 -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <!--日期輸入參數轉換器 -->
                <bean class="com.spj.common.DateConverter"/>
            </set>
        </property>
    </bean>

  

         (2)、DateConverter.java

package com.spj.common;

import org.apache.commons.lang3.time.DateUtils;
import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.util.Date;

/**
 * Created by ben on 2017-03-07 0007.
 */
public class DateConverter implements Converter<String, Date> {

    private static final String[] patterns = {"yyyy-MM-dd HH:mm:ss" ,"yyyy-MM-dd HH:mm","yyyy-MM-dd","HH:mm"};

    @Override
    public Date convert(String s) {
        if (s == null || s.trim().equals("")){
            return null;
        }
        try {
            return DateUtils.parseDate(s, patterns);
        } catch (ParseException e) {
            throw new IllegalArgumentException("字符串轉日期失敗", e);
        }
    }
}

1三、mybatis puls 和 jpa 的事物控制

          

         (1)問題:兩個框架的底層是不同,mybatis puls 是ibatis 框架, jpa 是hibernate框架,在事物控制上都有本身的一套方式,因此在框架集成的時候,必須得把兩個框架的事物分開管理(mybatis plus 事物控制在dao層,jpa事物控制在jpa層,咱們在service裏面調用mybaits puls  或者jpa 進行數據邏輯處理的話就不會讓兩個框架對一個進行事物管理了)

           數據鏈接池:

 

<!-- 配置數據庫相關參數properties的屬性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 數據庫鏈接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
        <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
        <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/>
        <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
    </bean>

 

              mybatis puls 事物管理配置

                     

<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <!-- 注入數據庫鏈接池 -->
        <property name="dataSource" ref="dataSource"/>
        <property name="configuration" ref="configuration"/>
        <property name="globalConfig" ref="globalConfig"/>
        <!-- 掃描model包 使用別名 -->
        <property name="typeAliasesPackage" value="com.spj.model"/>
        <!-- 掃描sql配置文件:mapper須要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!--使用下面的方式配置參數,一行配置一個 -->
                        <value>
                            reasonable=true
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

    <bean id="configuration" class="com.baomidou.mybatisplus.core.MybatisConfiguration">
        <!-- 是否開啓自動駝峯命名映射 -->
        <property name="mapUnderscoreToCamelCase" value="true"></property>
    </bean>
    <bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
        <!-- 是否打印mybatis的banner -->
        <property name="banner" value="true"></property>
        <property name="dbConfig" ref="dbConfig"/>
    </bean>
    <bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
        <!-- 全局默認主鍵類型 -->
        <property name="idType" value="NONE"></property>
    </bean>
<!-- mybatis puls配置掃描Dao接口包,動態實現Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 給出須要掃描Dao接口包 -->
        <property name="basePackage" value="com.spj.dao"/>
    </bean>

    <!-- mybatis配置事務管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入數據庫鏈接池 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- mybatis註解方式配置事務 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

<!-- mybatis攔截器方式配置事物 -->
    <tx:advice id="mybatisTransactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>
            <tx:method name="append*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="repair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delAndRepair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
        </tx:attributes>
    </tx:advice>

<!-- mybatis把事務控制在dao層 -->
    <aop:config>
        <aop:pointcut id="mybatisPointcut" expression="execution(* com.spj.dao.*.*(..))"/>
        <aop:advisor pointcut-ref="mybatisPointcut" advice-ref="mybatisTransactionAdvice"/>
    </aop:config>

  

              jpa 事物管理配置

<!-- jpa數據鏈接管理工廠 -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="FastDFSPersistenceUnit"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.spj.model" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!-- 是否自動建表 -->
                <property name="generateDdl" value="false"/>
                <!-- 是否展現sql -->
                <property name="showSql" value="true"/>
                <!-- 必要的數據庫庫使用的詳細信息 -->
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
                <!-- mysql,自行選擇 -->
                <property name="database" value="MYSQL"/>
            </bean>
        </property>
        <!-- 指定JPA屬性;如Hibernate中指定是否顯示SQL的是否顯示、方言等 -->
        <property name="jpaProperties">
            <props>
                <!--啓用駝峯命名 -->
                <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
            </props>
        </property>
    </bean>

<!-- jpa配置啓用掃描並自動建立代理的功能  factory-class="com.monk.base.jpa.PeakJpaRepositoryFactory"本身定義的bean註解方式,能夠不寫,直接註解全部包下的 -->
    <jpa:repositories base-package="com.spj.jpa" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>

    <!-- 配置JPA的註解 -->
    <bean id="transactionJpaManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"></property>
    </bean>
    <!-- jpa配置基於註解的事務 -->
    <tx:annotation-driven transaction-manager="transactionJpaManager" proxy-target-class="true"/>

<!-- jpa攔截器方式配置事物 -->
    <tx:advice id="jpaTransactionAdvice" transaction-manager="transactionJpaManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>
            <tx:method name="append*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="repair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delAndRepair" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
            <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>
        </tx:attributes>
    </tx:advice>

    <!-- jpa把事務控制在jpa層 -->
    <aop:config>
        <aop:pointcut id="jpaPointcut" expression="execution(* com.spj.jpa.*.*(..))"/>
        <aop:advisor pointcut-ref="jpaPointcut" advice-ref="jpaTransactionAdvice"/>
    </aop:config>

 

 1四、自定義封裝log日誌(實現按包,按類,按時間打印日誌)

      LogInfoTools.java

        

package com.spj.common.log;

import com.spj.utils.MyDateUtil;
import org.apache.log4j.*;
import org.apache.log4j.varia.LevelRangeFilter;

import java.util.Date;

/**
 * Created by Miracle on 2018/11/3.
 */
public class LogInfoTools {

    public static Logger getLoggerInfo(Class clazz){
        StringBuffer logFilePath=new StringBuffer(System.getProperty("user.dir")+"/logs/");
        logFilePath.append(MyDateUtil.simpleDateString(new Date(),"yyyy-MM-dd"));
        logFilePath.append("/");
        logFilePath.append(clazz.getSimpleName());
        logFilePath.append("/");
        logFilePath.append(clazz.getCanonicalName());
        logFilePath.append("--INFO.log");
        Logger logger = LogManager.getLogger(clazz);
        Layout layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n");
        try{
            Appender appender = new FileAppender(layout, logFilePath.toString());

            LevelRangeFilter f = new LevelRangeFilter();
            f.setLevelMin(Level.INFO);
            f.setLevelMax(Level.INFO);
            appender.addFilter(f);
            logger.addAppender(appender);
        }catch (Exception e){
            e.printStackTrace();
        }
        logger.setLevel(Level.INFO);
        return logger;
    }
    public static Logger getLoggerDebug(Class clazz){
        StringBuffer logFilePath=new StringBuffer(System.getProperty("user.dir")+"/logs/");
        logFilePath.append(MyDateUtil.simpleDateString(new Date(),"yyyy-MM-dd"));
        logFilePath.append("/");
        logFilePath.append(clazz.getSimpleName());
        logFilePath.append("/");
        logFilePath.append(clazz.getCanonicalName());
        logFilePath.append("--ALL.log");
        Logger logger = LogManager.getLogger(clazz);
        Layout layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n");
        try{
            Appender appender = new FileAppender(layout, logFilePath.toString());
            LevelRangeFilter f = new LevelRangeFilter();
            f.setLevelMin(Level.ALL);
            f.setLevelMax(Level.OFF);
            appender.addFilter(f);
            logger.addAppender(appender);
        }catch (Exception e){
            e.printStackTrace();
        }
        logger.setLevel(Level.DEBUG);
        return logger;
    }
    public static Logger getLoggerError(Class clazz){
        StringBuffer logFilePath=new StringBuffer(System.getProperty("user.dir")+"/logs/");
        logFilePath.append(MyDateUtil.simpleDateString(new Date(),"yyyy-MM-dd"));
        logFilePath.append("/");
        logFilePath.append(clazz.getSimpleName());
        logFilePath.append("/");
        logFilePath.append(clazz.getCanonicalName());
        logFilePath.append("--ERROR.log");
        Logger logger = LogManager.getLogger(clazz);
        Layout layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n");
        try{
            Appender appender = new FileAppender(layout, logFilePath.toString());
            LevelRangeFilter f = new LevelRangeFilter();
            f.setLevelMin(Level.ERROR);
            f.setLevelMax(Level.ERROR);
            appender.addFilter(f);
            logger.addAppender(appender);
        }catch (Exception e){
            e.printStackTrace();
        }
        logger.setLevel(Level.ERROR);
        return logger;
    }
    public static Logger getLoggerTime(Class clazz){
        StringBuffer logFilePath=new StringBuffer(System.getProperty("user.dir")+"/logs/");
        logFilePath.append("TIME.log");
        Logger logger = LogManager.getLogger(clazz);
        Layout layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n");
        try{
            Appender appender = new FileAppender(layout, logFilePath.toString());
            LevelRangeFilter f = new LevelRangeFilter();
            f.setLevelMin(Level.ERROR);
            f.setLevelMax(Level.ERROR);
            appender.addFilter(f);
            logger.addAppender(appender);
        }catch (Exception e){
            e.printStackTrace();
        }
        logger.setLevel(Level.ERROR);
        return logger;
    }

    /**
     *
     * @param clazz 類加載器
     * @param paht 日誌儲存路徑  例如:info/test
     * @param name 日誌名字 Test
     * @return logger日誌對象
     * 返回案例存儲位置:logs/info/test/Test.log
     */
    public static Logger getLoggerObjct(Class clazz,String paht,String name){
        StringBuffer logFilePath=new StringBuffer(System.getProperty("user.dir")+"/logs/");
        logFilePath.append(MyDateUtil.simpleDateString(new Date(),"yyyy-MM-dd"));
        logFilePath.append("/");
        logFilePath.append(paht);
        logFilePath.append("/");
        logFilePath.append(name);
        logFilePath.append(".log");
        Logger logger = LogManager.getLogger(clazz);
        Layout layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n");
        try{
            Appender appender = new FileAppender(layout, logFilePath.toString());
            LevelRangeFilter f = new LevelRangeFilter();
            f.setLevelMin(Level.INFO);
            f.setLevelMax(Level.INFO);
            appender.addFilter(f);
            logger.addAppender(appender);
        }catch (Exception e){
            e.printStackTrace();
        }
        logger.setLevel(Level.INFO);
        return logger;
    }


    public static Logger getLoggerFtlError(Class clazz){
        StringBuffer logFilePath=new StringBuffer(System.getProperty("user.dir")+"/logs/");
        logFilePath.append("ftl-error.log");
        Logger logger = LogManager.getLogger(clazz);
        Layout layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n");
        try{
            Appender appender = new FileAppender(layout, logFilePath.toString());
            LevelRangeFilter f = new LevelRangeFilter();
            f.setLevelMin(Level.ERROR);
            f.setLevelMax(Level.ERROR);
            appender.addFilter(f);
            logger.addAppender(appender);
        }catch (Exception e){
            e.printStackTrace();
        }
        logger.setLevel(Level.ERROR);
        return logger;
    }


    public static Logger getLoggerAspectError(Class clazz){
        StringBuffer logFilePath=new StringBuffer(System.getProperty("user.dir")+"/logs/");
        logFilePath.append("aspect-error.log");
        Logger logger = LogManager.getLogger(clazz);
        Layout layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n");
        try{
            Appender appender = new FileAppender(layout, logFilePath.toString());
            LevelRangeFilter f = new LevelRangeFilter();
            f.setLevelMin(Level.ERROR);
            f.setLevelMax(Level.ERROR);
            appender.addFilter(f);
            logger.addAppender(appender);
        }catch (Exception e){
            e.printStackTrace();
        }
        logger.setLevel(Level.ERROR);
        return logger;
    }

}

 

      MyLogger.java

package com.spj.common.log;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

import java.io.Serializable;

/**
 * Created by Miracle on 2018/11/3.
 */
public class MyLogger extends Logger implements Serializable{

    private Logger loggerInfo;
    private Logger loggerDebug;
    private Logger loggerError;
    private Logger loggerTime;
    private Class clazz;
    private Logger loggerObject;
    private String path;

    public MyLogger(Class clazz) {
        super(clazz.getSimpleName());
        this.clazz=clazz;
    }
    public MyLogger(Class clazz,String paht,String name) {
        super(clazz.getSimpleName());
        this.clazz=clazz;
        this.path=paht;
        this.name=name;
        loggerObject=LogInfoTools.getLoggerObjct(clazz,path,name);
    }

    public void info(String massger){
        if(loggerInfo==null){
            loggerInfo=getLoggerInfo();
        }
        loggerInfo.setLevel(Level.INFO);
        loggerInfo.info(massger);
        System.out.println(massger);
    }
    public void debug(String massger){
        if(loggerDebug==null){
            loggerDebug=getLoggerDebug();
        }
        loggerDebug.setLevel(Level.DEBUG);
        loggerDebug.debug(massger);
        System.out.println(massger);
    }
    public void error(String massger){
        if(loggerError==null){
            loggerError=getLoggerError();
        }
        loggerError.setLevel(Level.ERROR);
        loggerError.error(massger);
        System.err.println(massger);
    }

    public void errorFtl(String massger){
        if(loggerError==null){
            loggerError=getLoggerFtlError();
        }
        loggerError.setLevel(Level.ERROR);
        loggerError.error(massger);
        System.err.println(massger);
    }


    public void errorAspect(String massger){
        if(loggerError==null){
            loggerError=getLoggerAspectError();
        }
        loggerError.setLevel(Level.ERROR);
        loggerError.error(massger);
        System.err.println(massger);
    }
    public void time(String massger){
        if(loggerTime==null){
            loggerTime=getLoggerTime();
        }
        loggerTime.setLevel(Level.ERROR);
        loggerTime.error(massger);
        System.err.println(massger);
    }

    public void object(String massger){
        if(loggerObject==null){
            loggerObject=getLoggerTime();
        }
        loggerObject.setLevel(Level.INFO);
        loggerObject.info(massger);
        System.out.println(massger);
    }

    public Logger getLoggerInfo() {
        loggerInfo=LogInfoTools.getLoggerInfo(clazz);
        return loggerInfo;
    }


    public Logger getLoggerDebug() {
        loggerDebug=LogInfoTools.getLoggerDebug(clazz);
        return loggerDebug;
    }


    public Logger getLoggerError() {
        loggerError=LogInfoTools.getLoggerError(clazz);
        return loggerError;
    }
    public Logger getLoggerFtlError() {
        loggerError=LogInfoTools.getLoggerFtlError(clazz);
        return loggerError;
    }

    public Logger getLoggerAspectError() {
        loggerError=LogInfoTools.getLoggerAspectError(clazz);
        return loggerError;
    }


    public Logger getLoggerTime() {
        loggerTime=LogInfoTools.getLoggerTime(clazz);
        return loggerTime;
    }


}

      MyDateUtil.java

package com.spj.utils;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Created by Gray on 2018/9/15
 */
public class MyDateUtil {
    private static Logger logs = LogManager.getLogger(MyDateUtil.class);

    public static Date getPatternToDate(Date date) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = format.format(date);
        return format.parse(dateStr);
    }
    public static String simpleDateString(Date date,String simple){
        SimpleDateFormat format = new SimpleDateFormat(simple);
        String dateStr = format.format(date);
        return dateStr;
    }

    public static Date getPatternToDate(String date) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.parse(date);
    }

    public static String getPatternToString(Date date) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.format(date);
    }

    public static Date getCurrentDate() throws ParseException {
        return getPatternToDate(new Date());
    }

    /**
     * 取oldDate的時分秒,替換給newDate
     * @param oldDate
     * @param newDate
     * @return
     */
    public static Date replaceDate(Date oldDate, Date newDate) {
        Calendar oldCal = Calendar.getInstance();
        Calendar newCal = Calendar.getInstance();
        oldCal.setTime(oldDate);
        newCal.setTime(newDate);
        oldCal.set(newCal.get(Calendar.YEAR), newCal.get(Calendar.MONTH), newCal.get(Calendar.DATE));
        //newCal.set(oldCal.get(Calendar.HOUR), oldCal.get(Calendar.MINUTE), oldCal.get(Calendar.SECOND));
        return oldCal.getTime();
    }

    public static int computeDay(Date oldDate, Date newDate) {
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.setTime(oldDate);   //設置爲另外一個時間
        c2.setTime(newDate);   //設置爲另外一個時間

        int oldDay = c1.get(Calendar.DAY_OF_MONTH);
        int newDay = c2.get(Calendar.DAY_OF_MONTH);
        return newDay - oldDay;
    }

}

 

        log使用

package com.spj.controller.admin;

import com.spj.common.log.MyLogger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by Owner on 2018/11/30.
 */
@Controller
@RequestMapping("admin")
public class AdminTestController {


    MyLogger myLogger=new MyLogger(this.getClass());

    @RequestMapping(value = "/loginInfo/admin")
    public String admin(Model model, HttpServletRequest request) throws Exception {
        myLogger.info("111111111111111111");
        myLogger.debug("123456");
        myLogger.error("123456");
        return "admin/test";
    }
}

1五、aop切面配置全局日誌攔截打印

      spring-mvc.xml

    <!-- 激活自動代理功能 -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <!-- Log切面攔截處理類-->
    <bean id="aspectService" class="com.spj.config.LogAspectService"></bean>
    <!-- AOP配置 -->
    <aop:config>
        <!-- 聲明一個切面,並注入切面Bean,至關於@Aspect -->
        <aop:aspect id="simpleAspect" ref="aspectService">
            <!-- 配置一個切入點,至關於@Pointcut -->
            <aop:pointcut expression="execution(* com.spj..*.*(..)))" id="simplePointcut"/>
            <aop:after-throwing pointcut-ref="simplePointcut" method="afterThrow" throwing="ex"/>
        </aop:aspect>
    </aop:config>

 

      LogAspectService.java

package com.spj.config;

import com.spj.common.log.MyLogger;
import org.aspectj.lang.JoinPoint;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by Administrator on 2019/10/24 0024.
 */
public class LogAspectService {


    MyLogger myLogger=new MyLogger(this.getClass());

    //配置拋出異常後通知,使用在方法aspect()上註冊的切入點
    public void afterThrow(JoinPoint joinPoint, Exception ex){
        //詳細錯誤信息
        String errorMsg = "";
        StackTraceElement[] trace = ex.getStackTrace();
        for (StackTraceElement s : trace) {
            errorMsg += "\tat " + s + "\r\n";
        }
        String cla=joinPoint.getTarget().getClass().getName();//action
        String method=joinPoint.getSignature().getName();//method
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        StringBuffer sb=new StringBuffer();
        sb.append("\r\n-----------"+sdf.format(new Date())+"------------\r\n");
        sb.append("接口方法:["+cla+"."+method+"]\r\n");
        sb.append("詳細錯誤信息:"+ex+"\r\n");
        sb.append(errorMsg+"\r\n");
        myLogger.errorAspect(sb.toString());
    }



}

 1六、ftl模板錯誤日誌全局攔截記錄(在實際發佈的工程,ftl模板的錯誤也是能夠打印保存出來的,我這個全局攔截只是把全局日誌集中打印到一個文件裏面,方便閱讀,且處理後,頁面能夠正常顯示,不會崩潰)

      MyFtlTemplateExceptionHandler.java

package com.spj.config;

import com.spj.common.log.MyLogger;
import freemarker.core.Environment;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;

import java.io.IOException;
import java.io.Writer;

/**
 * Created by Administrator on 2019/10/24 0024.
 */
public class MyFtlTemplateExceptionHandler implements TemplateExceptionHandler {

    MyLogger myLogger=new MyLogger(this.getClass());

    @Override
    public void handleTemplateException(TemplateException te, Environment environment, Writer writer) throws TemplateException {
        try {
            myLogger.errorFtl(te.getMessage());
            writer.write("[ERROR: " + te.getMessage() + "]");
        } catch (IOException e) {
            myLogger.error(e);
            throw new TemplateException("Failed to print error message. Cause: " + e, environment);
        }
    }
}

 1七、SwaggerConfig2集成(https://doc.xiaominfo.com/guide/#簡介)

      SwaggerConfig.java

package com.spj.config;

import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Function;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

import static com.google.common.collect.Lists.newArrayList;

/**
 * Created by Administrator on 2019/10/9 0009.
 */
@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI
public class SwaggerConfig {
    //    http://localhost:8080/doc.html
    private static final String splitor = ";";
    @Bean
    public Docket createRestApi() {

        ParameterBuilder tokenPar = new ParameterBuilder();
        List<Parameter> pars = new ArrayList<Parameter>();
        pars.add(tokenPar.build());
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .paths(PathSelectors.any())
                //掃描的包
                .apis(basePackage("com.spj.controller.mobile"))
                .build()
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("API文檔")
                .termsOfServiceUrl("HTTP對外開放接口")
                .description("接口詳情")
                .version("1.1.1")
                .build();
    }


    //添加token
    private List<ApiKey> securitySchemes() {
        return newArrayList(
                new ApiKey("Authorization", "Authorization", "header"));
    }

    private List<SecurityContext> securityContexts() {
        return newArrayList(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
                        .build()
        );
    }

    List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return newArrayList(
                new SecurityReference("Authorization", authorizationScopes));
    }


    /**
     * 重寫basePackage方法,使可以實現多包訪問,複製貼上去
     * @author  teavamc
     * @date 2019/1/26
     * @param basePackage
     * @return com.google.common.base.Predicate<springfox.documentation.RequestHandler>
     */
    public static Predicate<RequestHandler> basePackage(final String basePackage) {
        return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
    }

    private static Function<Class<?>, Boolean> handlerPackage(final String basePackage)     {
        return input -> {
            // 循環判斷匹配
            for (String strPackage : basePackage.split(splitor)) {
                boolean isMatch = input.getPackage().getName().startsWith(strPackage);
                if (isMatch) {
                    return true;
                }
            }
            return false;
        };
    }

    private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
        return Optional.fromNullable(input.declaringClass());
    }

}

      集成效果

 

 

 1八、使用

  Demo.java(實體類,在數據庫沒有這個屬性的時候,須要把mybatis puls  和 jpa 的實體屬性映射去除掉,不然會報錯,由於這兩個框架目前使用的是配置是自動java駝峯屬性改mysql 的下劃線字段)

package com.spj.model;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.spj.utils.PagingParameter;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * Created by Administrator on 2019/10/4 0004.
 */
@Entity
@TableName(value = "demo")
@Table(name = "demo")
@ApiModel(value = "用戶信息")
public class Demo extends PagingParameter implements Serializable {

    @Id
    @Column(name = "id", unique = true, nullable = false)
    @TableId(value = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @ApiModelProperty(value = "用戶id")
    private Integer id;


    @ApiModelProperty(value = "用戶名")
    private String userName;

    @ApiModelProperty(value = "用戶密碼")
    private String passWord;

    @ApiModelProperty(value = "建立時間")
    private Date createTime;

    //mybatis pusl 忽略字段映射
    @TableField(exist = false)
    //jipa 忽略字段映射
    @Transient
    //swagger2 字段註釋
    @ApiModelProperty(value = "建立時間")
    private int index;

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}

  PagingParameter.java

package com.spj.utils;

import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
/**
 * Created by admin on 2017-03-27 0027.
 */
@ApiModel(value = "分頁信息")
public class PagingParameter implements Serializable {
    //默認頁數
    public static final int DEFAULT_PAGE_SIZE = 15;
    //最大限制
    public static final int MAX_PAGE_SIZE = 200;
    //第一頁
    public static final int FIRST_PAGE = 1;

    @ApiModelProperty(value = "查詢頁碼")
    @TableField(exist = false)
    private Integer pageNum;

    @ApiModelProperty(value = "數據數量")
    @TableField(exist = false)
    private Integer pageSize;

    public static void setDefault(PagingParameter parameter) {
        if (parameter.getPageNum() == null) {
            parameter.setPageNum(1);//默認第一頁
        }
        if (parameter.getPageSize() == null) {
            parameter.setPageSize(DEFAULT_PAGE_SIZE);
        }
        if (parameter.getPageSize() > PagingParameter.MAX_PAGE_SIZE) {
            parameter.setPageSize(PagingParameter.MAX_PAGE_SIZE);
        }
    }

    public void init() {
        setDefault(this);
    }

    /**
     * 獲取分頁起始下標
     * @param pageNum
     * @param pageSize
     * @return
     */
    public static int getStartIndex(int pageNum, int pageSize) {
        return (pageNum -1) * pageSize;
    }

    /**
     * 獲取分頁結束下標
     * @param pageNum
     * @param pageSize
     * @return
     */
    public static int getEndIndex(int pageNum, int pageSize) {
        return getStartIndex(pageNum, pageSize) + pageSize;
    }

    public Integer getPageNum() {
        return pageNum;
    }

    public void setPageNum(Integer pageNum) {
        this.pageNum = pageNum;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getOffset() {
        if (pageNum != null && pageSize != null) {
            return (pageNum - 1) * getPageSize();
        }
        return null;
    }

}

 

  IDemoJpaService.java

package com.spj.jpa;

import com.spj.model.Demo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

import java.io.Serializable;
import java.util.List;

/**
 * Created by Administrator on 2019/10/4 0004.
 */
@Repository
public interface IDemoJpaService extends JpaRepository<Demo,Integer>, JpaSpecificationExecutor<Demo>, Serializable {

    /**
     * 根據用戶名查詢
     * @param userName
     * @return
     */
    List<Demo> findByUserName(String userName);

    /**
     * 根據用戶名密碼查詢
     * @param userName
     * @param password
     * @return
     */
    List<Demo> findByUserNameAndPassWord(String userName,String password);



}

  IDemoDao.java

package com.spj.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.spj.model.Demo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * Created by Administrator on 2019/10/4 0004.
 */
public interface IDemoDao extends BaseMapper<Demo> {


    Demo selectDemoById(@Param("id") Integer id);

    Demo selectDemoById2(@Param("id") Integer id);


    List<Demo> selectDemoPageInfo(@Param("demo") Demo demo);


    int insertDemo(@Param("demo") Demo demo);


}

  IDemoDaoMapper.xml(mybatis的經典寫法,也能夠採用mybaits puls 的寫法)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.spj.dao.IDemoDao">


    <resultMap id="BaseResultMap" type="com.spj.model.Demo">
        <id column="id" property="id"/>
        <result column="user_name" property="userName"/>
        <result column="pass_word" property="passWord"/>
        <result column="create_time" property="createTime"/>
    </resultMap>

    <sql id="Base_Column_List">
        id,
        user_name,
        pass_word,
        create_time
    </sql>
    <insert id="insertDemo" useGeneratedKeys="true" keyProperty="demo.id" parameterType="com.spj.model.Demo">
        INSERT INTO demo (
        user_name,
        pass_word,
        create_time
        )
        VALUES
        (
        #{demo.user_name},
        #{demo.pass_word},
        #{demo.create_time}
        )
    </insert>
    <select id="selectDemoById" resultMap="BaseResultMap">
        SELECT <include refid="Base_Column_List"></include> FROM demo WHERE  id=#{id}
    </select>
    <select id="selectDemoPageInfo" resultMap="BaseResultMap">
        SELECT <include refid="Base_Column_List"></include> FROM demo WHERE 1=1
    </select>
    <select id="selectDemoById2" resultType="com.spj.model.Demo">
        SELECT <include refid="Base_Column_List"></include> FROM demo WHERE  id=#{id}
    </select>


</mapper>

  IBaseService.java(基礎服務類,規範下級service的行爲)

package com.spj.service;

/**
 * Created by Administrator on 2019/10/4 0004.
 */
public interface IBaseService<T,D> {

    /**
     * 獲取jpa持久化對象
     * @return
     */
    public T getJpa();

    /**
     * 獲取mybatis持久化對象
     * @return
     */
    public D getDao();

}

    

  IDemoService.java(demo 服務類)

package com.spj.service;

import com.spj.dao.IDemoDao;
import com.spj.model.Demo;
import com.spj.jpa.IDemoJpaService;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.annotations.Param;

/**
 * Created by Administrator on 2019/10/4 0004.
 */
public interface IDemoService extends IBaseService<IDemoJpaService,IDemoDao>{

    Demo selectDemoById(@Param("id") Integer id);

    PageInfo<Demo> selectDemoPageInfo(@Param("demo") Demo demo);

    int insertDemo(@Param("demo") Demo demo);

}

  DemoService.java

package com.spj.service.impl;

import com.spj.dao.IDemoDao;
import com.spj.model.Demo;
import com.spj.service.IDemoService;
import com.spj.jpa.IDemoJpaService;
import com.spj.utils.PagingParameter;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * Created by Administrator on 2019/10/4 0004.
 */
@Service
public class DemoService implements IDemoService {

    @Autowired
    IDemoJpaService iDemoJpaService;
    @Autowired
    IDemoDao iDemoDao;

    @Override
    public IDemoJpaService getJpa() {
        return iDemoJpaService;
    }

    @Override
    public IDemoDao getDao() {
        return iDemoDao;
    }


    @Override
    public Demo selectDemoById(Integer id) {
        if(id!=null){
            return iDemoDao.selectDemoById(id);
        }
        return null;
    }

    @Override
    public PageInfo<Demo> selectDemoPageInfo(Demo demo) {
        PagingParameter.setDefault(demo);
        //查詢第一頁,每頁10條
        PageHelper.startPage(demo.getPageNum(), demo.getPageSize());
        List<Demo> adminUsers = iDemoDao.selectDemoPageInfo(demo);
        return new PageInfo<>(adminUsers);
    }

    @Override
    public int insertDemo(Demo demo) {
        demo.setCreateTime(new Date());
        return iDemoDao.insertDemo(demo);
    }
}

    MobileDemoController.java

package com.spj.controller.mobile;

/**
 * Created by Administrator on 2019/10/10 0010.
 */

import com.github.pagehelper.PageInfo;
import com.spj.model.Demo;
import com.spj.service.IDemoService;
import com.spj.utils.ResponseResult;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("mobile")
@Api(value = "api接口", tags="用戶相關接口")
public class MobileDemoController {

    @Autowired
    IDemoService iDemoService;



    @PostMapping(value = "/getUserInfoAll")
    @ResponseBody
    @ApiOperation(value = "查詢全部用戶", notes = "暫無接口描述")
    public ResponseResult<List<Demo>> getUserInfoAll(Model model, HttpServletRequest request, String userId) throws Exception {
        List<Demo> demoList=iDemoService.getJpa().findAll();
        Demo dem=iDemoService.getJpa().findById(1).get();
        Demo demo=iDemoService.getDao().selectById(1);
        return ResponseResult.successResult(demoList);
    }


    @PostMapping(value = "/getUserInfoById")
    @ResponseBody
    @ApiOperation(value = "根據id查詢用戶", notes = "請求攜帶token")
    @ApiImplicitParam(name = "userId",value = "用戶ID")
    public ResponseResult<Demo> getUserInfoById(Model model, HttpServletRequest request, Integer userId) throws Exception {
        Demo demoList=iDemoService.getJpa().findById(userId).get();
        return ResponseResult.successResult(demoList);
    }

    @PostMapping(value = "/getUserInfoByUserNameAndPassWord")
    @ResponseBody
    @ApiOperation(value = "根據用戶名", notes = "暫無接口描述")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userName",value = "用戶名(1==正常 2=很是 3=鎖定)",required = true),
            @ApiImplicitParam(name = "passWord",value = "密碼",required = true)
    })
    public ResponseResult<Demo> getUserInfoByUserNameAndPassWord(Model model, HttpServletRequest request, String userName,String passWord) throws Exception {
        List<Demo> demo=iDemoService.getJpa().findByUserNameAndPassWord(userName,passWord);
        return ResponseResult.successResult(demo.get(0));
    }



    @PostMapping(value = "/getUserInfoPageInfo")
    @ResponseBody
    @ApiOperation(value = "用戶查詢分頁", notes = "暫無接口描述")
    public ResponseResult<PageInfo<Demo>> getUserInfoPageInfo(Model model, HttpServletRequest request, Demo demo) throws Exception {
        PageInfo<Demo> pageInfo=iDemoService.selectDemoPageInfo(demo);
        return ResponseResult.successResult(pageInfo);
    }


    @PostMapping(value = "/deleteDemoById")
    @ResponseBody
    @ApiOperation(value = "根據id刪除demo", notes = "暫無接口描述")
    public ResponseResult<PageInfo<Demo>> getUserInfoPageInfo(Model model, HttpServletRequest request, Integer id) throws Exception {
        iDemoService.getJpa().deleteById(id);
        Demo demo=new Demo();
        demo.setCreateTime(new Date());
        demo.setUserName("123456");
        demo.setPassWord("123456");
        iDemoService.insertDemo(demo);
        return ResponseResult.successResult("刪除成功");
    }


    @RequestMapping(value="/uploadFile",method = RequestMethod.POST,headers = "content-type=multipart/form-data")
    @ResponseBody
    @ApiOperation(value = "上傳你文件", notes = "")
    @ApiImplicitParam(name = "fileName", value = "上傳文件", required = true,dataType = "MultipartFile",allowMultiple = true)
    public ResponseResult upload(Model model, HttpServletRequest request,@RequestParam(value = "fileName",required = true) CommonsMultipartFile fileName) throws IOException {
        return ResponseResult.successResult("上傳成功");
    }


}

1九、redis

    

    IRedisBaseService.java

package com.spj.service;

import java.util.List;

/**
 * Created by Owner on 2018/9/27.
 */
public interface IRedisBaseService<H, K, V> {
    //
    void addLongTime(K key, String value);

    long setIncrValue(K key);

    //
    void addShotTime(K key, String value);

    void addObj(H objectKey, K key, V object);

    //
    void delete(K key);

    void delete(List<K> listKeys);

    void deletObj(H objecyKey, K key);

    //
    void update(K key, String value);

    void updateObj(H objectKey, K key, V object);

    //
    String get(K key);

    V getObj(H objectKey, K key);

}

    

    RedisBaseService.java

package com.spj.service.impl;

import com.spj.service.IRedisBaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Created by Owner on 2018/9/27.
 */
@Component
public class RedisBaseService implements IRedisBaseService<String, String, Object> {
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void addLongTime(String key, String value) {
        if (redisTemplate == null) {
            System.out.println("redisTemplate 實例化失敗");
            return;
        } else {
            redisTemplate.opsForValue().set(key, value, 365, TimeUnit.DAYS);
        }
    }

    @Override
    public long setIncrValue(String key) {
        return redisTemplate.opsForValue().increment(key, 1);
    }

    @Override
    public void addShotTime(String key, String value) {
        if (redisTemplate == null) {
            System.out.println("redisTemplate 實例化失敗");
            return;
        } else {
            redisTemplate.opsForValue().set(key, value, 1, TimeUnit.DAYS);
        }
    }

    @Override
    public void addObj(String objectKey, String key, Object object) {
        if (redisTemplate == null) {
            System.out.println("redisTemplate 實例化失敗");
            return;
        } else {
            redisTemplate.opsForHash().put(objectKey, key, object);
        }
    }

    @Override
    public void delete(String key) {
        redisTemplate.delete(key);
    }

    @Override
    public void delete(List<String> listKeys) {
        redisTemplate.delete(listKeys);
    }

    @Override
    public void deletObj(String objecyKey, String key) {
        redisTemplate.opsForHash().delete(objecyKey, key);
    }

    @Override
    public void update(String key, String value) {
    }

    @Override
    public void updateObj(String objectKey, String key, Object object) {

    }

    @Override
    public String get(String key) {
        String value = (String) redisTemplate.opsForValue().get(key);
        return value;
    }

    @Override
    public Object getObj(String objectKey, String key) {
        Object seeUser = (Object) redisTemplate.opsForHash().get(objectKey, key);
        return seeUser;
    }
}

     RedisCache.java

package com.spj.cache;

import org.springframework.cache.Cache;
import org.springframework.cache.support.SimpleValueWrapper;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;

import java.io.*;
import java.util.concurrent.Callable;

public class RedisCache implements Cache {

    private RedisTemplate<String, Object> redisTemplate;
    private String name;

    public RedisTemplate<String, Object> getRedisTemplate() {
        return redisTemplate;
    }

    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return this.name;
    }

    @Override
    public Object getNativeCache() {
        // TODO Auto-generated method stub
        return this.redisTemplate;
    }

    @Override
    public ValueWrapper get(Object key) {
        // TODO Auto-generated method stub
        System.out.println("get key");
        final String keyf = key.toString();
        Object object = null;
        object = redisTemplate.execute(new RedisCallback<Object>() {
            public Object doInRedis(RedisConnection connection)
                    throws DataAccessException {
                byte[] key = keyf.getBytes();
                byte[] value = connection.get(key);
                if (value == null) {
                    return null;
                }
                return toObject(value);
            }
        });
        return (object != null ? new SimpleValueWrapper(object) : null);
    }

    @Override
    public void put(Object key, Object value) {
        // TODO Auto-generated method stub
        System.out.println("put key");
        final String keyf = key.toString();
        final Object valuef = value;
        final long liveTime = 86400;
        redisTemplate.execute(new RedisCallback<Long>() {
            public Long doInRedis(RedisConnection connection)
                    throws DataAccessException {
                byte[] keyb = keyf.getBytes();
                byte[] valueb = toByteArray(valuef);
                connection.set(keyb, valueb);
                if (liveTime > 0) {
                    connection.expire(keyb, liveTime);
                }
                return 1L;
            }
        });
    }

    private byte[] toByteArray(Object obj) {
        byte[] bytes = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(obj);
            oos.flush();
            bytes = bos.toByteArray();
            oos.close();
            bos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return bytes;
    }

    private Object toObject(byte[] bytes) {
        Object obj = null;
        try {
            ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bis);
            obj = ois.readObject();
            ois.close();
            bis.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        return obj;
    }

    @Override
    public void evict(Object key) {
        // TODO Auto-generated method stub
        System.out.println("del key");
        final String keyf = key.toString();
        redisTemplate.execute(new RedisCallback<Long>() {
            public Long doInRedis(RedisConnection connection)
                    throws DataAccessException {
                return connection.del(keyf.getBytes());
            }
        });
    }

    @Override
    public void clear() {
        // TODO Auto-generated method stub
        System.out.println("clear key");
        redisTemplate.execute(new RedisCallback<String>() {
            public String doInRedis(RedisConnection connection)
                    throws DataAccessException {
                connection.flushDb();
                return "ok";
            }
        });
    }

    public <T> T get(Object o, Callable<T> callable) {
        return null;
    }

    @Override
    public <T> T get(Object key, Class<T> type) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ValueWrapper putIfAbsent(Object key, Object value) {
        // TODO Auto-generated method stub
        return null;
    }

}

 

 1九、web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

  <display-name>decp</display-name>
  <description>decp_0.0.1</description>

  <!-- 編碼過濾器 -->
  <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>
  </filter-mapping>

  <!-- 配置DispatcherServlet -->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置springMVC須要加載的配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 匹配全部請求,此處也能夠配置成 *.do 形式 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>


  <!--給日誌配置路徑-->
  <context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>webApp.root</param-value>
  </context-param>


  <!--去掉請求參數空格處理 -->
  <filter>
    <filter-name>parameterFilter</filter-name>
    <filter-class>com.spj.common.ParameterFilter</filter-class>
  </filter>


  <!--去掉請求參數空格處理 mapping -->
  <filter-mapping>
    <filter-name>parameterFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>/admin/login</welcome-file>
  </welcome-file-list>

</web-app>

        ParameterFilter.java

package com.spj.common;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * Created by admin on 2017-05-24 0024.
 * 請求參數過濾器
 */
public class ParameterFilter implements Filter {

    private FilterConfig filterConfig;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    public void destroy() {
        this.filterConfig = null;
    }

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        chain.doFilter(new ParameterTrimRequestWrapper((HttpServletRequest) request), response);
    }
}

 

ParameterTrimRequestWrapper.java

package com.spj.common;

import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.LinkedList;
import java.util.List;

/**
 * Created by admin on 2017-05-24 0024.
 * 去掉請求參數的先後空格
 */
public class ParameterTrimRequestWrapper extends HttpServletRequestWrapper {

    public ParameterTrimRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        if (StringUtils.isNotBlank(value)) {
            return value.trim();
        }
        return null;
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (values == null || values.length <= 0) {
            return null;
        }
        List<String> valueList = new LinkedList<String>();
        for (String value : values) {
            if (StringUtils.isNotBlank(value)) {
                valueList.add(value.trim());
            }
        }
        if (valueList.size() > 0) {
            return valueList.toArray(new String[valueList.size()]);
        }
        return null;
    }

}

 

20、總結

  整個框架搭建以及使用差很少說完了,上面的代碼,在兩個持久化框架之間的協調性,我以爲還有提高的空間,但願你們能給點建議,以及優化方案,我也會在深刻研究一下底層,畢竟兩個框架優缺點都是不同的,注重點也不一樣,但願這個框架能可以給咱們開發提供更加便捷的開發速度;

2一、項目源碼 

連接:https://pan.baidu.com/s/1lRPK2GP8z9Q26FY05Jz3rg 提取碼:nxmj 複製這段內容後打開百度網盤手機App,操做更方便哦

相關文章
相關標籤/搜索