SpringBoot三层架构-IOC&DI

框架技术-SpringBoot进阶

  • 三层架构
  • Spring框架
  • IOC和DI
  • 三层架构代码改造
  • IOC详解
  • DI详解

一、三层架构

概念:程序开发时,应该遵守单一职责原则,意思就是尽可能让每个接口、类、方法的职责更单一

单一职责原则

  • 大到模块,小到方法,应该只包含单一的职责,只负责一件事情
  • 单一职责原则是实现高内聚、低耦合的指导方针,在很多代码重构手法中都能找到它的存在,它是最简单但又最难运用的原则

反例:我们的所有操作都是在Controller类中进行完成的,现在我们实现的只是简单的增删改查,在真实企业开发中一个业务操作有可能达到几百上千行代码,那么此时如果所有代码都放在Controller中是不合理的

| 复用性差 | 耦合度高 | 可读性差 | 难以维护 | 扩展性低 | 可测试性低

企业级开发中,通常使用分层开发解决上述问题,也就是使用三层架构

以上分为:

  • 数据访问:负责业务数据的维护操作,包括增、删、改、查等操作 - Dao层/数据访问层:操作数据
  • 逻辑处理:负责业务逻辑处理的代码 - Service层/业务层:实现业务
  • 请求处理和响应数据:负责接收页面的请求,给页面响应数据 - 表现层中的Controller:与用户交互

三层架构程序执行流程

  • 浏览器发送请求到Controller
  • Controller调用Service层代码进行业务处理
  • Service层调用Dao层进行数据处理,并响应数据给Controller层
  • Dao层对数据进行增删改查等操作,并响应数据给Service层

命名规范

