敖丙思维导图系列目录
这些知识整理都是自己查阅帅丙资料(当然还有其他渠道)加以总结滴~ 每周都会更新知识进去。
如有不全或错误还请大家在评论中指出~
- 敖丙思维导图-集合
- 敖丙思维导图-多线程之synchronized\ThreadLocal\Lock\Volatitle\线程池
- 敖丙思维导图-JVM知识整理
- 敖丙思维导图-Spring
- 敖丙思维导图-Redis
- 敖丙思维导图-RocketMQ+Zookeeper
- 敖丙思维导图-Mysql数据库
本文章目录
Spring
Spring是一个开源框架,处于MVC模式中的控制层,它能应对需求快速的变化,其主要原因它有一种面向切面编程(AOP)的优势,其次它提升了系统性能,因为通过依赖倒置机制(IOC),系统中用到的对象不是在系统加载时就全部实例化,而是在调用到这个类时才会实例化该类的对象,从而提升了系统性能。
- 降低了组件之间的耦合性,实现了软件各层之间的解耦。
- 可以使用容易提供的众多服务,如事务管理,消息服务,日志记录等。
- 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
设计模式
- Spring结合了
工厂模式和反射
机制实现IOC容器。 单例模式
,提供了全局的访问点BeanFactory。- Spring中的BeanFactory就是
简单工厂模式
的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 观察者模式
:listener的实现。如ApplicationListener。模板方法
: xxxApplicationContext 的refush()。代理
:(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即生成被代理类的代理类, 并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。装饰器模式
:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。(比如依赖注入就需要使用BeanWrapper)策略模式
:Bean的实例化的时候决定采用何种方式初始化bean实例(反射或者CGLIB动态字节码生成)
策略模式:抽象了出了接口,将业务逻辑封装成一个一个的实现类,任意地替换。利用java8的Map与函数式接口来实现。
Spring Bean的生命周期(createBean中的doCreateBean)
概述 (实例化+属性赋值+初始化+销毁)
进入createBean方法,如果有代理方法(AOP)则调用postProcessBeforeInstantiation,换原本的Bean作为代理。进入doCreateBean方法,调用createBeanInstance
创建BeanWrapper实例包装类。(这里判断了Spring的循环依赖问题)
这时进入populateBean
方法,调用postProcessAfterInstantiation方法,如果调用返回false,表示不必继续进行依赖注入,直接返回。如果返回true,向 bean 的成员变量注入自定义的信息。最后通过BeanWrapper提供的设置属性的接口完成属性依赖注入(DI)。
下一步进入initializeBean
(),首先判断是否实现了Aware接口,有的话就注入相关属性。接着调用初始化的前置(BeanPostProcessor)操作,接着执行初始化的方法,最后调用bean初始化的后置(BeanPostProcessor)操作。
注册Bean的销毁
逻辑。当Bean不再需要时,销毁Bean。
详细步骤
InstantiationAwareBeanPostProcessor作用于实例化阶段的前后。
- 实例化
createBeanInstance()
Ioc容器通过获取BeanDefinition对象中的信息进行实例化,实例化对象被包装在BeanWrapper对象中
postProcessBeforeInstantiation在doCreateBean之前调用
,该方法的返回值会替换原本的Bean作为代理
,这也是Aop等功能实现的关键点。- postProcessAfterInstantiation该方法在属性赋值方法内,但是在真正执行赋值操作之前。其返回值为boolean,返回false时可以阻断属性赋值阶段
Spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法
(我的策略模式就是这么干的),或者在配置文件中通过init-method
指定,两种方式可以同时使用。
- 属性赋值
populateBean()
通过BeanWrapper提供的设置属性的接口完成属性依赖注入(DI);
BeanPostProcessor作用于初始化阶段的前后,它也会注册为Bean
-
初始化
initializeBean()
注入Aware接口+自定义的处理 (所有的Aware方法都是在初始化阶段之前调用的) -
销毁 容器关闭时调用
// 忽略了无关代码
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
//bean实例包装类
BeanWrapper instanceWrapper = null;
if (