- 三层架构
- IOC和DI
- IOC详解
- DI详解
一、三层架构的作用
-
- 操作数据库的代码
- 操作业务逻辑的代码
- 与前端交互的代码
- 三种不同功能的代码如果写在一起会出现:复用性差、耦合度高、可读性差、难以维护、扩展性低、可测试性低的问题 所以要进行分层,每一层对应各自不同的功能
- 在开发中要遵守单一职责原则【尽可能让每个接口、类、方法的职责更单】
-
- 单一职责原则
-
-
- 大到模块,小到方法,应该只包含单一的职责,只负责一件事情
- 单一职责原则是实现高内聚、低耦合的指导方针
-
- 高内聚:一个模块中类与类之间的联系
-
- 补充:指的是一个模块或类应该有一个清晰定义的职责,并且这个职责应该被紧密地封装在该模块或类中。高内聚意味着一个组件或模块的各个部分都是为了完成一个单一的任务或功能而紧密协作的。例如,一个用户管理模块应该只包含与用户相关的操作,如用户注册、登录、更新用户信息等
- 低耦合:模块与模块之间要相互隔离开
-
- 补充:指的是系统中各个组件之间的依赖关系应该尽可能地少。低耦合意味着一个组件的变化不应该对其他组件产生影响,或者影响应该被限制在最小的范围内。这可以通过使用接口、依赖注入、事件驱动架构等方式来实现
1.三层架构的执行流程
- 浏览器请求发送到Controller -->
- Controller调用Serverce层代码处理业务请求--->
- Serverce层调用Dao层进行数据处理--->
- Dao层对数据进行增删改查等操作后响应给Serverce层--->
- Serverce层将数据返回给Controller后再有Controller返回给浏览器
2.三层架构的规范
包名,类名,接口名的写法规范
domain:实体类对象
dao:持久化数据层
service:业务层
Controller:控制层
三层 | 包名 | 类名 |
Controller | controller | XxxController |
Service | Service层包名:service Service层实现类包名:service.impl | 接口:IXxxService 实现类:impl.XxxServiceImpl |
Dao( Data Access Object ) | Dao层包名:dao Dao层实现类包名:dao.impl | 接口:IXxxDao 实现类:impl.XxxDaoImpl |
二、IOC和DI概述
1.IOC控制反转
- IOC:inversion of Control 控制翻转将对象创建权利由Spring进行管理,创建当前类的对象,放在Spring容器中
- 控制:对象创建,属性赋值,对象生命周期管理【Bea的生命周期】- 统称为管理对象
- 反转:把管理对象的权限转移给了容器实现,由容器完成对象的管理
- 正转:使用new构造方法创建对象,开发人员掌握了对象的全部过程
注解:
@RestController:
@Repos
@AutoWired:依赖注入,从容器中去获取该接口实现类的对象给当前属性赋值
@Service:将当前对象交给Spring进行管理
2.IOC注解
注解 | 说明 | 位置 |
@Controller | @Component衍生注解,表示使用在控制器类上 | 标注在控制器类上 |
@Service | @Component衍生注解,表示使用在业务类上 | 标注在业务类上 |
@Repository | @Component衍生注解,表示使用在数据访问类上 | 标注在数据访问类上,使用MyBatis框架后不再使用 |
@Component | 声明bean的基础注解 | 不属于以上三类时,使用此注解 |
3.DI概述
要在IOC将对象创建完成后将Bean对象注入到我们声明的对象中时,需要使用到Spring提供的@Autowired注入注解打到声明对象上就可以实现从容器中自动获取对应实例进行注入
注解 | 说明 | 位置 |
@Autowired | 依赖注入注解 | 标注在需要依赖注入的对象上 |
3.Spring容器
Spring是一个容器框架,其实底层就是一个ConcurrentHashMap
4.Bean名称
Spring管理的对象称之为Bean。在IOC容器中,每一个Bean都有一个属于自己的名字,可以通过注解的value属性指定bean的名字。如果没有指定,默认为类名首字母小写
5.组件扫描
IOC注解和DI注解必须要被启动类扫描才能被识别,才能生效,使用IOC注解和DI注解的类所在包必须是跟启动类所在包平级或者在启动类所在包的子包下才行
如果不遵循以上规范,就会导致注解实现不了,程序运行不起来。当然也可以在启动类加上注解@ComponentScan:手动指定扫描包的路径
@ComponentScan:组件扫描注解,默认扫描启动类同级及以下所有包
6.Bean对象作用域
Bean 的作用域是指Bean在Spring整个框架中的某种行为模式。比如singleton单例作用域,就表示 Bean 在整个 Spring中只有一份,它是全局共享的。当有人修改了这个值之后,那么另一个人读取到的就是被修改后的值
Spring中,Bean的常见作用域有以下 5 种:
作用域 | 说明 |
singleton | 单例作用域,Bean对象默认作用域 |
prototype | 多例作用域,每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例 |
request | 请求作用域,只适用于SpringMVC框架,了解 |
session | 会话作用域,只适用于SpringMVC框架,了解 |
application | 全局作用域,只适用于SpringMVC框架,了解 |
Spring管理的对象默认是单例可以在对象上加上@Scope("prtotype")注解变为多例:每次获取的都不是同一个对象
注:在使用@Scope注解将对象变为多例后会自动变为懒加载并且销毁方法不会自动调用
7.懒加载和迫切加载
对象的创建有两种,一种是懒加载,一种是迫切加载
Spring管理的对象默认是迫切加载:在项目启动时就自动创建对象
懒加载:加上 @Lazy 注解 有一个Value属性 默认为true 使用的时候才会创建对象
8.Spring中的Bean生命周期
Spring中Bean的生命周期大致可以分为四个阶段,分别是:实例化、初始化、使用和销毁阶段
- 实例化:Spring调用对象的构造方法创建Bean对象的过程
- 初始化:在Bean实例化完成之后,就会立即调用Bean的初始化方法,进行一些额外的处理操作,默认初始化方法习惯叫做【init()】
- 使用阶段:处于这个阶段的Bean对象,就可以真正的被使用了
- 销毁阶段:当某个Bean对象不再被使用,此时会首先调用销毁方法,销毁方法,用于释放一些系统资源,然后将Bean对象进行垃圾回收
不是所有的对象都要交给Spring管理,哪些对象会交给Spring管理?
1.三层框架中的对象:Controller,Service,Dao/Mapper对象
2.其他框架的核心对象:Mybatis核心对象....
工具类/实体类/domain,集合等都不用交给Spring进行管理-使用的时候直接new
三、DI详解
DI:Dependency Injection依赖注入,对象创建出来就是为了使用它。使用IOC注解创建出来的对象,其实就是为了给属性赋值
1.注入方式分为三种:
- 属性注入
- setter方法注入
- 构造器注入
2.多个同类型Bean的注入:
注解 | 说明 |
@Primary | 当存在多个相同类型的Bean注入时,在要使用的类上加上@Primary注解,来确定默认的实现 |
@Qualifier | @Qualifier注解:指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称 @Qualifier注解不能单独使用,必须配合@Autowired使用 |
@Resource | @Resource注解:是按照bean的名称进行注入。通过name属性指定要注入的bean的名称 |
3.@Resouce与Autowired的区别
@Resource与@Autowired 两个注解都可以用来进行依赖注入
@Autowired是Spring框架提供的注解,@Resource是JDK提供的注解
- @Autowired是先根据类型(byType)查找,如果存在多个(Bean)再根据名称(byName)进行查找。
- @Resource查找顺序:先根据名称(byName)查找,如果(根据名称)查找不到,再根据类型(byType)进行查找
- 依赖注入支持不同
-
- @Autowired
-
-
- 支持属性注入
- 支持setter注入
- 支持构造器注入
-
-
- @Resource
-
-
- 支持属性注入
- 支持setter注入
-