<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; } }