Spring整合SpringMvc
- IT业界
- 2025-08-20 08:15:02

这里写目录标题 1.前期准备1.1 创建Spring配置类 2.Spring整合MyBatis2.1 Spring注册数据源(dataSource)2.2 Spring整合mybatis(添加mybatis配置类)2.2.1 SqlSessionFactoryBean2.2.2 MapperScannerConfigurer 2.3 Spring整合事务管理 3.Spring整合SpringMvc3.1 SpringMvc配置类3.2 初始化Spring、SpringMvc容器3.3 表现层数据封装3.4 全局异常处理器 1.前期准备
一、导入坐标
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> </dependencies> 1.1 创建Spring配置类功能:使用SpringConfig配置类替代application.xml
@Configuration @ComponentScan(value = "com.itheima", excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Controller.class ) ) public class SpringConfig { }1.@Configuration
该注解在类上,使得这个类的功能同于一个bean xml配置文件,可以在这个类中管理创建Bean。
2.@ComponentScan
该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>
回顾以往xml的配置
<!-- 开启注解扫描 --> <context:component-scan base-package="cn.itcast.usermanage.service"/>2.Spring整合MyBatis
一、修改Spring配置类
@Configuration @ComponentScan(value = "com.itheima", excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Controller.class ) ) @PropertySource("jdbc.properties") @Import({JdbcConfig.class, MybatisConfig.class}) public class SpringConfig { }@PropertySource
通过@PropertySource注解可以将properties配置文件中的key/value存储到Spring的Environment中,Environment接口提供了方法去读取配置文件中的值,参数是properties配置文件中定义的key值。 当然了,也可以使用@Value注解用${}占位符为bean的属性注入值。
回顾以往xml的配置
<!-- 加载外部的properties文件--> <context:property-placeholder location="classpath:jdbc.properties"/>@Import 引入其他的配置类,需要在主配置类里引用,@Import(SecondJavaConfig.class)
回顾以往是怎么读取其他Spring配置文件的
1.将Spring主配置文件、Spring整合mybatis的配置文件、Spring整合事务的配置文件都统一放在spring文件夹下,并有统一的命名规范
2.初始化Spring容器时,读取这些文件,构造一个完整的Spring容器
mybatis、transaction这些文件都可以写到主配置中,但是为了区分功能(解耦),所以各自定义了自己的配置文件 在注解开发中,我们可以将其他配置类引入到主配置类中,这样只要读取主配置类即可
二、添加jdbc.properties
jdbc.driverClass=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/my_database jdbc.username=root jdbc.password=root2.1 Spring注册数据源(dataSource) public class JdbcConfig { @Value("${jdbc.driverClass}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Bean public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } }
mybatis的底层是jdbc,mybatis是对jdbc的封装,此处我们将数据源的配置放到jdbc配置类中(其实也能放到mybatis的配置类,效果一样)
@Bean 注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。
类同于
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>2.2 Spring整合mybatis(添加mybatis配置类) 配置SqlSessionFactoryBean 注入数据源设置全局配置(此处设置了别名) 配置MapperScannerConfigurer public class MybatisConfig { // 配置SqlSessionFactoryBean @Bean public SqlSessionFactoryBean SqlSessionFactory(DataSource dataSource) { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); // 注入数据源 factoryBean.setDataSource(dataSource); // 扫描类型别名 factoryBean.setTypeAliasesPackage("com.itheima.domain"); return factoryBean; } @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer msc = new MapperScannerConfigurer(); // 扫描mapper接口 msc.setBasePackage("com.itheima.dao"); return msc; } } 2.2.1 SqlSessionFactoryBean
一、回顾mybatis怎么初始化SqlSessionFactory 在没有引入Spring概念时,我们是手动构建SqlSessionFactory,这个过程比较麻烦,现在我们有了Spring
public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; // 读取配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); // 构建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 获取sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(true); // 获取对应mapper OrderMapper orderMapper= sqlSession.getMapper(OrderMapper.class); Order order = orderMapper.queryOrderWithUser("20140921001"); System.out.println(order); }在mybatis-spring的整合包下,存在一个sqlSessionFactoryBean,它是用来在spring容器中生产sqlSessionFactory的工厂Bean
二、回顾Spring整合mybatis(xml配置方式) 1.在applicationContext-mybatis.xml中定义SqlSessionFactoryBean 2.注入数据源以及mybatis全局配置(mybatis-config.xml)
<!-- spring构建sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定mybatis的数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 指定mybatis的全局配置文件 --> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property> </bean>2.2.2 MapperScannerConfigurer
MapperScannerConfigurer是为了解决MapperFactoryBean繁琐而生的,有了MapperScannerConfigurer就不需要我们去为每个映射接口去声明一个bean了。大大缩减了开发的效率。
一、回顾以往的mapper扫描
<mappers> <package name="com.itheima.mapper"/> </mappers>2.3 Spring整合事务管理 注解开启事务支持注册事务管理器(根据不同的持久化框架)给需要被事务管理的类、方法…添加@Transaction
一、添加注解 @EnableTransactionManagement 开启事务支持
@Configuration @ComponentScan(value = "com.itheima", excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Controller.class ) ) @PropertySource("jdbc.properties") @Import({JdbcConfig.class, MybatisConfig.class}) @EnableTransactionManagement public class SpringConfig { }二、在jdbc配置类中注册事务管理器
@Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { // 不同的持久化框架,选择不同的事务管理器 DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); transactionManager.setDataSource(dataSource); return transactionManager; }不同的持久化框架,需要使用不同的事务管理器
Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现:
事务说明org.springframework.jdbc.datasource.DataSourceTransactionManager使用Spring JDBC或iBatis进行持久化数据时使用org.springframework.orm.hibernate5.HibernateTransactionManager使用Hibernate5.0版本进行持久化数据时使用org.springframework.orm.jpa.JpaTransactionManager使用JPA进行持久化时使用org.springframework.jdo.JdoTransactionManager当持久化机制是Jdo时使用org.springframework.transaction.jta.JtaTransactionManager使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用三、在类、方法上添加事务注解@Transactional
@Transactional public class BookServiceImpl implements BookService { ..... }回顾之前我们是怎么注册事务管理器的
<!-- druid连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/my_database"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <!-- 第一步:定义具体的平台事务管理器(DataSource事务管理器) --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入数据源 --> <property name="dataSource" ref="dataSource"/> </bean> 3.Spring整合SpringMvc 3.1 SpringMvc配置类 @Configuration @ComponentScan("com.itheima.controller") @EnableWebMvc public class SpringMvcConfig { }@EnableWebMvc 有很多作用,这里仅使用其一种作用:开启自动转换json数据的支持
3.2 初始化Spring、SpringMvc容器 public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer { // 初始化Spring容器 protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; } // 初始化SpringMvc容器 protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } protected String[] getServletMappings() { return new String[]{"/"}; } } 3.3 表现层数据封装
我们在进行业务操作后,响应给前端的数据格式可能是不同的,例如
增、改、删操作,返回了boolean类型查询操作返回了对象类型不便于前端对数据的解析,所以一般会设置成统一格式进行返回
设置统一的数据返回结果类
public class Result { private Object data; private Integer code; private String msg; }Result类中的字段并不是固定的,可以根据需要自行增减 提供若干个构造方法,方便操作
3.4 全局异常处理器所有的异常均需抛出到表现层进行处理,但是这样又出现了一个问题:表现层处理异常,每个方法中单独书写,代码书写量大且意义不强!
使用AOP的思维,针对所有@Controller进行异常处理,SpringMvc针对此需求提供了一个异常处理器
全局异常处理器: 集中的、统一的处理项目中出现的异常(使用一个类就能搞定所有的异常)
@RestControllerAdvice public class ProjectExceptionAdvice { @ExceptionHandler(Exception.class) public Result doException(Exception ex){ return new Result(666,null); } }@RestControllerAdvice 声明这个类是用于做异常处理(Spring需要读取到此类)
@RestControllerAdvice和@ControllerAdvice最大的不同在于:@RestControllerAdvice不用加@ResponseBody
@ExceptionHandler 指定拦截的异常
Spring整合SpringMvc由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Spring整合SpringMvc”