生命周期的理解:实例化 -> 属性赋值 -> 初始化 -> 销毁
spring容器启动的过程通俗理解:
加载配置文件,配置文件可以是xml,也可以是配置类;
统一先由beanDfinereader读取beandfinne,这些配置信息(bean的详情,一般是String)
然后由beanfactorypostprocsee的实现类(可以自己实现)做beandifine增强
然后通过反射创建实例
然后填充属性populatBean()
然后由beanpostprocess做bean信息增强(分前置后置)
中间执行下init-method
这些做完就放进容器里
你就可以getbean了
详细讲解
1.加载配置文件,配置文件可以是xml,也可以是配置类;
2.统一先由beanDefinereader读取到beandefiner,这些配置信息(bean的详情,一般是String),将信息解析到beandfinnition接口的实现类(类中包含bean的信息,像id,name,别名,properties属性,是否懒加载,是否是原始类型,初始化方法等)(涉及别名信息怎么处理:正常情况注册,就是向容器保存beandefine信息的map中,就是想map添加一个键值对,key是别名,value是beandefinition对象)中;
3.然后由beanfactory容器后置处理器(beanfactorypostprocessor)处理。 beanfactoryprocessor的实现类可以做很多事,因为正常的单例实例化还没有执行,可以去增加bean,修改bean,移除等等。(这是spring框架,提供的可扩展的接口,因为spring遵守面向扩展开放和面向修改关闭的规则,提供给开发者自己实现)
######################################################################
怎么提供容器后处理器?
----实现beanfactorypostprocessor接口,然后将实现类通过xml,用bean的方式写到配置文件中就可以了。后面容器启动,会读到beandefinition信息,将接口的实现类配置信息读出来,利用反射去创建实例,实现接口的方法
bean后处理器(BeanPostProcessor)的流程?
两个的区别?
一个beanfactorypostprocessor是在单例实例化前,执行;bean后处理器是穿插在bean实例的过程中,他有两个接口方法,调用点是在init-method初始化方法执行的前后;然后bean后处理器还有一些子接口,子接口提供了一些实例化前后增强方法的入口等等。bean后处理器也是spring提供的核心扩展技术,sprig本身提供了很多bean后处理器的实现类
######################################################################
4然后通过反射创建实例
5然后填充属性populatBean()
6然后由BeanPostProcessor做bean信息增强(分前置后置)
7中间执行下init-method
8接下来会创建一个事件传播器对象,也就是spring给我们的扩展地方
#####################################################
事件传播器有什么用呢?
事件传播器会接受相应的事件,并且传播。比如说根据beandefinition创建了一个实例,保存到缓存中,会发出事件到事件传播器。事件传播器可以注册很多listener监听者。传播器把事情广播出去以后,listener就收到了事件,收到事件以后,该怎么做,就是看代码怎么写了,其实就是一个监听者模式
监听者怎么给到传播器?即怎么监听事件?
只要实现了监听接口,并且配置成bean就可以了。spring容器启动以后,会根据类型获取beandefiner信息,并且实例化以后注册到事件传播器上。
传播器是怎么运行的
#####################################################
9这些做完就放进容器里,你就可以getbean了
#####################################################
正常的单例的实例化过程。
加载配置信息==》beandefeinitionread 读取beandefeinitioner信息,放到容器的map中==》bd的实现类和parent信息加载到mbd(mergebeandefeiner)中==》mbd是否配置有depend-on信息,如果有,先实例化depend-on指定的bean==》再往下走,根据bean指定的class信息还有构造方法信息,去寻找合适的构造方法,这个查找过程非常复杂,总之到最后拿到合适的构造方法,通过反射实例化对象==》还有很多对应的逻辑进行处理,属性填充,依赖注入,init-method方法调用
#####################################################