> 文档中心 > 传统ssm开发回顾以及SpringBoot引言、优势、环境搭建

传统ssm开发回顾以及SpringBoot引言、优势、环境搭建


1. 传统的ssm开发

我们先来使用传统的ssm开发一个具有添加员工查询所有的功能。

开发一个项目的基本流程

# 项目开发一个项目的基本流程- 需求分析概要设计(库表设计)详细设计(验证库表正确性)编码(环境搭建+业务代码)测试部署上线

本次开发的基本流程

# 员工添加 查询所有功能  SSM- 库表   库: ssm   数据库:mysql  表: id name birthday salary# 编码 环境搭建 ssm  spring  springmvc   一个团队开发 无缝整合- springmvc  spring  mybatis

因为本次实现的是一个简单的小功能,所以很多项目开发的步骤不需要,省略了。

  1. 概要设计(库表设计)

在这里插入图片描述

在这里插入图片描述

  1. 编码(环境搭建+业务代码)
  • ssm环境搭建,在pom.xml中引入相关依赖
    • spring
    • springmvc
    • mybatis
    • mysql
    • druid
    • mybatis-spring
    • 转换json的依赖
    • aop的依赖
        <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.6</version>    </dependency>    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.3.6</version>    </dependency>    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.3.6</version>    </dependency>    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.6</version>    </dependency>    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>5.3.6</version>    </dependency>    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.6</version>    </dependency>    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.6</version>    </dependency>        <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.6</version>    </dependency>     <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.4</version>    </dependency>        <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</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>2.0.6</version>    </dependency>        <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.3</version>    </dependency>        <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version>    </dependency>        <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.5</version>    </dependency>

ssm这三个框架是由spring框架作为中间桥梁,spring框架和springmvc框架是天生的无缝整合,但是和mybatis框架并不是如此,所以我们接下来要做的是先整合spring框架和mybatis框架(配置spring.xml配置文件)。

spring整合mybatis的配置文件

