当前位置: 首页 > news >正文

Spring整合SpringMvc

这里写目录标题

  • 1.前期准备
    • 1.1 创建Spring配置类
  • 2.Spring整合MyBatis
    • 2.1 Spring注册数据源(dataSource)
    • 2.2 Spring整合mybatis(添加mybatis配置类)
      • 2.2.1 SqlSessionFactoryBean
      • 2.2.2 MapperScannerConfigurer
    • 2.3 Spring整合事务管理
  • 3.Spring整合SpringMvc
    • 3.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=root

2.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 JDBCiBatis进行持久化数据时使用
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
指定拦截的异常


相关文章:

  • 【内网安全-隧道搭建】内网穿透_Frp上线、测试
  • 【Linux】冯诺依曼体系与操作系统(OS)概念
  • CUDA的代替选择
  • 数学知识-质数
  • 【linux】进程间通信——管道通信
  • 【内网安全-隧道搭建】内网穿透_Ngrok上线(美版、国版二开)
  • 哈希表的概念(散列表)
  • 【Python小游戏】2023兔年吉祥,祝大家辞旧迎新,前兔无量啦~兔年都在玩的这两款游戏,只有0.1%的人通关,你玩了吗?(内含福利源码)
  • 【计算机程序设计思想与方法】2 什么是计算思维?
  • 题库——“C”
  • 若依框架 -------- vue3+element-plus(三)
  • MATLAB入门——线性规划、非线性规划、多目标规划
  • MobaXterm使用指南
  • 电子技术——BJT的物理结构
  • VBA提高篇_18 VBA代码录制优化Select(tion)及表格合并Merge(cells()/Rows()/Columns()
  • 数据结构(C++)图论基础
  • Python爬虫以及数据可视化分析之某站热搜排行榜信息爬取分析
  • JavaScript高级 ES7-ES13 新特性
  • Django的信号机制解读
  • 线程安全的集合类(多线程环境下使用ArrayList、队列及哈希表)
  • 美军一天内对也门发动50余次袭击,胡塞武装称再次击落美军无人机
  • 第六季了,姐姐们还能掀起怎样的风浪
  • 姜仁华任中国水稻研究所所长,胡培松院士卸任
  • 平安银行一季度净赚超140亿元降5.6%,营收降13.1%
  • 新疆维吾尔自治区政协原副主席窦万贵一审被控受贿超2.29亿
  • 美法官裁定谷歌非法垄断在线广告