@TOC
1.Spring是什么?
Spring是一个生态,可以构建java应用所需要的一切基础设施。通常spring指的是spring frameWork. 一般的生态来说:
-
1.Spring FrameWork
-
2.SpringBoot 增加了自动配置 总结一下,其实就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 Spring Boot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可
-
3.SpringMVC
-
4.SpringCloud 分布式的springboot,适用于分布式
而spring 是一个轻量级开源框架: IOC:控制翻转 AOP:面向切面编程
2 .IOC控制反转
本意: 对象的创建由我们自己new转到了spring ioc容器中,由spring ioc容器统一管理、 这样的好处: 降低对象间的耦合度 底层分析: xml配置文件、反射、简单工厂模式 我们通过读取xml配置文件(bean id+class),通过读取类的全路径,来进行反射创建对象,然后这个过程是由spring ioc完成的,我们只需要调用它提供的方法即可获得对象,这是简单工厂模式。
3.IOC的两种实现
1)BeanFactory接口 这个接口是基本实现,一般不提供开发人员使用,并且加载配置文件的时候是懒加载,不会创建对象。 2)ApplicationContext接口(其中实现的是BeanFactory接口) 这个接口是提供给开发人员使用的,有相对多的功能,加载配置文件的就会创建对象,所以相对式慢启动、快响应。
4.Bean的管理
1)创建对象 2)为对象设置属性 一般分为基于xml的配置文件和基于注解方式的实现: xml文件: 创建对象:在xml文件配置bean 注入属性(DI):构造注入/设置注入(set),可以注入简单属性的值,也可以注入其他类的对象,包括注入外部bean、注入内部bean、
基于注解: 创建对象:在xml文件配置component-scan,然后再要创建对象的类上加入注解:@component、@service、@Reposity、@Controller 注入属性(DI):在属性上加入注解:@Autowire、@Vlaue、@Qualifier、@Resource
5:DI和IOC
可以看到IOC式控制翻转,主要是创建对象的思想,而真正的实现是由反射+简单工厂,然后通过DI技术实现对象的属性赋值
6.scope
一般是单例、可以设置多例、还有不常用session、request,一次请求创建一个bean,一个会话创建一个bean
7.spring的单例安全
单例:一般如果涉及到无状态的bean(没有属性),那么肯定用单例,并且安全 但是如果有状态的bean,单例则不安全了,我们一般用多例模式;当然还可以在单例模式下设置属性ThreadLocal来保证每个线程有自己的属性。
8.spring bean的常见生命周期
简单来说:
创建对象---->注入属性---->后置处理器的Before方法------>初始化方法-------->后置处理器的After方法------>获得对象
销毁对象------>调用destory方法(写了才有用)
为了更好理解,可以重构成实例化、属性注入、初始化、销毁四个主要部分,其余部分相当于使用AOP技术,如果实现了相关接口,才会有这些过程。
- 1.BeanFactoryPostProcessor的bean定义
- BeanFactoryPostProcessor接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它。 说通俗一些就是可以管理我们的bean工厂内所有的beandefinition(未实例化)数据,可以随心所欲的修改属性
- 2.InstantiationAwareBeanPostProcessor的bean定义
- postProcessBeforeInstantiation方法
- 3.实例化
- 4.InstantiationAwareBeanPostProcessor的bean定义
- postProcessAfterInstantiation方法
- 5.注入属性
- 6.Aware接口 【BeanNameAware接口】调用BeanNameAware.setBeanName() 【BeanFactoryAware】调用BeanFactoryAware.setBeanFactory() 【ApplicationContextAware】调用ApplicationContextAware.setApplicationContext()
- 7.BeanPostProcessor的bean定义
- postProcessBeforeInitialization方法
- 8.InitializingBean的接口
- InitializingBean.afterPropertiesSet()方法
- 9.初始化init
- 10.BeanPostProcessor的bean定义
- postProcessAfterInitialization方法
- 11.DisposableBean接口
- destroy()方法
- 12.自定义init_destory()方法
9.Spring 怎么解决循环依赖问题?
- 三级缓存
- singletonObjects 一级缓存
- earlySingletonObjects 二级缓存
- singletonFactories 三级缓存
情景一(没有循环依赖)----一级缓存
情景二(有循环依赖,没有Aop) -----二级缓存
最后把半成品池(二级缓存)的对象销毁;
注:无法解决Aop代理对象
情景三(有循环依赖,有Aop)----三级缓存
步骤:(待)
blog.csdn.net/lkforce/art… blog.csdn.net/m0_43448868… www.bilibili.com/video/BV1ET…