<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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">        <context:component-scan base-package="com.baizhi.service"/>        <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/ssm?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/>    </bean>        <bean class="org.mybatis.spring.SqlSessionFactoryBean" name="sqlSessionFactory"> <property name="dataSource" ref="dataSource"/>  <property name="mapperLocations" value="classpath:com/baizhi/mapper/*.xml"/>  <property name="typeAliasesPackage" value="com.baizhi.eneity"/>    </bean>        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <property name="basePackage" value="com.baizhi.dao"/>    </bean>        <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"> <property name="dataSource" ref="dataSource"/>    </bean>        <tx:annotation-driven transaction-manager="transactionManager"/></beans>

在这里插入图片描述

# 小知识点对于java包下的文件来说java包就是根目录在java包(及子包)中下级文件用  .    比如建eneity包时   com.baizhi.eneity对于resources包下的文件来说resources包就是根在resources包(及子包)中下级文件用  / 比如建mapper包时   com.baizhi.mapper

下面我们需要开发实体类DAO接口Mapper配置文件,我们先看一下它们在项目中的位置

在这里插入图片描述

实体类Emp

public class Emp {    private Integer id;    private String name;    private Date birthday;    private double salary;// 有参、无参构造、get、set、to_String这些方法都是要写的    // 为了不影响阅读,这里没有粘,但实际上是有的}

EmpDAO接口

public interface EmpDAO {    // 保存    void save(Emp emp);    // 查询所有    List<Emp> findAll();}

EmpMapper配置文件

<?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.baizhi.dao.EmpDAO">    <!--保存-->    <insert id="save" parameterType="com.baizhi.eneity.Emp" useGeneratedKeys="true" keyProperty="id"> insert into emp values(#{id}, #{name}, #{birthday}, #{salary})    </insert>    <!--查询所有-->    <select id="findAll" resultType="com.baizhi.eneity.Emp"> select id, name, birthday, salary from emp;    </select></mapper>

在这里插入图片描述

这里其实应该测试一下,但是由于这个业务比较简单,所以我们把它和service放到一起测试。

接下来需要开发EmpService接口EmpService接口的实现类,还要进行测试,我们先来看一下它们在项目中的位置。

在这里插入图片描述

EmpService接口

public interface EmpService {    // 保存    void save(Emp emp);    // 查询所有    List<Emp> findAll();}

实现EmpService接口的实现类EmpServiceImpl

@Service@Transactionalpublic class EmpServiceImpl implements EmpService{    private EmpDAO empDAO;    @Autowired    public void setEmpDAO(EmpDAO empDAO) { this.empDAO = empDAO;    }    @Override    public void save(Emp emp) { empDAO.save(emp);    }    @Override    public List<Emp> findAll() { return empDAO.findAll();    }}

在这里插入图片描述

测试类

public class TestEmpServiceImpl {    public static void main(String[] args) { // 1. 运行工厂 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); // 2. 工厂中获取对象 EmpService empService = (EmpService) context.getBean("empServiceImpl"); empService.save(new Emp(null, "小陈", new Date(), 23.23));  // 3. 调用方法 empService.findAll().forEach(emp -> System.out.println(emp));    }}

在这里插入图片描述

mybatis和spring已经整合完了,接下来开始springmvc的整合,

springmvc的配置文件springmvc.xml

<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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">        <context:component-scan base-package="com.baizhi.controller"/>        <mvc:annotation-driven/>        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/>    </bean></beans>

在这里插入图片描述

在服务器启动的时候需要把springmvc的工厂启动起来,所以我们需要配置web.xml

<web-app>  <display-name>Archetype Created Web Application</display-name>    <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:spring.xml</param-value>  </context-param>    <listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>    <servlet>    <servlet-name>springmvc</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:springmvc.xml</param-value>    </init-param>  </servlet>    <servlet-mapping>    <servlet-name>springmvc</servlet-name>    <url-pattern>/</url-pattern>  </servlet-mapping></web-app>

在这里插入图片描述

开发控制器

@RestController     // 代表类中返回值转为json响应到浏览器public class EmpController {    private EmpService empService;    @Autowired    public void setEmpService(EmpService empService) { this.empService = empService;    }    // 保存    @RequestMapping("save")    public void save(Emp emp){ empService.save(emp);    }    // 查询所有    @RequestMapping("findAll")    List<Emp> findAll(){ return empService.findAll();    }}

2. 现有SSM开发存在问题

  • 大量maven冗余配置
  • 每次构建项目都要书写大量相同配置极大浪费了项目开发时间
  • 每次整合第三方技术都需要编写相关配置文件
  • 项目测试每次都需要部署到tomcat

注意:这就是早期的SSM或者SSH开发存在问题,是不是很麻烦☹️☹️☹️

3. SpringBoot的引言

SpringBoot是由Pivotal团队提供的全新框架,其设计的目的是用来简化Spring应用的 初始搭建以及开发过程。该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

SpringBoot 全新框架 作用:简化Spring应用初始搭建和开发过程。

如何简化:开发人员使用SpringBoot只要基于特定方式进行配置 简化spring使用

SpringBoot 微框架:5分钟完成之前ssm中环境搭建

springboot(微框架)= springmvc(控制器)+ spring core(项目管理)

4. SpringBoot的优势

  1. 创建完整的独立的Spring引用程序 springboot只有一个容器
    1. 从根本上避免了父子容器污染问题(传统的ssm中父、子容器不能污染,父容器:spring,子容器:springmvc,不能污染,即子容器不能扫描到父容器,父容器不能扫描到子容器)
  2. 嵌入的Tomcat,无需部署WAR文件 springboot内嵌tomcat 应用跑在内嵌服务器
  3. 简化Maven配置,自动配置Spring SpringMVC,没有XML配置 springboot中只需要引几个依赖
    1. 用了springboot,spring应用再无xml

5. SpringBoot的约定

在这里插入图片描述

  • springboot 项目中必须在src/main/resources中放入application.yml(.properties)核心配置文件 名字必须为:application

  • springboot 项目中必须在src/main/java中所有子包之外构建全局入口类型,xxApplication,入口类一个springboot项目只能有一个

在这里插入图片描述

6. SpringBoot环境搭建

环境要求

# 1. System RequirementsJDK 1.8+MAVEN 3.2+Spring Framework 5.x+# 2. ServletContainersTomcat 9.0+# 3. 开发工具IDEA2021版本

新建项目

在这里插入图片描述

在下面环境搭建过程中包结构

在这里插入图片描述

在pom.xml文件中引入依赖

<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.5.0</version></parent><dependencies>        <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>    </dependency></dependencies><repositories>    <repository> <id>aliyun-repos</id> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <snapshots>     <enabled>false</enabled> </snapshots>    </repository></repositories><pluginRepositories>    <pluginRepository> <id>aliyun-plugin</id> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <snapshots>     <enabled>false</enabled> </snapshots>    </pluginRepository></pluginRepositories>

在这里插入图片描述

创建application.yml配置文件

配置文件里面什么都不写就行

在这里插入图片描述

创建入口类

// 这个注解:修饰范围:用在类上   只能用在入口类上  只能出现一次// 作用:标志这个类是springboot的入口类  启动整个springboot项目的总入口@SpringBootApplicationpublic class SpringBootDay1Application {    public static void main(String[] args) { // 启动springboot应用 参数1:指定入口类的类对象 .class  参数2:main函数参数 SpringApplication.run(SpringBootDay1Application.class, args);    }}

在这里插入图片描述

注:到这里项目环境已经搭建成功了,仅需要5分钟

springboot搭建环境总结

  1. pom.xml文件引入依赖
  2. resources目录生成application.yml
  3. 创建入口类加入@SpringBootApplication注解 在main函数中启动应用

接下来我们来测试一下

开发一个Controller

@RestControllerpublic class HelloController {    // 测试控制器 测试地址:在以前使用ssm开发时测试http://localhost:端口号/项目名/请求路径    // 但是,注意:springboot项目默认启动没有项目名 http://localhost:8080/hello    @RequestMapping("hello")    public String Hello(){ System.out.println("hello springboot......"); return "hello springboot";    }}

注意:springboot项目默认启动没有项目名

如果想要修改内嵌服务器的端口号,则在application.xml文件中加入:

#后面的是注释

server:  port: 8081  # 修改内嵌服务器的端口号

springboot默认在访问时不需要项目名,如果想要在访问时指定项目名,则可以在application.xml文件中加入:

server:  servlet:    context-path: /springboot_day1 # 修改项目名  注意:项目名必须 "/" 开头

在这里插入图片描述