spring -> springboot -> springcloud
spring 框架 生态 扩展性
spring
ioc
IOC控制反转 DI依赖注入
aop
ioc容器 -> 对象 bean
<beans>
<bean id=? class=? abstract init-method scope dependon...>
<property name=? value=?/>
<property name=? ref=?/>
</bean>
<bean id=? class=? abstract init-method scope dependon...>
<constructor-arg name=? value=?/>
<constructor-arg name=? ref=?/>
</bean>
</beans>
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
XXX xxx = ac.getBean(XXX.class);
xxx.method();
加载 -> 解析xml -> 封装BeanDefinition -> 实例化 -> 放到容器中 -> 从容器中获取
容器 -> Map
在容器创建过程中需要动态的改变bean的信息怎么办
<property name=url value=${jdbc.url}>
如果想随时修改beanDefinition怎么办?
postProcessor 后置处理器 增强器
BeanFactoryPostProcessor -> 增强BeanDefinition信息
BeanPostProcessor -> 增强Bean信息
创建对象
实例化 -> 在堆中开辟一块空间 -> 对象的属性值都是默认值
初始化 -> 给属性设置值 -> 填充属性
-> 执行初始化方法 -> init-method
实例化 -> 【填充属性(populate)-> 设置aware接口的属性 -> BeanPostProcessor.before -> 执行init-method方法 -> BeanPostProcessor.after】初始化环节 -> 完整对象 -> context.getBean
Aware接口到底是什么作用?
当spring容器创建的bean对象在进行具体操作的时候,如果需要容器的其他对象,此时可以将对象实现aware接口,来满足当前的需要
在不同的阶段要处理不同的工作,应该怎么办?
观察者模式:监听器,监听事件,多播器(广播器)
AbstractApplicationContext refresh()中的13个方法
prepareRefresh() 做容器刷新前的准备工作
1.设置容器的启动时间
2.设置活跃状态为true
3.设置关闭状态为false
4.获取Environment对象,并加载当前系统的属性值到Environment对象中
5.准备监听器和事件的集合对象,默认为空的集合
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
创建容器对象:DefaultListableBeanFactory
加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
prepareBeanFactory(beanFactory)