文章目录
黑马Java课程记录
Spring 是什么
一个技术集,经过多个版本迭代,又称spring全家桶。具体可以在官网查看所有技术集,这里主要学习spring framework(简称spring)、spring boot、spring cloud。
spring framework
需要注意的是,这里还说的是spring (framework),而不是spring boot,而且是基于xml文件,不是注解,我没有成体系的学过spring,当时是直接上手的spring boot,所以不清楚具体的一些区别,边写博客的过程中,我会把看到的一些 区别 写在这。
- spring boot是封装优化易上手的spring,它的依赖是类似sprint-boot-……-starter这种形式,而spring的依赖不是starter。
架构
学习路线
IOC和DI
基础知识
依赖: A使用了B,A靠着B才能运行,称为A依赖于B。
耦合:形容对象之间的绑定程度。比如A依赖于B,此时B改变,A中的代码使用了B的部分也需要跟着全部改写,这样就说AB之间耦合度高。
解耦: 降低耦合度的过程
IOC: Inversion Of Control
控制反转。将使用对象的控制权转给外部容器( Spring 提供的 IOC 容器)进行管理,实现方式是 DI 。
DI:Dependency Injection
依赖注入。在容器里建立对象之间的依赖关系的过程。简单理解就是替换了属性赋值,不用private B b = new B();
只需要private B b
,容器会记录下来,到时候直接去找B。
对象:java把所有东西都看成一个对象,除了方便学习上手保留的八种基本类型,其他都可以是一个对象,对象包括属性和方法。比如一个人,可以用一个 Person 类来表征,人的年龄、姓名、性别……就是定义在 Person 类中的属性。
为什么用
说白了,耦合度过高是一个问题。
前置知识里举例AB,但依赖其实是往往多对多的,A依赖B、C、D……,B又依赖于F、G……。这样导致的问题是,某个被依赖项改变了,比如类名改变,那么所有依赖它的对象全部都要改变,十分费时费力。也不便于灵活的去拓展。
所以,IOC和DI创造出来就是为了解决这样的问题。既然代码里直接嵌入内容会导致耦合度过高,那么就创建一个第三方出来用来专门管理对象之间的关系。
IOC - Bean
Bean:IOC容器创建和管理的对象(任意类型)
bean 的三种构造方式
- 构造方法(常用)
- 工厂静态方法
- 工厂实例方法
bean 的作用范围: scope
属性
默认是单例,简要理解就是复用对象,适合比如原来的new场景
多例,每次都创建新对象,适合比如orm(对象映射管理,如mybatis)的实体类
bean 的生命周期
注意上图中bean的作用范围如果是多例,销毁不执行。
从这张图中就可以看出来,DI的实现方式和IOC容器如何操作bean,首先bean(一般是类对象)需要注册到IOC容器中,然后ioc可以通过getBean方法获得bean,创建一个对象,执行构造方法(不写时java默认有无参构造,如果自己定义了有参构造那么也要定义无参构造)就是类似new操作,注册到ioc的bean有属性和对应的set方法,这就是setter注入,初始化就是赋值也就是ioc把new出来的对象用setter注入到依赖中。
DI
依赖注入的方式
- setter注入(常用)
- 构造方法注入
- 第三方注入(如mybatis肯定也有它的方式)
xml引用类型属性注入
如图,<property>
定义属性,name
为属性名,ref
调用setter
如果是简单类型(8种基本类型加string),不用ref
而是用value
,如value = “10”
构造方法注入也类似,也有引用类型和简单类型的注入,只是使用的标签不是<property>
而是constructor-arg
自动装配 autowire
小结
讲了ioc和di,ioc 和 bean,xml配置bean
补充下自定义xml bean和ioc容器读取