IOC AOP<-Spring->容器->生态
先说你的认知,总-分结构
spring是一个基础的框架,同时提供了Bean的容器,用来方便装载具体的Bean对象,之前在使用对象的时候必须自己new,而现在只要告诉容器有哪些对象他会帮我们创建好,并且维护好整个的生命周期。我们在spring的基础上还有SpringBoot、SpringCloud都是在此基础上。
分:
1、什么是IOC?什么是AOP?
IOC表示控制反转,原来我们需要自己去创建对象,并且交由容器去管理控制对象,AOP表示面向切面编程,跟业务逻辑无关的代码能通过AOP来实现,比如说工作中的日志、事务管理都是通过AOP来实现的。也就是说具体的业务逻辑不变,扩展的时候通过AOP的声明通知、具体方法的前置后置Around等添加与业务无关的代码。
2、IOC、AOP如何实现?生命周期、循环依赖?
Spring中有一个容器,容器中间有多个map对象
spring源码的xml与注解转换成了BeanDefinition对象
BeanDefinitionReader,只要实现了这个接口就不限于xml、注解、还能增加properties等等去实现bean的定义信息
(题外话)抽象类与接口的区别
抽象是自下向上,接口是自上向下
首先要从BeanDefiniton直接到创建Bean对象,首先想到的思路是反射。
反射
1、获取对象Class clazz=class.forName
2、获取构造器Constructor ctor=clazz.getDeclareConstructor()
3、创建对象
ctor.newInstance()
但是,理论上直接BeanDefiniton通过反射创建Bean对象,不就能解决问题了吗?别着急,上面图片中的xml文件的property属性中有若干占位符需要替换进去,需要解决这个问题,就不能直接用反射。
当我们要创建BeanDefinition后,创建bean对象之前,需要替换jdbc.username这些参数,需要PostProcessor(增强器,提供某些额外的扩展功能)
上面说的针对的操作对象不同:
BeanFactory代表访问Spring Bean容器的根接口
Bean代表对象
postProcessor处理了占位符,比如刚刚说的jdbc.username,生成完整的BeanDefinition对象
从对象的创建到销毁的过程,粗略来说就是Bean对象的创建、使用、销毁。
第一步,实例化(在堆空间中申请空间,此时对象的属性值一般是默认值,反射创建对象的过程,createBeanInstance)
发现下面的三步,不就是反射的三步骤吗?获取class对象,获取构造器,newInstance。
第二、三步,初始化(自定义属性赋值,populateBean)、容器对象属性赋值(Aware就是一个标志,实现接口,能在统一的方法进行处理,invokeAwareMethods)
Spring中的Bean对象按照使用者分为几类?
1.我们的自定义对象;
2.容器对象;(不是我们要用的,是容器在创建过程中要使用的对象),例如:BeanFactory、ApplicationContext、Environment;
理论上到此前三步搞定,对象的创建和属性的赋值都完成了,就做了new一个对象,然后set参数,对象能拿来使用了,但是注意spring要考虑扩展性。
第四步,postProcessor-做Bean对象的扩展实现
前置方法,什么都没有
后置方法,一路点下去
所以结论:AOP其实就是IoC整体流程(Bean生命周期)里的一个扩展点
第五步,InitializingBean——执行初始化方法
至此图上的7个步骤都处理结束,接着就能使用Bean对象
使用对象
context.getBean()
销毁Bean对象(不用)
我们开发用不到销毁容器的代码,所以不用管