本文主要是介绍SpringBoot三层架构-IOCDI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
框架技术-SpringBoot进阶
- 三层架构
- Spring框架
- IOC和DI
- 三层架构代码改造
- IOC详解
- DI详解
一、三层架构
概念:程序开发时,应该遵守单一职责原则,意思就是尽可能让每个接口、类、方法的职责更单一
单一职责原则
- 大到模块,小到方法,应该只包含单一的职责,只负责一件事情
- 单一职责原则是实现高内聚、低耦合的指导方针,在很多代码重构手法中都能找到它的存在,它是最简单但又最难运用的原则
反例:我们的所有操作都是在Controller类中进行完成的,现在我们实现的只是简单的增删改查,在真实企业开发中一个业务操作有可能达到几百上千行代码,那么此时如果所有代码都放在Controller中是不合理的
| 复用性差 | 耦合度高 | 可读性差 | 难以维护 | 扩展性低 | 可测试性低
企业级开发中,通常使用分层开发解决上述问题,也就是使用三层架构
以上分为:
- 数据访问:负责业务数据的维护操作,包括增、删、改、查等操作 - Dao层/数据访问层:操作数据
- 逻辑处理:负责业务逻辑处理的代码 - Service层/业务层:实现业务
- 请求处理和响应数据:负责接收页面的请求,给页面响应数据 - 表现层中的Controller:与用户交互
三层架构程序执行流程
- 浏览器发送请求到Controller
- Controller调用Service层代码进行业务处理
- Service层调用Dao层进行数据处理,并响应数据给Controller层
- Dao层对数据进行增删改查等操作,并响应数据给Service层
命名规范
三层 | 包名 | 类名 |
---|---|---|
Controller | controller | XxxController |
Service | Service层包名:service Service层实现类包名:service.impl | 接口:IXxxService 实现类:impl.XxxServiceImpl |
Dao( Data Access Object ) | Dao层包名:dao Dao层实现类包名:dao.impl | 接口:IXxxDao 实现类:impl.XxxDaoImpl |
二、Spring框架
概念:一个开源的容器框架,提供了IOC和AOP两大核心机制。
IOC控制反转主要用于创建对象和对象的依赖关系
AOP面向切面编程主要用于抽取公共业务,解耦代码降低耦合度
- 高内聚低耦合
概念:高内聚和低耦合是软件工程中的核心概念,是判断软件设计好坏的标准,它们分别从不同的角度描述了软件系统的模块或组件之间的关系
高内聚:表示一个模块或组件内部各个元素之间存在着紧密的联系和协作,共同完成特定的、单一的任务。这样的模块或组件拥有较高的功能独立性,便于维护和复用
相当于我不能缺你,缺了你就不能正常运行了
- 解耦思想
概念:降低耦合度
例子:接口和实现类在同一个地方出现就是任然是一个高度耦合代码
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
- IOC( Inversion Of Control)控制反转
概念:对象的创建权利由程序员主动创建转移到容器,由容器创建和管理对象,这种思想称为控制反转。这个容器称为IOC容器或Spring容器
控制:对象创建,属性赋值,对象生命周期管理【Bean的生命周期】 - 统称为管理对象
反转:把管理对象的权限转移给了容器实现,由容器完成对象的管理
正转:使用new构造方法创建对象,开发人员掌握了对象的全部过程注意:被IOC容器创建、管理的对象称为Bean对象
1.1IOC注解
概念:想要在程序启动时将对象交由IOC帮我们创建并放入到容器中,那么我们需要告诉IOC哪些类需要交给它创建并管理,此时就需要在类上打上对应的注解
注解 | 说明 | 位置 |
---|---|---|
@Controller | @Component衍生注解,表示使用在控制器类上 | 标注在控制器类上 |
@Service | @Component衍生注解,表示使用在业务类上 | 标注在业务类上 |
@Repository | @Component衍生注解,表示使用在数据访问类上 | 标注在数据访问类上,使用MyBatis框架后不再使用 |
@Component | 声明bean的基础注解 | 不属于以上三类时,使用此注解 |
- 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提供的注解
- 依赖查找顺序不同
@Autowired是先根据类型(byType)查找,如果存在多个(Bean)再根据名称(byName)进行查找。
@Resource查找顺序:先根据名称(byName)查找,如果(根据名称)查找不到,再根据类型(byType)进行查找
- 依赖注入支持不同
@Autowired
- 支持属性注入
- 支持setter注入
- 支持构造器注入
@Resource
- 支持属性注入
- 支持setter注入
课程总结:
1.Spring、SpringMvc、SpringBoot三个框架的区别a.SpringBoot是一个简化配置,简化启动部署的全新框架。并不是用来替换Spring和SpringMVC的,只是用于简化Spring和SpringMvc的使用b.SpringMvc框架是一个处理请求的mvc框架,底层对Servlet进行了封装c.Spring框架是一个开源的容器框架,提供了IOC和AOP两大核心机制。IOC控制反转主要用于创建对象和对象的依赖关系,AOP面向切面编程主要用于抽取公共业务,解耦代码方便以后维护2.目前在学习SpringBoot中常见的注解a.实例化对象/管理对象的注解:b.注入注解:b1. 指定默认对象注解:b2. 指定Bean名字注解:@Autowired+@Qualifier("orange")、@Resource(name="")c.响应Json数据注解:@ResponseBody、@RestControllerd.匹配请求注解:@RequestMapping、@XxxMapping、@PatchMappinge.声明启动类的注解: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 实现类XxxDaoImplservice包controller包XxxController类
13.domain是什么,有什么用域对象/实体对象, 在三层之间传递数据
14.指定Bean的对象作用域用什么注解,有哪些情况@Scope - 单例singleton,多例prototype
15.什么是懒加载/延迟加载和迫切加载,如何配置Bean的懒加载@Lazy
16.Spring中的Bean默认情况单例,迫切加载
17.注入有哪些方式属性注入,setter方法注入,有参构造
18.@Autowired与@Resource区别扩展:什么是MVC?
MVC=Model+View+Controller=模型+视图+控制器,mvc是程序或软件设计的一种思想。就是设计或开发一个软件必须有三个部分
a.必须有View视图,用于能接触能看到的就是视图【页面或客户端】
b.视图中的功能必须要实现,就需要Model模型-实现视图的上的功能
c.模型和视图是不能直接交互的,所以需要一个桥梁,这个就是Controller。Controller控制器可以接收前端请求响应数据给前端,
同时它也是一个后端代码当前可以调用Model模型中的数据
@Lazy
16.Spring中的Bean默认情况
单例,迫切加载
17.注入有哪些方式
属性注入,setter方法注入,有参构造
18.@Autowired与@Resource区别
扩展:什么是MVC?
MVC=Model+View+Controller=模型+视图+控制器,mvc是程序或软件设计的一种思想。就是设计或开发一个软件必须有三个部分
a.必须有View视图,用于能接触能看到的就是视图【页面或客户端】
b.视图中的功能必须要实现,就需要Model模型-实现视图的上的功能
c.模型和视图是不能直接交互的,所以需要一个桥梁,这个就是Controller。Controller控制器可以接收前端请求响应数据给前端,
同时它也是一个后端代码当前可以调用Model模型中的数据
这篇关于SpringBoot三层架构-IOCDI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!