Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。
Spring是一个开源容器框架,它集成各类型的工具,通过核心的Bean factory实现了底层的类的实例化和生命周期的管理。在整个框架中,各类型的功能被抽象成一个个的 Bean,这样就可以实现各种功能的管理,包括动态加载和切面编程。
Spring是独特的,因为若干个原因:
它定位的领域是许多其他流行的framework没有的。Spring致力于提供一种方法管理你的业务对象。
Spring是全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。
Spring特点
(1)方便解耦,简化开发
(2)Aop编程支持
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务操作
(6)降低API开发难度
IoC 即控制反转,简单来说就是把原来代码⾥需要实现的对象创建、依赖反转给容器来帮忙实现,需要创建⼀个容器并且需要⼀种描述让容器知道要创建的对象间的关系,在 Spring 中管理对象及其依赖关系是通过 Spring 的 IoC 容器实现的。
IoC 的实现⽅式有依赖注⼊和依赖查找,由于依赖查找使⽤的很少,因此 IoC 主要通过依赖注⼊实现。依赖注⼊指对象被动地接受依赖类⽽不⽤⾃⼰主动去找,对象不是从容器中查找它依赖的类,⽽是在容器实例化对象时主动将它依赖的类注⼊给它。
基于xml 的配置文件
第一种注入方式:使用set方法进行注入
/***演示使用set方法进行注入属性*/
public class Book {
//创建属性
private String bname;
private String bauthor;
//创建属性对应的set方法
public void setBname(String bname) {
this.bname = bname;
}
public void setBauthor(String bauthor) {
this.bauthor = bauthor;
}
}
<bean id="book" class="com.atguigu.spring5.Book">
<property name="bname" value="易筋经">property>
<property name="bauthor" value="达摩老祖">property>
bean>
第二种注入方式:使用有参数构造方法进行注入
public class Orders { //属性
private String oname;
private String address;
//有参数构造方法
public Orders(String oname,String address) {
this.oname = oname; this.address = address; }
}
<bean id="orders" class="com.atguigu.spring5.Orders">
<constructor-arg name="oname" value="电脑">constructor-arg>
<constructor-arg name="address" value="China">constructor-arg>
bean>
@Aspect 声明此类是aop 加强类
前置通知: @Before
后置通知: @After
环绕通知: @Around
最后通知: @AfterReturning
异常通知: @AfterThrowing
@Autowired 根据属性类型进行自动装配
@Qualifier 根据bean名称进行注入
//@Qualifier(“userDaoImpl1”)
@Resource:可以根据类型注入,可以根据名称注入 (不建议使用)
@Value:注入普通类型属性
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
M:Model,模型层,指工程中的JavaBean,作用是处理数据
JavaBean分为两类:
V:View,视图层,指工程中的html, jsp, vue, htm, php, asp等页面,作用是与用户进行交互,展示数据
C:Controller,控制层/表现层,指工程中的servlet,作用是接收请求和响应浏览器
MVC的工作流程:
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器
SpringMVC是Spring的一个子项目
SpringMVC 是 Spring 为表现层开发提供的一整套完备的解决方案。
目前业界普遍选择了 SpringMVC 作为 Java EE 项目表现层开发的首选方案。
注:三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台servlet
package com.tty.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tty.bean.Book;
import com.tty.controller.utils.Res;
import com.tty.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @ClassName BookController
* @描述 表现层(处理器)
* @作者 杨老师
* @日期 2022/5/31 下午 04:54
**/
//@RestController是一个复合注解, 由@Controller + @ResponseBody 组成
//@Controller 把此类交给ioc 容器管理
//@ResponseBody 表明该类中所有方法都是返回Json 格式数据
@RestController
@RequestMapping("books")
public class BookController {
@Autowired
IBookService bookService;
@GetMapping("{id}")
public Res getById(@PathVariable int id) {
//查询书本by id
return new Res(bookService.getBookById(id), true);
}
@PostMapping
public Res save(@RequestBody Book book){
//新增书本
boolean flag = bookService.saveBook(book);
return new Res(flag, flag ? "新增书本成功" : "新增书本失败");
}
@PutMapping
public Res update(@RequestBody Book book){
//更改书本
boolean flag = bookService.updateBook(book);
return new Res(flag, flag ? "更改书本成功" : "更改书本失败");
}
@DeleteMapping("{id}")
public Res delete(@PathVariable int id){
//删除书本
boolean flag = bookService.deleteBookById(id);
return new Res(flag, flag ? "删除书本成功" : "删除书本失败");
}
@GetMapping("{current}/{size}")
public Res getPage(@PathVariable int current, @PathVariable int size, Book book) throws Exception {
IPage<Book> page = bookService.getBookPage(current, size, book);
//如果当前页码值大于了总页码值,那么重新执行查询操作,使用最大页码值作为当前页码值
if( current > page.getPages()){
page = bookService.getBookPage((int)page.getPages(), size, book);
}
//书本分页
return new Res(page, true);
}
}
使用DispatcherServlet 来处理请求以及作出响应
建表:
CREATE TABLE `tbl_book` (
`id` int(11),
`type` varchar(20) ,
`name` varchar(50) ,
`description` varchar(255) ,
PRIMARY KEY (`id`)
);
插入数据:
INSERT INTO `tbl_book` VALUES (1, '计算机理论', 'Springboot实战 第1版', 'Springboot入门经典教程,深入理解Spring原理技术内幕');
删除数据:
DELETE FROM `tbl_book` WHERE id = 1;
更新数据:
UPDATE `tbl_book` SET name = 'Spring 5.1核心原理与30个类手写实战' WHERE id = 2;
查询数据:
SELECT * FROM `tbl_book` WHERE id = 2;
•MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。
•MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。
•MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old JavaObjects,普通的Java对象)映射成数据库中的记录.
为什么要使用MyBatis?
•MyBatis是一个半自动化的持久化层框架。
•JDBC
–SQL夹在Java代码块里,耦合度高导致硬编码内伤
–维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
Mybatis 的sql 可以在mapper xml文件中编写, 所以sql 跟java 代码的耦合度较低.
Mybatis 维护比较简单, 因为开发人员可以随时改变mapper xml 中的sql, 而不会影响原有的Java 代码
•对开发人员而言,核心sql还是需要自己优化
•sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。
SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
SpringBoot所具备的特征有:
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器(web服务器);
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。
\1. 减少开发,减少测试时间。
\2. 使用properties, yml或yaml配置文件取代使用XML。
\3. 避免大量的Maven导入和各种版本冲突。
\4. 减少项目创建时的繁琐配置。
\5. 通过提供默认值快速开始开发。
\6. 没有单独的Web服务器需要。这意味着你不再需要启动Tomcat,Glassfish或其他web服务器。
\7. 需要更少的web配置 因为没有web.xml文件。
Starter是启动依赖,它的主要作用有几个。
Starter组件以功能为纬度,来维护对应的jar包的版本依赖,使得开发者可以不需要去关心这些版本冲突这种容易出错的细节。
Starter组件会把对应功能的所有jar包依赖全部导入进来,避免了开发者自己去引入依赖带来的麻烦。
Starter内部集成了自动装配的机制,也就说在程序中依赖对应的starter组件以后,这个组件自动会集成到Spring生态下,并且对于相关Bean的管理,也是基于自动装配机制来完成。
依赖Starter组件后,这个组件对应的功能所需要维护的外部化配置,会自动集成到Spring Boot里面,我们只需要在application.properties / application.yml文件里面进行维护就行了,比如Mybatis-plus这个starter,只需要在application.properties / application.yml 文件里面添加Mybatis-plus的连接信息就可以直接使用了。
@SpringBootApplication 注解 是在SpringBoot 项目的引导类(启动类)使用
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.boot.autoconfigure;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;
...
@SpringBootConfiguration //SpringBoot 配置注解
@EnableAutoConfiguration //允许SpringBoot 自动配置
@ComponentScan( //组件扫描
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
}
正常情况下, 在一个SpringBoot 项目中只会用到以下的三种格式的配置文件
application.properties < 优先度最高
application.yml < 优先度第二高
application.yaml < 优先度最低
此三种配置同时出现, 如果有相同配置, 优先度最高的配置文件会覆盖优先度较低的配置文件
如果没有相同配置, 那各个配置文件就会有互补作用
src < 源码目录
src/main < 主目录
src/main/java < Java 代码目录
src/main/resources < 资源目录
src/main/resources/application.properties < SpringBoot 默认配置文件路径
src/main/resources/static < 静态资源目录
src/main/resources/templates < 视图目录
src/test < 测试目录