Spring 核⼼
Spring 是包含了众多⼯具⽅法的 IoC 容器。
什么是容器
我们之前 接触的容器有哪些?
- List/Map-> 数据存储容器
- Tomcat->Web容器
什么是Ioc
IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容
器
Ioc优点
实现代码的解耦;
对象(Bean)生命周期交给Ioc框架来维护,程序员无需关注。
Spring Ioc容器最核心的功能
- 将Bean(对象)存储到Spring容器中
- 将Bean(对象)从Spring容器中取出来
DI
DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。
Ioc和DI有什么区别?
- Ioc是一种思想
- DI是一种实现
等同于 乐观锁【思想】 CAS【实现手段】
Spring创建与使用
1.创建Spring项目
- Maven项目
- 添加spring框架支持
- 创建一个启动类并添加 main
2.将对象存储到Spring中
- 如果是第一次添加,先在spring项目中添加配置文件,非第一次此步骤省略
- 先创建一个bean对象
- 在配置文件中将需要保持到Spring中的bean对象进行注册
3.从Spring中取出对象【读取】
- 先得到Spring上下文对象
保持一致
- 再通过上下文对象提供的方法获取咱们自己需要使用的bean对象
- 使用bean对象
ApplicationContext VS BeanFactory
经典面试:ApplicationContext 和 BeanFactory 有什么区别?
- 相同点:都可以实现从容器中获取bean,都提供了getBean的方法。
- 不同点:
- ApplicationContext 属于 BeanFactory 的子类。BeanFactory 只提供了基础访问Bean的方法,而ApplicationContext 除了拥有BeanFactory 的所有功能之外,还提供了更多的方法实现,比如对国际化的支持、资源访问的支持、以及事件和传播等方面的支持。
- 从性能方面来说二者是不一样的,BeanFactory 是按需加载Bean,ApplicationContext 是饿汉式,在创建时会将所有的Bean都加载起来,以备以后使用。
获取Bean的方法
-
使用bean name 获取 bean
-
根据 bean type 获取 bean
写法简单,但是容易出问题。当同一个类型被注入到spring中多次的时候,就会报错。
3. 根据 bean name 和类型获取 bean
健壮性好,推荐使用!
Spring更简单的读取和存储对象
【注解】
1.存储bean对象
-
使用 5 大类注解实现
@Controller【控制器】(控制层-前端参数校验)
@Service【服务】(服务层-数据的组装和接口调用)
@Repoistory【仓库】(数据持久层-负责和数据库进行交互)
@Configuration【配置】(配置层)
@Component【组件】
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T01nrDP5-1674091664416)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669643041612.png)](https://img-blog.csdnimg.cn/506fed1bc9914b1e88ff296935acf693.png)
-
·提供@Bean方法实现
‘
2.读取bean对象(对象装配)
-
属性注入
-
构造方法注入【推荐】
-
Setter注入
注⼊的关键字有:
@Autowired
@Resource
- @Autowired 和 @Resource 区别:
- 出身不同;
- 使⽤时设置参数不同 @Resource ⽀持更多的参数,⽐如 name。
- 解决同⼀类型多个 Bean 的报错:
a. 使⽤ @Resource(name=“”)
b. 使⽤ @Qualifier(“”)
三种注⼊优缺点分析
- 属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)。
- 构造⽅法注⼊是 Spring 推荐的注⼊⽅式,它的缺点是如果有多个注⼊会显得⽐较臃肿,但出现这种情况你应该考虑⼀下当前类是否符合程序的单⼀职责的设计模式了,它的优点是通⽤性,在使⽤之前⼀定能把保证注⼊的类不为空。
- Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了 。
Bean的6种作用域
Bean的作用域:bean在spring整个框架中的某种行为(单例模式)。
- singleton:单例作⽤域(默认)
- prototype:原型作⽤域(多例模式) -每次对该作⽤域下的Bean的请求都会创建新的实例
- request:请求作⽤域(Spring MVC)-每次http请求会创建新的Bean实例
- session:会话作⽤域(Spring MVC)-在⼀个http session中,定义⼀个Bean实例
- application:全局作⽤域(Spring MVC)-在⼀个http servlet Context中,定义⼀个Bean实例
- websocket:HTTP WebSocket 作⽤域 (Spring WebSocket)
单例作用域(singleton) VS 全局作用域(application)
- singleton是Spring Core 的作用域;application是Spring Web中的作用域
- singleton作用与Ioc容器,而application作用于Servlet容器
设置Bean的作用域
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-McfSKNRH-1674091664417)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669692991606.png)]
Bean的生命周期
- 实例化Bean(给Bean分配内存空间)
- 设置属性(对象注入)
- Bean初始化
- 执行各种通知(执行各种Aware)
- 执行初始化的前置方法
- 执行构造方法,两种执行方式,一种是执行 @PostConstruct,另一种是执行 init-method
- 使用Bean
- 销毁Bean
- @PreDestroy
- 重写DisposableBean 接⼝⽅法
- destroy-method
为什么要先设置属性在进⾏初始化呢 ?
- 在初始化前如果没有设置属性的话,那么就可能会造成空指针。