一、三层架构
作用:提高代码复用率,降低耦合度
三层架构分层:
- Controller层:控制层,负责接收前端发送的请求,对请求进行处理并响应数据
- Service层:业务层,负责处理具体的业务逻辑
- Dao层:数据访问层,也称为持久层,负责数据的增删改查等操作
三层架构程序执行流程
- 浏览器发送请求到Controller层
- Controller层调用Service层进行业务处理,并响应数据给浏览器
- Service层调用Dao层进行数据处理,并响应数据给Controller层
- Dao层对数据进行增删改查等操作,并响应数据给Service层
项目结构:
二、IOC和DI
1、概念:IOC也被称为控制反转,对象不需要主动创建,由容器创建、管理对象,这个容器称为IOC容器或Spring容器,同时IOC容器管理的对象就是Bean对象
IOC容器注解:
注解 | 说明 | 位置 |
@Component衍生注解,表示使用在控制器类上 | 标注在控制器类上 | |
@Component衍生注解,表示使用在业务类上 | 标注在业务类上 | |
@Component衍生注解,表示使用在数据访问类上 | 标注在数据访问类上,使用MyBatis框架后不再使用 | |
声明bean的基础注解 | 不属于以上三类时,使用此注解 |
2、DI就是依赖注入,就是标记IOC容器管理的对象要注入到哪里
DI依赖注入注解:@Autowired
3、DOC详解:
DOC的底层是Spring中使用了ConcurrentHashmap,会把使用了IOC容器注解的类通过无参构造方法new出对象,Key就是类名首字母小写,Value是对象的地址
Bean对象的名称默认是类名首字母小写,也可以通过四大注解的value属性进行修改
在主启动类中@SpringBootApplication:启动类注解,也是SpringBoot框架的核心注解
@SpringBootApplication也是一个复合注解,包含了了@ComponentScan组件扫描注解,默认扫描启动类同级及以下所有包,如果需要扫描启动类上级或外面的包需要手动设置@ComponentScan注解的basePackages属性的值,位置是加在启动类上(不推荐修改)
4、Bean对象的作用域:
Bean对象的默认作用域是单例的,从Bean容器获取的对象一直是一个
要设置为多例,可以在加了四大注解的类上加上@Scope(value = "prototype", proxyMode = ScopedProxyMode.INTERFACES)
5、Bean对象懒加载
Bean对象开启懒加载:@Lazy,默认是true
- @Lazy注解可以作用在类上,或者方法上,表示Bean对象开启懒加载
- 注意:使用@Lazy的前提是要操作的Bean要使用默认的单例模式,多例Bean无法开启懒加载,因为多例Bean本身就是使用时才创建
6、Bean生命周期五个阶段
实例化、依赖注入、初始化、使用、销毁
7、DI依赖注入的三种方式:
- 属性注入:直接在类中声明的对象上使用@Autowired进行依赖注入
- setter注入:在属性/字段对应的set方法上方添加@Autowired注解
注意:setter方式注入的对象不能为多例或者懒加载,否则会找不到Bean对象,除非双方都是多例或者懒加载
- 构造器注入:通过有参构造方法进行依赖注入
8、多同类型Bean注入
解决方式:
① @Primary:当存在多个相同类型的Bean注入时,在要使用的类上加上@Primary注解,来确定默认的实现
② @Qualifier注解:指定当前要注入的bean对象。在@Qualifier的value属性中,指定注入的bean的名称,@Qualifier注解不能单独使用,必须配合@Autowired使用
③ @Resource注解:bean的名称进行注入。通过name属性指定要注入的bean的名称
9、@Resource和@Autowired的区别
-
- 来源不同:
-
-
-
- @Autowired:是Spring框架提供的注解
- @Resource:是JDK提供的注解
-
-
-
- 依赖查询的顺序不同:
-
-
-
- @Autowired查找顺序:先根据类型(byType)查找,如果存在多个(Bean)再根据名称(byName)进行查找
- @Resource查找顺序:先根据名称(byName)查找,如果(根据名称)查找不到,再根据类型(byType)进行查找
-
-
-
- 支持注入方式不同:
-
-
-
- @Autowired支持属性注入、setter注入、构造器注入
- @Resource支持属性注入、setter注入
-
-