springmvc +spring+mybatis框架总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanfanzk1314/article/details/78123334

1:pom.xml中使用的jar:

<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>io.flysium</groupId>
	<artifactId>app-ss4m-less</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<java.version>1.7</java.version><!-- JDK版本 -->
		<maven.plugins.version>3.3</maven.plugins.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<!-- J2EE -->
		<servlet-api.version>3.1.0</servlet-api.version>
		<jsp-api.version>2.2.1</jsp-api.version>
		<jstl.version>1.2</jstl.version>
		<apache-jstl-impl.version>1.1.2</apache-jstl-impl.version>
		<!-- 框架 -->
		<springframework.version>4.2.9.RELEASE</springframework.version><!-- SpringFramework -->
		<mybatis.version>3.2.8</mybatis.version><!-- mybaits -->
		<mybatis-spring.version>1.2.2</mybatis-spring.version>
		<mybatis.paginator.version>1.2.15</mybatis.paginator.version>
		<aspectj.version>1.8.5</aspectj.version><!-- 面向切面框架AspectJ -->
		<!-- 数据库驱动 -->
		<ojdbc14_g.version>10.2.0.5.0</ojdbc14_g.version>
		<!-- 分布式缓存 -->
		<spring-redis.version>1.7.8.RELEASE</spring-redis.version><!--  Spring Data Redis 集成--><!-- 1.7.8版本需要: jdk6+  Spring Framework 4.2.9.RELEASE+ redis2.6x+    Spring Data Redis is currently tested against the latest 3.0 release. -->
		<redis-cli-jedis.version>2.8.2</redis-cli-jedis.version><!-- Redis Java客户端 jedis客户端2.8.1版本需要 redis2.8x+ -->
		<!-- <redis-cli-lettuce.version>3.5.0.Final</redis-cli-lettuce.version> --><!-- Redis Java客户端 Lettuce客户端4.x 需要 jdk8 --><!-- Lettuce是一个可伸缩线程安全的Redis客户端。多个线程可以共享同一个RedisConnection。它利用优秀netty NIO框架来高效地管理多个连接。  -->
		<!-- 分布式session解决方案 -->
		<spring-session-redis.version>1.2.2.RELEASE</spring-session-redis.version>
		<!-- jackson -->
		<jackson.version>2.5.2</jackson.version>
		<fastjson.version>1.2.30</fastjson.version>
		<!-- 常用工具 -->
		<commons.lang.version>2.6</commons.lang.version>
		<commons-io.version>2.4</commons-io.version>
		<commons.beanutils.version>1.9.2</commons.beanutils.version>
		<commons.collections.version>3.2.2</commons.collections.version>
		<commons.codec.version>1.10</commons.codec.version>
		<commons.fileupload.version>1.3.1</commons.fileupload.version>
		<!-- 日期和时间库 -->
		<joda-time.version>2.1</joda-time.version><!-- joda-time类库 -->
		<!-- FTP工具 -->
		<commons.net.version>1.4.1</commons.net.version>
		<jcraft-jsch.version>0.1.50</jcraft-jsch.version>
		<!-- 日志 -->
		<commons-logging.version>1.2</commons-logging.version>
		<slf4j.version>1.7.9</slf4j.version>
		<log4j.version>1.2.17</log4j.version><!-- log4j日志文件管理包版本 -->
		<!-- 测试 -->
		<junit.version>4.12</junit.version>
	</properties>

	<dependencies>
		<!-- J2EE -->
		<!-- <dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency> --><!-- 3.1 之前的 Servlet API 构件 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>${servlet-api.version}</version>
			<scope>provided</scope>
		</dependency>
		<!-- <dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency> -->
		<!-- <dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency> -->
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>${jsp-api.version}</version>
			<scope>provided</scope>
			<exclusions>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>javax.servlet-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
			<type>jar</type>
			<scope>compile</scope>
			<exclusions>
				<exclusion>
			      <groupId>javax.servlet</groupId>
			      <artifactId>jsp-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>${apache-jstl-impl.version}</version>
		</dependency>
		<!-- spring框架 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${springframework.version}</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${springframework.version}</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${springframework.version}</version>
		</dependency>
		<!-- mybatis框架 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>${mybatis-spring.version}</version>
		</dependency>
		<dependency>
			<groupId>com.github.miemiedev</groupId>
			<artifactId>mybatis-paginator</artifactId>
			<version>${mybatis.paginator.version}</version>
			<exclusions>
				<exclusion>
					<artifactId>mybatis</artifactId>
					<groupId>org.mybatis</groupId>
				</exclusion>
				<exclusion>
					<artifactId>slf4j-api</artifactId>
					<groupId>org.slf4j</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<!-- 面向切面框架AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>${aspectj.version}</version>
		</dependency>
		<!-- 数据库驱动 -->
		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc14_g</artifactId>
			<version>${ojdbc14_g.version}</version>
			<scope>system</scope>
			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/ojdbc14_g-${ojdbc14_g.version}.jar</systemPath>
		</dependency>
		<!-- 分布式缓存 -->
		<dependency>
	      <groupId>redis.clients</groupId>
	      <artifactId>jedis</artifactId>
	      <version>${redis-cli-jedis.version}</version>
	      <scope>compile</scope>
	    </dependency>
	    <!-- <dependency>
		  <groupId>biz.paluch.redis</groupId>
		  <artifactId>lettuce</artifactId>
		  <version>${redis-cli-lettuce.version}</version>
		</dependency> -->
	    <dependency>
	      <groupId>org.springframework.data</groupId>
	      <artifactId>spring-data-redis</artifactId>
	      <version>${spring-redis.version}</version>
	      <scope>compile</scope>
	      <exclusions>
	        <exclusion>
	          <artifactId>slf4j-api</artifactId>
	          <groupId>org.slf4j</groupId>
	        </exclusion>
	        <exclusion>
	          <artifactId>jcl-over-slf4j</artifactId>
	          <groupId>org.slf4j</groupId>
	        </exclusion>
	      </exclusions>
    	</dependency>
    	<!-- 分布式session解决方案: Spring session -->
    	<dependency>
		    <groupId>org.springframework.session</groupId>
		    <artifactId>spring-session-data-redis</artifactId>
		    <version>${spring-session-redis.version}</version>
		    <exclusions>
				<exclusion>
					<groupId>org.springframework.data</groupId>
	     			<artifactId>spring-data-redis</artifactId>
				</exclusion>
				<exclusion>
					<groupId>redis.clients</groupId>
      				<artifactId>jedis</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<!-- jackson -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson.version}</version>
			<exclusions>
				<exclusion>
					<artifactId>jackson-core</artifactId>
					<groupId>com.fasterxml.jackson.core</groupId>
				</exclusion>
				<exclusion>
					<artifactId>jackson-annotations</artifactId>
					<groupId>com.fasterxml.jackson.core</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>${fastjson.version}</version>
		</dependency>
		<!-- 常用工具 -->
		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>${commons.lang.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>${commons-io.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils</artifactId>
			<version>${commons.beanutils.version}</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<artifactId>commons-collections</artifactId>
					<groupId>commons-collections</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>${commons.collections.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>${commons.codec.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>${commons.fileupload.version}</version>
			<exclusions>
				<exclusion>
					<artifactId>commons-io</artifactId>
					<groupId>commons-io</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<!-- 日期和时间库 -->
		<dependency>
			<groupId>joda-time</groupId>
    		<artifactId>joda-time</artifactId>
			<version>${joda-time.version}</version>
		</dependency>
		<!-- ftp -->
		<dependency>
			<groupId>commons-net</groupId>
			<artifactId>commons-net</artifactId>
			<version>${commons.net.version}</version>
			<scope>compile</scope>
		</dependency>
		<!-- sftp -->
		<dependency>
			<groupId>com.jcraft</groupId>
			<artifactId>jsch</artifactId>
			<version>${jcraft-jsch.version}</version>
			<scope>compile</scope>
		</dependency>
		<!-- 日志 -->
		<dependency>
		    <groupId>commons-logging</groupId>
		    <artifactId>commons-logging</artifactId>
		    <version>${commons-logging.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>
		<!-- 测试 -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
		    <version>${springframework.version}</version>
		    <scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<finalName>app-ss4m-less</finalName>
		<pluginManagement>
			<plugins>
				<!-- 编译插件 -->
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>${maven.plugins.version}</version>
					<configuration>
						<source>${java.version}</source>
						<target>${java.version}</target>
						<encoding>${project.build.sourceEncoding}</encoding>
					</configuration>
				</plugin>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-javadoc-plugin</artifactId>
					<version>${maven.plugins.version}</version>
					<configuration>
					</configuration>
					<executions>
						<execution>
							<id>javadoc-jar</id>
							<phase>package</phase>
							<goals>
								<goal>jar</goal>
							</goals>
						</execution>
					</executions>
				</plugin>
			</plugins>
		</pluginManagement>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
				<!--<targetPath>META-INF</targetPath>-->
			</resource>
		</resources>
	</build>

</project>

2:web.xml 中配置:

<web-app>
	<display-name>Archetype Created Web Application</display-name>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>

	<!-- log4j配置开始 -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:config/log4j.properties</param-value>
	</context-param>
	<context-param>
		<param-name>log4jRefreshInterval</param-name>
		<param-value>6000</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	<!-- log4j配置结束 -->
	
	<!-- spring配置文件开始 -->
	<context-param>
		<param-name>contextConfigLocation</param-name><!-- spring配置文件,请根据需要选取 -->
		<param-value>classpath*:webconfig/service-all.xml</param-value>
	</context-param>
	<listener><!-- Spring负责监听web容器启动和关闭的事件 --><!-- Spring ApplicationContext载入 -->
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<listener><!-- Spring监听HTTP请求事件 -->
		<!-- 使spring支持request与session的scope,如: -->
		<!-- <bean id="loginAction" class="com.foo.LoginAction" scope="request"/> -->
		<!-- 使用: -->
		<!-- 1、注解获取:@Autowired HttpServletRequest request; -->
		<!-- 2、java代码:HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); -->
		<!-- 3、直接在参数中传递:public String sayHi(HttpServletRequest request) -->
		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
	</listener>
	<listener><!-- Spring 刷新Introspector防止内存泄露 -->
		<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
	</listener>
	<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>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>false</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- spring配置文件结束 -->

	<!-- spring mvc配置开始 -->
	<servlet>
		<servlet-name>Spring-MVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath*:spring/spring-mvc.xml</param-value><!-- spring mvc配置文件 -->
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Spring-MVC</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	<!-- spring mvc配置结束 -->

	<!-- Spring Session分布式会话解决方案 -->
	<filter>
		<filter-name>springSessionRepositoryFilter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSessionRepositoryFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping> 
  
	<!-- 以下的代码都是样例,你可以阅读或者随意删除。 -->
	<servlet>
		<display-name>a simple demo of servlet,you can remove it as you wish.</display-name>
		<servlet-name>DemoServlet</servlet-name>
		<servlet-class>demo.servlet.DemoServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DemoServlet</servlet-name>
		<url-pattern>/DemoServlet</url-pattern>
	</servlet-mapping>

</web-app>
其中webconfig/service-all.xml中的配置如下:

<beans default-autowire="byName" default-lazy-init="false">

	<!-- 此配置加载所有服务模块,一般为开发者使用 -->
	<import resource="classpath*:spring/spring-config.xml" /><!-- spring基础配置 + 管理数据库 -->
	<import resource="classpath*:spring/logdb-config.xml" /><!-- 日志数据库 -->
	<import resource="classpath*:spring/spring-session.xml" /><!-- 分布式session解决方案-->

</beans>

其中spring-config.xml中的配置(主要是spring基础配置+数据库管理):

<!-- spring配置文件,主要存储业务层与持久层的Bean -->

	<!-- <bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> -->
	<bean id="propertyPlaceholder" class="io.flysium.framework.util.SpringPropertyUtils">
		<property name="systemPropertiesMode" value="2" /><!-- 使用JVM参数覆盖配置文件的参数 -->
		<property name="locations">
			<list>
				<value>classpath*:config/app.properties</value>
				<!-- <value>${CONFIG_PATH}/app.properties</value> -->
				<value>classpath*:config/param.properties</value>
				<!-- <value>${CONFIG_PATH}/param.properties</value> -->
				<value>classpath*:config/cache.properties</value>
				<!-- <value>${CONFIG_PATH}/cache.properties</value> -->
			</list>
		</property>
	</bean>
	
	<!-- 自动扫描类包,将标志Spring注解的类自动转化为Bean,同时完成Bean的注入 -->
	<context:component-scan base-package="io.flysium.framework.app"></context:component-scan>
	<context:component-scan base-package="io.flysium.framework.cache"></context:component-scan>
	<context:component-scan base-package="io.flysium.framework.util"></context:component-scan>
	
	<!-- 使用cglib代理 -->
	<aop:config proxy-target-class="true"/>
	
	<!-- 单个主数据源配置 -->
	<!-- <import resource="jdbc-config.xml" /> -->
	<!-- 动态数据源配置,及支持动态容灾情况,主数据库自动切换到后备数据库 -->
	<import resource="jdbc-dynamic-config.xml" />
	
	<!-- 配置mybatis sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis/sqlmap-config-${DEFAULT_DBTYPE}.xml" />
    </bean>
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>
    
    <!-- 事务管理器配置 -->
    <bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
		<property name="targetDataSource" ref="dataSource" />
	</bean>
	<!-- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<constructor-arg ref="dataSourceProxy" />
	</bean> -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSourceProxy" />
	</bean>
    <!-- 开启事务注解方式注入 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>
    <!-- 事务在@Transactional注解方法中起作用 -->
    <tx:annotation-driven transaction-manager="transactionManager" order="0"/>
    
	<!-- 以下的代码都是样例,你可以阅读或者随意删除。 -->
	<!-- 自动扫描类包,将标志Spring注解的类自动转化为Bean,同时完成Bean的注入 -->
	<context:component-scan base-package="demo"></context:component-scan>
	<!-- <bean id="demoService" class="demo.service.DemoService" ></bean> -->
	<bean id="demoService" class="demo.service.DemoService" scope="request"></bean>

</beans>

jdbc-config.xml单个主数据库配置:

<!-- spring配置文件,主要存储业务层与持久层的Bean -->
	
	<!-- 主数据库-数据源配置 -->
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName">
            <!-- 主数据库 -->
            <value>${DEFAULT_JNDI}</value>
        </property>
    </bean>
    <!-- 后备数据库-数据源配置 -->
    <bean id="reserveDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName">
            <value>${RESERVE_JNDI}</value>
        </property>
    </bean>
    
    <!-- 动态数据源 -->
    <bean class="io.flysium.framework.jdbc.datasource.lookup.DynamicDataSource" id="dataSource">  
	    <property name="targetDataSources">   
	       <map key-type="java.lang.String">   
	           <!-- key与代码Consts.JNDI.DEFAULT_JNDI_NAME 切合 -->
	           <entry value-ref="defaultDataSource" key="DEFAULT_JNDI"></entry>  
	           <!-- key与代码Consts.JNDI.RESERVE_JNDI_NAME 切合 -->
	           <entry value-ref="reserveDataSource" key="RESERVE_JNDI"></entry>  
	       </map>
	    </property>
	    <property name="defaultTargetDataSource" ref="defaultDataSource" ></property>  
	</bean>
	
</beans>

jdbc-dynamic-config.xml中配置:

<!-- 主数据库-数据源配置 -->
    <bean id="defaultDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName">
            <!-- 主数据库 -->
            <value>${DEFAULT_JNDI}</value>
        </property>
    </bean>
    <!-- 后备数据库-数据源配置 -->
    <bean id="reserveDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName">
            <value>${RESERVE_JNDI}</value>
        </property>
    </bean>
    
    <!-- 动态数据源 -->
    <bean class="io.flysium.framework.jdbc.datasource.lookup.DynamicDataSource" id="dataSource">  
	    <property name="targetDataSources">   
	       <map key-type="java.lang.String">   
	           <!-- key与代码Consts.JNDI.DEFAULT_JNDI_NAME 切合 -->
	           <entry value-ref="defaultDataSource" key="DEFAULT_JNDI"></entry>  
	           <!-- key与代码Consts.JNDI.RESERVE_JNDI_NAME 切合 -->
	           <entry value-ref="reserveDataSource" key="RESERVE_JNDI"></entry>  
	       </map>
	    </property>
	    <property name="defaultTargetDataSource" ref="defaultDataSource" ></property>  
	</bean>
	
	<!-- 开启AOP监听 只对当前配置文件有效 -->
	<aop:aspectj-autoproxy expose-proxy="true" />
    <!-- 切面:容灾情况,主数据库自动切换到后备数据库 -->
    <bean id="aspectJ4DataSourceSwitch" class="io.flysium.framework.jdbc.datasource.support.AspectJ4DataSourceSwitch"/>
    <aop:config>
    	<!-- Spring中的事务是通过aop来实现的,如果事务在前,数据源切换在后,会导致数据源切换失效,所以order设置在Spring事务aop之前 -->
    	<!-- 注:Spring事务aop的order在tx:annotation-driven可以配置 -->
        <aop:aspect id="dataSourceCut" ref="aspectJ4DataSourceSwitch" order="-1"><!-- 切面类 -->
        	 <!-- 配置切入点 -->
            <aop:pointcut expression="execution(* io.flysium.framework..*.service.*.*(..))" id="dataSourceCutPoint"/>
            <!-- 切面执行方法 -->
            <aop:before pointcut-ref="dataSourceCutPoint" method="before"/>
            <aop:around pointcut-ref="dataSourceCutPoint" method="doAround"/>
            <!-- 以下的代码都是样例,你可以阅读或者随意删除。 -->
            <aop:pointcut expression="execution(* demo..*.service.*.*(..))" id="demoDataSourceCutPoint"/>
            <aop:before pointcut-ref="demoDataSourceCutPoint" method="before"/>
            <aop:around pointcut-ref="demoDataSourceCutPoint" method="doAround"/>
        </aop:aspect>
    </aop:config>
	
</beans>

spring-session.xml中的配置:

<!-- spring session配置文件,主要处理分布式session解决方案 -->

	<!-- 自动扫描类包,将标志Spring注解的类自动转化为Bean,同时完成Bean的注入 -->
	<context:component-scan base-package="io.flysium.framework.session"></context:component-scan>

</beans>
logdb-config.xml的配置:

<!-- spring配置文件,主要存储业务层与持久层的Bean -->
	
	<!-- 日志数据库-数据源配置 -->
    <bean id="logDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName">
            <value>${LOG_JNDI}</value>
        </property>
    </bean> 
	
	<!-- 配置mybatis sqlSessionFactory -->
    <bean id="logSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="logDataSource" />
        <property name="configLocation" value="classpath:mybatis/sqlmap-config-${LOG_DBTYPE}.xml" />
    </bean>
    <bean id="logSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="logSqlSessionFactory" />
    </bean> 

	<!-- 事务管理器配置 -->
    <bean id="logDataSourceProxy" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
		<property name="targetDataSource" ref="logDataSource" />
	</bean>
	<!-- <bean id="logJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<constructor-arg ref="logDataSourceProxy" />
	</bean> -->
	<bean id="logTansactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="logDataSourceProxy" />
	</bean>
    <!-- 开启事务注解方式注入 -->
	<tx:advice id="logTxAdvice" transaction-manager="logTansactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>
    <!-- 事务在@LogTransactional注解方法中起作用 -->
	<aop:config>
		<aop:pointcut id="logTxOperation" expression="@annotation(io.flysium.framework.transaction.annotation.LogTransactional)" />
		<aop:advisor advice-ref="logTxAdvice" pointcut-ref="logTxOperation" />
	</aop:config><!-- 需要spring aop 及 aspectj框架 -->
	
</beans>

其中前端控制器spring-mvc.xml中配置:

<!-- 默认的mvc注解映射的支持 默认注入RequestMappingHandlerMapping和RequestMappingHandlerAdapter,这里如果自定义HandlerMapping 或 HandlerAdapter 就不要写-->
	<!-- <mvc:annotation-driven /> -->

	<!-- 自动扫描类包,将标志Spring注解的类自动转化为Bean,同时完成Bean的注入 -->
	<!-- 扫描控制器 -->
	<context:component-scan base-package="io.flysium" use-default-filters="false">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
		<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController" />
		<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
	</context:component-scan>

	<!-- 1、多部分请求解析器(MultipartResolver)配置,与上传文件有关 需要类库commons-io、commons-fileupload -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="utf-8"></property><!-- 默认编码-->
		<property name="maxUploadSize" value="104857600"></property><!-- 文件大小最大值-->
		<property name="maxInMemorySize" value="40960"></property><!-- 内存中的最大值-->
	</bean>
	
	<!-- 2、本地化(LocaleResolver)配置 -->
	<!-- <bean id="localeResolver" class="org.springframework.web.servlet.i18n.FixedLocaleResolver"> 
		</bean> -->

	<!-- 3、主题解析器(ThemeResolver)配置 -->
	<!-- <bean id="themeResolver" class="org.springframework.web.servlet.theme.FixedThemeResolver"> 
		</bean> -->

	<!-- 4、处理器映射器(HandlerMapping)配置,可以配置多个 -->
	<!-- order 优先级,越小越高  -->
	<!--  BeanNameUrlHandlerMapping :通过对比url和bean的name找到对应的对象  -->
	<!--  SimpleUrlHandlerMapping :也是直接配置url和对应bean,比BeanNameUrlHandlerMapping功能更多   -->
	<!--  DefaultAnnotationHandlerMapping : 主要是针对注解配置@RequestMapping的,已过时   -->
	<!--  RequestMappingHandlerMapping :取代了上面一个  -->
	<!-- 自定义 -->
	<bean id="handlerMapping" class="io.flysium.framework.web.servlet.mvc.method.annotation.CustomHandlerMapping">
		<property name="order" value="-1" />
	</bean> 

	<!-- 5、处理器适配器(HandlerAdapter)配置,可以配置多个 -->
	<!-- messageConverters 映射前台传参与handler处理方法参数 -->
	<!--  HttpRequestHandlerAdapter : 要求handler实现HttpRequestHandler接口,该接口的方法为 void handleRequest(HttpServletRequest request, HttpServletResponse response)也就是  handler必须有一个handleRequest方法  --> 
	<!--  SimpleControllerHandlerAdapter:要求handler实现Controller接口,该接口的方法为ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)  --> 
	<!--  AnnotationMethodHandlerAdapter :和上面的DefaultAnnotationHandlerMapping配对使用的,也已过时   --> 
	<!--  RequestMappingHandlerAdapter : 和上面的RequestMappingHandlerMapping配对使用,针对@RequestMapping  --> 
	<!-- 自定义 -->
	<bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<property name="order" value="-1" />
		<property name="messageConverters">
			<list>
				 <!--  <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> -->
               <ref bean="mappingJacksonHttpMessageConverter" />
			</list>
		</property>
		<property name="webBindingInitializer">  
            <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">  
                <property name="conversionService">  
                     <!-- 针对普通请求(非application/json) 前台的日期字符串与后台的Java Date对象转化,此情况,应使用spring mvc本身的内置日期处理 -->
                     <!-- 可以在VO属性上加注解:@DateTimeFormat 需要类库joda-time -->
                     <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>  
                </property>  
            </bean>  
        </property> 
	</bean>
	<!-- json请求(application/json)返回值Date转String,全局配置 -->
	<bean name="jacksonObjectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
	    <property name="featuresToDisable">
	        <array>
	            <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS"/>
	        </array>
	    </property>
	    <!-- 如果想自定义,可以在VO属性上加注解:@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = Consts.DATE_PATTERN.DATE_PATTERN_OBLIQUE,timezone = "GMT+8") -->
	    <property name="simpleDateFormat"><value>yyyy-MM-dd HH:mm:ss</value></property>
	</bean>
	<!--避免IE执行Ajax时,返回JSON出现下载文件 -->
	<!-- 自定义 -->
	<bean id="mappingJacksonHttpMessageConverter" class="io.flysium.framework.http.converter.json.CustomJackson2HttpMessageConverter">
		<property name="objectMapper" ref="jacksonObjectMapper"/>
		<property name="supportedMediaTypes">
			<list>
				<value>text/html;charset=UTF-8</value>
				<value>application/json;charset=UTF-8</value>
			</list>
		</property>
	</bean>
	<!-- 自定义请求参数通知器 -->
	<bean id="customRequestBodyAdvice" class="io.flysium.framework.web.servlet.mvc.method.annotation.CustomRequestBodyAdvice"></bean>
	<!-- JSONP响应参数通知器 -->
	<bean id="jsonpRequestBodyAdvice" class="io.flysium.framework.web.servlet.mvc.method.annotation.JSONPResponseBodyAdvice"></bean>

	<!-- 6、处理器异常解析器(HandlerExceptionResolver)配置,可以配置多个 -->
	<bean id="handlerExceptionResolver" class="io.flysium.framework.web.servlet.handler.CustomHandlerExceptionResolver"><!-- 自定义 -->
		<!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->
		<property name="warnLogCategory" value="WARN" />
	</bean>

	<!-- 7、请求到视图名翻译器(RequestToViewNameTranslator)配置 -->
	<!-- RequestToViewNameTranslator可以在处理器返回的View为空时使用它根据Request获得viewName。 -->
	<!-- <bean id="viewNameTranslator" class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"> 
		</bean> -->
		
	<!-- 8、视图解析器(ViewResolver)配置,可以配置多个 -->
	<!-- 定义跳转的文件的前后缀 ,视图模式配置 -->
	<!-- 主要针对@Controller返回ModelAndView的视图路径解析 -->
	<!-- 自动给后面控制器的方法return的字符串 加上前缀和后缀,变成一个 可用的url地址 -->
	<!-- viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,classpath中必须包含jstl的相关jar包; -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/" />
		<property name="suffix" value=".jsp" />
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
	</bean>
	
	<!-- 以下的代码都是样例,你可以阅读或者随意删除。 -->
	<!-- 自动扫描类包,将标志Spring注解的类自动转化为Bean,同时完成Bean的注入 -->
	<context:component-scan base-package="demo" use-default-filters="false">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
		<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController" />
		<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
	</context:component-scan>

</beans>
mybatis-config.xml 中配置:

<configuration>
	
	<!-- 配置 -->
	<settings>
		<setting name="jdbcTypeForNull" value="NULL" />
		<setting name="logImpl" value="LOG4J" />
	</settings>

	<!-- 扫描model的包名 -->
	<typeAliases>
		<!-- 以下的代码都是样例,你可以阅读或者随意删除。 -->
		<package name="demo.common.vo"></package>
	</typeAliases>

	<plugins>
		<!-- 分页插件 -->
		<plugin
			interceptor="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor">
			<property name="dialectClass" value="com.github.miemiedev.mybatis.paginator.dialect.OracleDialect" />
		</plugin>
	</plugins>

	<mappers>
		<mapper resource="mybatis/oracle/SysOperLog.xml" />
	</mappers>

</configuration>





猜你喜欢

转载自blog.csdn.net/fanfanzk1314/article/details/78123334