传统ssm开发回顾以及SpringBoot引言、优势、环境搭建
1. 传统的ssm开发
我们先来使用传统的ssm开发一个具有添加员工、查询所有的功能。
开发一个项目的基本流程
# 项目开发一个项目的基本流程- 需求分析概要设计(库表设计)详细设计(验证库表正确性)编码(环境搭建+业务代码)测试部署上线
本次开发的基本流程
# 员工添加 查询所有功能 SSM- 库表 库: ssm 数据库:mysql 表: id name birthday salary# 编码 环境搭建 ssm spring springmvc 一个团队开发 无缝整合- springmvc spring mybatis
因为本次实现的是一个简单的小功能,所以很多项目开发的步骤不需要,省略了。
- 概要设计(库表设计)
- 编码(环境搭建+业务代码)
- 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的优势
- 创建完整的独立的Spring引用程序 springboot只有一个容器
- 从根本上避免了父子容器污染问题(传统的ssm中父、子容器不能污染,父容器:spring,子容器:springmvc,不能污染,即子容器不能扫描到父容器,父容器不能扫描到子容器)
- 嵌入的Tomcat,无需部署WAR文件 springboot内嵌tomcat 应用跑在内嵌服务器
- 简化Maven配置,自动配置Spring SpringMVC,没有XML配置 springboot中只需要引几个依赖
- 用了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搭建环境总结
- pom.xml文件引入依赖
- resources目录生成application.yml
- 创建入口类加入@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 # 修改项目名 注意:项目名必须 "/" 开头