三层包名类名
ControllercontrollerXxxController
ServiceService层包名:service Service层实现类包名:service.impl接口:IXxxService 实现类:impl.XxxServiceImpl
Dao( Data Access ObjectDao层包名:dao Dao层实现类包名:dao.impl接口:IXxxDao 实现类:impl.XxxDaoImpl

二、Spring框架

概念:一个开源的容器框架,提供了IOC和AOP两大核心机制。

  • IOC控制反转主要用于创建对象和对象的依赖关系

  • AOP面向切面编程主要用于抽取公共业务,解耦代码降低耦合度

  1. 高内聚低耦合

概念:高内聚和低耦合是软件工程中的核心概念,是判断软件设计好坏的标准,它们分别从不同的角度描述了软件系统的模块或组件之间的关系

高内聚:表示一个模块或组件内部各个元素之间存在着紧密的联系和协作,共同完成特定的、单一的任务。这样的模块或组件拥有较高的功能独立性,便于维护和复用

相当于我不能缺你,缺了你就不能正常运行了

  1. 解耦思想

概念:降低耦合度

例子:接口和实现类在同一个地方出现就是任然是一个高度耦合代码

StudentService service = new StudentServiceImpl();
IStudentDao dao = new StudentDaoImpl();
//一个接口可以有多个实现类,假如实现类换了一种实现,那么这个代码就必须要改
IStudentDao dao = new StudentXxxImpl();
IStudentDao dao = new StudentYyyImpl();
//注意:接口是不会变化的,就是实现变了,操作数据库有很多技术实现:原生的JDBC,框架SpringJdbc,JPA,Mybatis

解决方案:不用new创建对象,使用Spring的IOC和依赖注入DI

注意:ConcurrentHashMap支持高效的并发访问,可以有效地提高系统的性能,ConcurrentHashMap 是一种线程安全的 HashMap,避免了高并发访问下线程安全问题,建议使用

三、IOC和DI

  1. IOC( Inversion Of Control)控制反转

概念:对象的创建权利由程序员主动创建转移到容器,由容器创建和管理对象,这种思想称为控制反转。这个容器称为IOC容器或Spring容器

控制:对象创建,属性赋值,对象生命周期管理【Bean的生命周期】 - 统称为管理对象
反转:把管理对象的权限转移给了容器实现,由容器完成对象的管理
正转:使用new构造方法创建对象,开发人员掌握了对象的全部过程
    
注意:被IOC容器创建、管理的对象称为Bean对象

1.1IOC注解

概念:想要在程序启动时将对象交由IOC帮我们创建并放入到容器中,那么我们需要告诉IOC哪些类需要交给它创建并管理,此时就需要在类上打上对应的注解

注解说明位置
@Controller@Component衍生注解,表示使用在控制器类上标注在控制器类上
@Service@Component衍生注解,表示使用在业务类上标注在业务类上
@Repository@Component衍生注解,表示使用在数据访问类上标注在数据访问类上,使用MyBatis框架后不再使用
@Component声明bean的基础注解不属于以上三类时,使用此注解
  1. DI(Dependency Injection)依赖注入

概念:对象创建出来就是为了使用它,使用IOC注解创建出来的对象,其实就是为了给属性赋值

//使用IOC注解创建出来Dao层对象,是为了在Service业务层中调用Dao层对象方法时给成员变量Dao赋值
private IStudentDao studentDao;
//使用IOC注解创建出来的Service层对象,是为了在Controller控制器中调用Service层对象方法给成员变量Sservice赋值
private IStudentService studentService;

2.1DI注解
概念:想要在IOC将对象创建完成后将Bean对象注入到我们声明的对象中时,需要使用到Spring提供的@Autowired注入注解打到声明对象上就可以实现从容器中自动获取对应实例进行注入

注解说明位置
@Autowired依赖注入注解标注在需要依赖注入的对象上

四、三层架构代码改造(使用IOC和DI直接改造三层架构代码)

4.1. 改造控制器Controller

这里直接使用@Autowired注入就行了

4.2. 改造业务代码Service

注意是直接创建的接口的对象,运用了多态的特性,不是接口的实现类,这样就可以降低代码的耦合度

4.3. 改造数据访问代码Dao

使用注解@Repository

五、IOC详解

5.1 概念:IOC控制反转其实就是将对象交给Spring管理。管理对象的创建、属性赋值DI、对象的作用域、对象的懒加载和生命周期

5.2 Spring容器

Spring是一个容器框架,其实底层就是一个ConcurrentHashMap,那么Map的结构是一个Key-Value

  • Value就是对象实例
  • Key就是Bean的Name名称

5.3 Bean名称

概念:Spring管理的对象称之为Bean。在IOC容器中,每一个Bean都有一个属于自己的名字,可以通过注解的value属性指定bean的名字。如果没有指定,默认为类名首字母小写

例:通过注解value属性指定名称,但建议用默认名字

@Service(value ="studentServiceImpl")  // 当前类交由IOC管理

5.4 组件扫描

概念:IOC注解和DI注解的类所在包必须是跟启动类所在包平级或者在启动类所在包的子包下才行

不在平级或者子包的解决方案:

在启动类加上注解@ComponentScan手动指定扫描包的路径

@ComponentScan(basePackages = {"service""cn.itsource") // 手动指定包路径

5.5 Bean对象作用域

概念:Bean 的作用域是指Bean在Spring整个框架中的某种行为模式

例:singleton单例作用域,就表示 Bean 在整个 Spring中只有一份,它是全局共享的。当有人修改了这个值之后,那么另一个人读取到的就是被修改后的值

Bean的常见作用域有以下 5 种:

作用域说明
singleton单例作用域,Bean对象默认作用域
prototype多例作用域,每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例
request请求作用域,只适用于SpringMVC框架,了解
session会话作用域,只适用于SpringMVC框架,了解
application全局作用域,只适用于SpringMVC框架,了解

5.6 改变Bean的作用域

@Scope注解可以作用在交给Spring管理的类上,使用value属性设置作用域。value属性:指定作用域

ConfigurableBeanFactory.SCOPE_PROTOTYPE:即"prototype" 
ConfigurableBeanFactory.SCOPE_SINGLETON:即"singleton",默认值
WebApplicationContext.SCOPE_REQUEST:即"request"
WebApplicationContext.SCOPE_SESSION:即"session"
WebApplicationContext.SCOPE_APPLICATION:即"application"

5.7 Bean对象懒加载

概念:IOC容器中的Bean默认是在Spring启动时就进行加载并放入到容器中,有的时候我们并不需要对象在Spring启动时就进行加载,所以可以设置Bean对象为懒加载

分类:

  • 迫切加载:Spring启动时就执行Bean对象初始化,默认方式
  • 懒加载:在首次调用Bean对象时才进行Bean对象初始化

使用方法:@Lazy注解

@Lazy注解可以作用在类上或者方法上,表示Bean对象开启懒加载

value属性:指定是否开启懒加载

​ -true:开启懒加载,默认值

​ -false:关闭懒加载

注意:使用@Lazy的前提是要操作的Bean要使用默认的单例模式,多例Bean无法开启懒加载,因为多例Bean本身就是使用时才创建

5.8 Bean的生命周期

概念:生命周期指的是Spring框架中一个Bean对象从实例化到被垃圾回收器回收的这么一个过程,我们通常把这个过程称作,Bean的生命周期 (一个Bean对象从创建到销毁的这么一个过程)

分类阶段:

  • 实例化:Spring调用对象的构造方法创建Bean对象的过程
  • 初始化:在Bean实例化完成之后,就会立即调用Bean的初始化方法,进行一些额外的处理操作,默认初始化方法习惯叫做【init()】
  • 使用阶段:处于这个阶段的Bean对象,就可以真正的被使用了
  • 销毁阶段:当某个Bean对象不再被使用,此时会首先调用销毁方法,默认销毁方法叫做【destory()】,用于释放一些系统资源,然后将Bean对象进行垃圾回收

六、DI详解

6.1 概念:对象创建出来就是为了使用它。使用IOC注解创建出来的对象,其实就是为了给属性赋值

@Autowired注解翻译过来叫做自动装配,默认是按照类型去IOC容器中查找Bean对象进行自动装配。

6.2 三层架构代码中使用@Autowired进行Bean对象的注入,有几种方式称为:

  • 属性注入

  • setter方法注入

  • 构造器注入

6.3 多个同类型Bean注入

注意:多个同类型Bean注入,会报错

解决方案:

@Primary 当存在多个相同类型的Bean注入时,在要使用的类上加上@Primary注解,来确定默认的实现

@Qualifier 在@Qualifier的value属性中,指定注入的bean的名称(@Qualifier注解不能单独使用,必须配合@Autowired使用)

@Resource 通过name属性指定要注入的bean的名称

  @Resource与@Autowired区别:

@Autowired是Spring框架提供的注解

@Resource是JDK提供的注解

  1. 依赖查找顺序不同

@Autowired是先根据类型(byType)查找,如果存在多个(Bean)再根据名称(byName)进行查找。

@Resource查找顺序:先根据名称(byName)查找,如果(根据名称)查找不到,再根据类型(byType)进行查找

  1. 依赖注入支持不同

@Autowired

  • 支持属性注入
  • 支持setter注入
  • 支持构造器注入

@Resource

  • 支持属性注入
  • 支持setter注入

课程总结:

1.Spring、SpringMvcSpringBoot三个框架的区别
	a.SpringBoot是一个简化配置,简化启动部署的全新框架。并不是用来替换SpringSpringMVC的,只是用于简化SpringSpringMvc的使用
	b.SpringMvc框架是一个处理请求的mvc框架,底层对Servlet进行了封装
	c.Spring框架是一个开源的容器框架,提供了IOCAOP两大核心机制。IOC控制反转主要用于创建对象和对象的依赖关系,AOP面向切面编程主要用于抽取公共业务,解耦代码方便以后维护

2.目前在学习SpringBoot中常见的注解
	a.实例化对象/管理对象的注解:
	b.注入注解:
		b1. 指定默认对象注解:
		b2. 指定Bean名字注解:@Autowired+@Qualifier("orange")@Resource(name="")
	c.响应Json数据注解:@ResponseBody@RestController
	d.匹配请求注解:@RequestMapping@XxxMapping@PatchMapping
	e.声明启动类的注解:
	f.声明SpringBoot测试类的注解:SpringBootTest(classes=启动类.class)

3.何为起步依赖,作用是什么

4.简述SpringBoot的配置文件

5.SpringBoot中多环境配置如何实现

6.SpringBoot单元测试使用步骤
7.Apifox是什么,有什么用
8.常用的数据交换格式有哪些?xml和json区别

9.Controller(SpringMvc)接收参数有哪些方式

10.什么是ResultFul风格?有哪些请求方式分别描述哪些操作
11.什么是三层架构,为什么要使用三层架构
	数据访问层Dao
	业务逻辑层Service
	表现层 - 控制器Controller
	表现层 - 视图【客户端或页面】
12.三层架构规范
	dao包
		接口:IXxxDao
		子包:impl 实现类XxxDaoImpl
	service包

	controller包
		XxxController13.domain是什么,有什么用
	域对象/实体对象, 在三层之间传递数据
14.指定Bean的对象作用域用什么注解,有哪些情况
	@Scope - 单例singleton,多例prototype
15.什么是懒加载/延迟加载和迫切加载,如何配置Bean的懒加载
	@Lazy
16.Spring中的Bean默认情况
	单例,迫切加载
17.注入有哪些方式
	属性注入,setter方法注入,有参构造
18.@Autowired@Resource区别

扩展:什么是MVCMVC=Model+View+Controller=模型+视图+控制器,mvc是程序或软件设计的一种思想。就是设计或开发一个软件必须有三个部分
a.必须有View视图,用于能接触能看到的就是视图【页面或客户端】
b.视图中的功能必须要实现,就需要Model模型-实现视图的上的功能
c.模型和视图是不能直接交互的,所以需要一个桥梁,这个就是ControllerController控制器可以接收前端请求响应数据给前端,
同时它也是一个后端代码当前可以调用Model模型中的数据
@Lazy

16.Spring中的Bean默认情况
单例,迫切加载
17.注入有哪些方式
属性注入,setter方法注入,有参构造
18.@Autowired与@Resource区别

扩展:什么是MVC?
MVC=Model+View+Controller=模型+视图+控制器,mvc是程序或软件设计的一种思想。就是设计或开发一个软件必须有三个部分
a.必须有View视图,用于能接触能看到的就是视图【页面或客户端】
b.视图中的功能必须要实现,就需要Model模型-实现视图的上的功能
c.模型和视图是不能直接交互的,所以需要一个桥梁,这个就是Controller。Controller控制器可以接收前端请求响应数据给前端,
同时它也是一个后端代码当前可以调用Model模型中的数据

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Boot 是一个基于 Java 的开源框架,它简化了 JavaEE 的开发流程,提供了快速开发应用程序的能力。在 Spring Boot 中,常用的三层架构是指将应用程序分为表现层(Presentation Layer)、服务层(Service Layer)和持久层(Persistence Layer)。 表现层是应用程序的前端部分,负责和用户进行交互。在 Spring Boot 中,可以使用 Thymeleaf 或者 JSON 进行页面的渲染和数据的传递,通过控制器(Controller)来处理用户的请求和展示相应的视图。 服务层是应用程序的中间部分,负责实现业务逻辑。在 Spring Boot 中,可以通过创建服务(Service)类来定义具体的业务逻辑,例如数据处理、算法运算、数据校验等,服务层可以调用持久层提供的数据访问接口来操作数据库。 持久层是应用程序的后端部分,负责与数据库进行交互。在 Spring Boot 中,可以使用 Spring Data JPA 简化持久层的开发,通过定义实体类和仓库接口(Repository)来进行数据库的操作,从而实现对数据的增删改查。 通过将应用程序拆分为表现层、服务层和持久层,可以使代码更加清晰、可维护性更高。表现层负责与用户交互,服务层负责处理业务逻辑,持久层负责与数据库交互,使得代码的职责划分更加明确,模块之间耦合度更低。这种三层架构的设计模式可以使开发人员更加专注于各自的工作领域,提高代码的重用性和可扩展性。 总之,Spring Boot 提供了快速、高效的开发框架,可以使用三层架构来实现应用程序的设计和开发,让开发人员更加专注于业务逻辑的实现,提高开发效率和应用程序的质量。 ### 回答2: Spring Boot是一个快速开发框架,使用约定大于配置的原则简化了开发过程。它可以帮助我们快速搭建一个基于Java的Web应用程序。 三层架构是一种常见的软件架构模式,包括表示层(Presentation Layer)、业务逻辑层(Business Layer)和数据访问层(Data Access Layer)。这种架构模式将应用程序分割成不同的层次,以提高代码的可维护性和可复用性。 在使用Spring Boot开发一个三层架构的应用程序的过程中,我们可以按照以下步骤进行实现: 首先,我们需要在Maven或Gradle中添加Spring Boot的依赖。然后,我们可以创建一个表示层的Controller类,该类负责处理来自用户的请求和发送响应。在Controller类中,我们可以定义各种请求处理方法,并通过注解将其映射到相应的URL。 接下来,我们可以创建一个业务逻辑层的Service类,该类负责处理业务逻辑。在Service类中,我们可以定义各种方法来处理业务逻辑,并调用数据访问层的方法来访问数据库或其他数据源。在业务逻辑层中,我们可以使用Spring的依赖注入功能来注入数据访问层的实现。 最后,我们可以创建一个数据访问层的Repository类,该类负责与数据库或其他数据源进行交互。在Repository类中,我们可以定义各种方法来查询、插入、更新或删除数据。在Spring Boot中,我们可以使用Spring Data JPA或其他ORM框架来简化数据访问层的编码工作。 通过按照上述步骤实现,我们可以将一个基于Spring Boot的三层应用程序开发完成。在实际开发中,我们可以根据具体的需求来扩展和优化这个应用程序,例如添加用户认证和授权功能、实现缓存和消息队列等。总的来说,使用Spring Boot来开发三层架构的应用程序可以让我们更快速和高效地进行开发,并且易于维护和扩展。 ### 回答3: SpringBoot是一个用于构建Java应用程序的开源框架,它具有快速和简化的特点。而三层架构是一种将应用程序分为显示层、业务层和数据访问层的设计模式。 在使用SpringBoot搭建的应用程序中,我们可以将其按照三层架构进行划分。 首先,显示层是指用户与应用程序进行交互的部分,通常是指前端界面。在SpringBoot应用中,我们可以使用Thymeleaf、JSP等技术来实现显示层。 其次,业务逻辑层是应用程序中的核心部分,它负责处理用户请求并进行相应的业务处理。在SpringBoot应用中,我们可以使用@Service注解来标识业务逻辑层的类,通过调用其他层的方法来完成具体的业务逻辑。 最后,数据访问层是应用程序与数据库进行交互的部分,负责对数据的读取和写入。在SpringBoot应用中,我们可以使用@Repository注解来标识数据访问层的类,通过使用Spring Data JPA等技术来实现对数据库的操作。 在实际应用中,我们可以通过在业务逻辑层中调用数据访问层的方法来实现数据的读取和写入,并通过显示层来展示数据。整个过程中,SpringBoot框架可以对各个层进行自动装配和配置,大大简化了应用程序的开发和部署过程。 综上所述,SpringBoot三层架构可以很好地结合在一起,通过合理地划分不同的层次来实现应用程序的快速开发和简化部署。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zyangxsir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值