<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>
<?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>
(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>
<?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>
<?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>
<?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.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.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.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
headico=com.mysql.jdbc.Driver
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; } }
<!-- 自定義日期轉換類 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <!--日期輸入參數轉換器 --> <bean class="com.spj.common.DateConverter"/> </set> </property> </bean>
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); } } }
<!-- 配置數據庫相關參數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>
<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數據鏈接管理工廠 --> <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>
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; } }
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; } }
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; } }
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"; } }
<!-- 激活自動代理功能 --> <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>
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()); } }
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); } } }
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()); } }
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; } }
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; } }
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); }
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); }
<?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>
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(); }
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); }
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); } }
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("上傳成功"); } }
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); }
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; } }
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; } }
<?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>
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); } }
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; } }