说说老生常谈的Spring

1.Spring框架是啥(先来一顿疯狂吐槽)

      说到Spring框架,想想几年前,以至于后来在网页上,只要搜索什么是spring,我想相信很多人看到最多的两个关键词语,然后又对这两个词语疯狂混淆,疯狂摸不清楚:空值反转,依赖注入。这里我不得不吐槽一下当时给这两个概念的命明者,特么起的真的叫一个好名字啊!每次去复习这个框架的时候,都要把者两个概念给搞清楚!而且有段时候,还疯狂混淆者两个概念,以为者两个是同一回事儿,以为他们就是控制反转=IOC=DI !!!当然有时候是自己智商问题,我现在甩锅给命名者是不是不太合适。后面去网络上去查这两个概念,发现很多说法也过于严谨,官方。其实我觉得是理解能力有限。下面说下我的理解:IOC是spring提供的对bean的管理的容器,控制反转和依赖注入其实是ioc的两个核心功能。控制反转其实就是框架ioc依照我的配置帮我们new对象;依赖注入就是根据我们的描述,给new出来的对象进行赋值。整个IOC就是提供了对我们描述对象的管理,以及对象之间关系的维护。IOC是spring的基础和内核,之后spring所有的扩展都围绕着IOC功能的!比如AOP,相信大家都知道spring AOP是基于动态代理实现的,所以他和普通的bean的区别就是,一个是框架之间调用发射生成实例,放入IOC容器,AOP是自己生成一个对原先类扩展的class类,然后在把这个对象new出来,最终放入IOC容器。所以,现在我来回答Spring是啥,Spring就是一个管理我们需要用到的对象的框架,它把对象封装成Bean,对象的所有的创建,毁灭,生命周期,统统不需要维护,让我们的代码专注于业务代码。

2.说说IOC

2.1 谈谈springIOC的beanFactory

        说到IOC,肯定离不开BeanFactory接口。如同它的名字,bean工厂,是用来管理bean的最核心的接口(命名叫BeanManager是不是更加合适点)。所有的bean的创建,获取,都在这个类里面执行。如果把我们Spring项目比作一辆汽车的话,BeanFactory相当于是整个汽车的发动机,是这个项目的心脏。它管理着整个spring项目的bean。BeanFactory最核心的方法就是getBean方法,这个方法就是这个BeanFactory的反应堆。IOC容器会调用getBean方法,来实现bean的控制反转依赖注入。如果阅读源码的同学,把这个方法的脉络清楚了,那么整个beanFactory的逻辑可以说已经掌握到精髓了。那BeanFactory具体是些啥呢,其实内部就是维护了一堆Map。Map里面维系了各种Class|beanName...等和bean的对应关系。我的getBean做了什么事情呢,就是检查这些Map中这个对象存不存在,如果存在,就取出,不存在则创建一个,并且给他的bean属性赋值,然后把新生成的bean对象返回。当然这只是一个简单的流程,中间还判断是不是单例,这个对象是不是一个工厂之类的比较复杂的判断。感兴趣的话,大家可以看看源码。

2.2 谈谈springIOC的ApplicationContext

      首先,我不知道把ApplicationContext叫做容器还合适不合适,姑且这边还把他比作IOC容器的吧。我们其实在接触Spring的时候,调用getBean方法其实是通过这个接口类来调用的。那么这个类和beanFactory有啥关系呢?其实在ApplicationContext实现类,是用了代理模式。ApplicationContext对beanFactory做了一下代理,也就是说,我们调用ApplicationContext的getBean,ApplicationContext最终还是调用beanFactory的getBean方法来获取bean。上面我把Spring项目比作一辆汽车,beanFactory比作马达,那么ApplicationContext就是车的底盘,所有的组件都要依据地盘安装。到底beanFactory和ApplicationContext的区别是啥呢!如果我们Spring的bean,要被加载到Spring容器里面,光光beanFactory,是不支持的!我认为,加载得分3大步!首先,得有组件定位我们的配置;其次,还要有加载配置的组件,最终加载后的数据注册到容器。BeanFactory只是其中的注册,前两步,就是applicationContext依据其他组件来执行。总之,ApplicationContext维系了整个Spring项目的生命周期,而beanFactory只是负责Bean,ApplicationContext负责全局

3.说说SpringAOP

      SpringAOP是Spring推出的一大基础功能,命名为面向切面;不得不说,命名太深奥,包括切面,切入点等概念。我再次吐槽,严谨官方命名会大大增加理解难度;所谓切入点,就是我们某些方法执行前,执行之后等某些特定的执行点。而切面,就是我们在执行前,或者执行后需要执行逻辑。而切面的实现靠的是代理模式,就是用增强类,对方法执行前,执行后,catch等点进行拦截,执行我的的切面逻辑。SpringAOP是基于动态代理,动态代理就是自己生成了一个类,这个类不是加载我们的class文件,而是根据我们的代码逻辑生成的类。上面也说了,实现方式,就是AOP的实例对象,在Spring容器里不再是我们写的类,而是字节码代理类的实例对象

你可能感兴趣的:(说说老生常谈的Spring)