整理spring + mysql + redis + 测试 的配置格式 和源码
经过多次整理,最终以这样的文件格式配置
目前配好的基本模板:
<?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_4_0.xsd" version="4.0"> <!-- <!– 首页–>--> <!-- <welcome-file-list>--> <!-- <welcome-file>/WEB-INF/jsp/toIndex.jsp</welcome-file>--> <!-- </welcome-file-list>--> <!-- 加载spring容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springcontext-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- post请求乱码拦截器 --> <filter> <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- <!–自定义监听,根据sessionid获取session–>--> <!-- <listener>--> <!-- <listener-class>com.songs.monitor.MySessionListener</listener-class>--> <!-- </listener>--> </web-app>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 配置SpringMVC --> <!-- 1.开启SpringMVC注解模式 --> <!-- 简化配置: (1)自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter (2)提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持 --> <mvc:annotation-driven/> <!-- 2.静态资源默认servlet配置 (1)加入对静态资源的处理:js,gif,png (2)允许使用"/"做整体映射 --> <mvc:default-servlet-handler/> <!-- 3.配置视图解析器--> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 4.扫描web相关的bean --> <context:component-scan base-package="cn.cen2guo.clinic.web"/> <!--<!– 拦截器–>--> <!-- <mvc:interceptors>--> <!-- <mvc:interceptor>--> <!--<!– 拦截所有–>--> <!-- <mvc:mapping path="/**"/>--> <!--<!– 设置不拦截请求–>--> <!-- <mvc:exclude-mapping path="/**/fonts"/>--> <!-- <mvc:exclude-mapping path="/**/*.css"/>--> <!-- <mvc:exclude-mapping path="/**/*.js"/>--> <!-- <mvc:exclude-mapping path="/**/*.png"/>--> <!-- <mvc:exclude-mapping path="/**/*.gif"/>--> <!-- <mvc:exclude-mapping path="/**/*.jpg"/>--> <!-- <mvc:exclude-mapping path="/**/*.jpeg"/>--> <!-- <mvc:exclude-mapping path="/**/*Login*"/>--> <!-- <mvc:exclude-mapping path="/**/*login*"/>--> <!-- <mvc:exclude-mapping path="/**/logOut"/>--> <!--<!–拦截逻辑类–>--> <!-- <bean class="com.songs.interceptor.MyInterceptor"/>--> <!-- </mvc:interceptor>--> <!-- </mvc:interceptors>--> <!--文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> </beans>
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" 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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 扫描service包下所有使用注解的类型 --> <context:component-scan base-package="cn.cen2guo.clinic.service" /> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入数据库连接池 --> <property name="dataSource" ref="dataSource" /> </bean> <!-- 通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 传播行为 --> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="find*" propagation="SUPPORTS" read-only="true"/> <tx:method name="get*" propagation="SUPPORTS" read-only="true"/> </tx:attributes> </tx:advice> <!-- 切面 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.cen2guo.clinic.service.*.*(..))"/> </aop:config> </beans>
springcontext-service.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- spring的属性加载器,加载所有properties文件中的属性,供所有springcontext-*.xml文件共同使用 --> <bean id="configPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <!--这样写可以引入多个properties文件--> <!-- <value>/WEB-INF/configInfo.properties</value> --> <value>classpath:redis.properties</value> <value>classpath:jdbc.properties</value> </list> </property> </bean> <!-- 导入redis配置文件--> <import resource="classpath:redis/redisConfigure.xml"/> <!--导入mysql配置文件--> <import resource="classpath:mysql/mysqlConfigure.xml"/> <!-- 导入自定义注册构造注入的bean--> <import resource="classpath:myxml/my_javabean.xml"/> </beans>
springcontext-dao.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <!-- Redis连接池配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- 控制一个pool能分配多少个jedis实例 --> <property name="maxTotal" value="${redis.pool.maxActive}"/> <!-- 连接池中最多空闲多少个maxIdle个连接,这里为20,表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,处于待命状态,随时连接 --> <property name="maxIdle" value="${redis.pool.maxIdle}"/> <!-- 最大等待时间,当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间即抛出异常 --> <property name="maxWaitMillis" value="${redis.pool.maxWait}"/> <!-- 在获取连接时,检查有效性 --> <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/> </bean> <!-- 创建Redis连接池,并做相关配置 --> <bean id="jedisWritePool" class="cn.cen2guo.clinic.redis.JedisPoolWriper" depends-on="jedisPoolConfig"> <constructor-arg index="0" ref="jedisPoolConfig"/> <constructor-arg index="1" value="${redis.hostname}"/> <constructor-arg index="2" value="${redis.port}" type="int"/> <constructor-arg index="3" value="${redis.timeout}" type="int"/> <constructor-arg index="4" value="${redis.password}"/> </bean> <!-- 创建Redis工具类,封装好Redis的连接以进行相关操作 --> <bean id="jedisUtil" class="cn.cen2guo.clinic.redis.JedisUtil" > <property name="jedisPool" ref="jedisWritePool"/> </bean> <!-- 这里的红色下划线提示不是指写错了,而是警告,如果使用自动补全修正,会报错UnsatisfiedDependencyException 为什么使用$进行隔开呢,是因为这是两个类嵌套定义,因为不是文件路径,无法使用.符号进行区分,故使用$符号时没问题的 --> <bean id="jedisKeys" class="cn.cen2guo.clinic.redis.JedisUtil$Keys" > <constructor-arg ref="jedisUtil"/> </bean> <bean id="jedisStrings" class="cn.cen2guo.clinic.redis.JedisUtil$Strings" > <constructor-arg ref="jedisUtil"/> </bean> <bean id="jedisLists" class="cn.cen2guo.clinic.redis.JedisUtil$Lists" > <constructor-arg ref="jedisUtil"/> </bean> <bean id="jedisSets" class="cn.cen2guo.clinic.redis.JedisUtil$Sets" > <constructor-arg ref="jedisUtil"/> </bean> <bean id="jedisHash" class="cn.cen2guo.clinic.redis.JedisUtil$Hash" > <constructor-arg ref="jedisUtil"/> </bean> </beans>
redisConfigure.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置 数据源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <!-- 驱动 --> <property name="driverClassName" value="${jdbc.driverClassName}"/> <!-- url --> <property name="url" value="${jdbc.url}"/> <!-- 用户名 --> <property name="username" value="${jdbc.username}"/> <!-- 密码 --> <property name="password" value="${jdbc.password}"/> </bean> <!-- 配置 Mybatis的工厂 --> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 数据源 --> <property name="dataSource" ref="dataSource"/> <!-- 配置Mybatis的核心 配置文件所在位置 --> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/> <!-- 配置pojo别名 --> <property name="typeAliasesPackage" value="cn.cen2guo.clinic.entity"/> <!--当mapper中的接口文件与xml文件在同一个包下但是不在同一级时--> <!--需要指定mapper 的xml文件路径,如果在同一级则可不写--> <!-- 否则会报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)--> <property name="mapperLocations" value="classpath:cn/cen2guo/clinic/mapper/mapperXML/*.xml"/> </bean> <!--扫描mapper接口, 写在此包下即可被扫描到 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.cen2guo.clinic.mapper"/> </bean> </beans>
mysqlConfigure.xml
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 位置信息服务接口--> <bean id="locationService" class="cn.cen2guo.clinic.service.serviceImpl.LocationServiceImpl"/> </beans>
my_javabean.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- 开启log4j日志,打印到控制台,关闭则注释掉该语句即可--> <!-- <setting name="logImpl" value="STDOUT_LOGGING"/>--> <!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 使用列别名替换列名 默认:true --> <setting name="useColumnLabel" value="true"/> <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 --> <setting name="useGeneratedKeys" value="true"/> </settings> <!-- pageHelper分页插件 --> <!-- <plugins>--> <!-- <plugin interceptor="com.github.pagehelper.PageHelper">--> <!-- <property name="dialect" value="mysql"/>--> <!-- <property name="offsetAsPageNum" value="true"/>--> <!-- <!– rowBoundsWithCount设置为true时,使用 RowBounds 分页会进行 count 查询。 –>--> <!-- <property name="rowBoundsWithCount" value="true"/>--> <!-- <!– pageSizeZero 为 true, 当 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果 –>--> <!-- <property name="pageSizeZero" value="true"/>--> <!-- <!– reasonable 为 true,这时如果 pageNum<=0 会查询第一页,如果 pageNum>总页数 会查询最后一页 –>--> <!-- <property name="reasonable" value="true"/>--> <!-- <property name="returnPageInfo" value="check"/>--> <!-- </plugin>--> <!-- </plugins>--> </configuration>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="testTables" targetRuntime="MyBatis3"> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/clinic" userId="root" password="mysql"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer, 为true时把JDBC DECIMAL和NUMERIC类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- targetProject:生成PO类的位置,重要!! --> <javaModelGenerator targetPackage="cn.cen2guo.clinic.entity" targetProject="src/main/java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置,重要!! --> <sqlMapGenerator targetPackage="cn.cen2guo.clinic.mapper.mapperXML" targetProject="src/main/java"> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置,重要!! --> <javaClientGenerator type="XMLMAPPER" targetPackage="cn.cen2guo.clinic.mapper" targetProject="src/main/java"> <!-- 是否让schema作为包的后缀 --> <property name="enableSubPackages" value="fasle"/> </javaClientGenerator> <!-- 指定数据库表,要生成哪些表,就写哪些表,要和数据库中对应,不能写错! --> <!-- <table tableName="t_province" enableCountByExample="false" enableUpdateByExample="false"--> <!-- enableSelectByExample="false" enableDeleteByExample="false"--> <!-- selectByExampleQueryId="false"/>--> <!-- <table tableName="t_city" enableCountByExample="false" enableUpdateByExample="false"--> <!-- enableSelectByExample="false" enableDeleteByExample="false"--> <!-- selectByExampleQueryId="false"/>--> <!-- <table tableName="t_region" enableCountByExample="false" enableUpdateByExample="false"--> <!-- enableSelectByExample="false" enableDeleteByExample="false"--> <!-- selectByExampleQueryId="false"/>--> </context> </generatorConfiguration>
mybatis-generator.xml
单元测试:
测试时,需要用到mysql和redis,那么只需要获取dao层xml配置文件即可,当然,无法使用spring的@Service ,使用接口则必须手动构造注入bean,
然后由配置文件的ApplicationContext ,获取javabean , 这就是为什么还需要 有 my_javabean.xml 这个文件的原因,调用接口和接口的方法里使用redis和mysql的方法无变化,正常使用即可。