一、反射机制
创建对象的两种方式:new 和反射
1、获取Class的三种方式
Class clazz = Class.forName();
Class clazz = 类名.class;
Class clazz = 对象名.getClass();
2、生成具体的对象
Constructor ctor = clazz.getDeclareConstructor();
Object obj = ctor.newInstance();
使用场景:比如JDBC原生代码注册驱动,hibernate 的实体类,Spring 的 AOP等等都有反射的实现。但是反射也会消耗系统的性能,增加复杂性。
二、Spring 的使用步骤:
创建配置文件==>加载==>解析==>创建实例==>使用==>销毁
容器==>存放==>bean==>数据结构==>Map
Spring 中 Bean的默认 scope 地单例的
1、生成对象的两种方法:xml配置文件 和 注解(定义Bean的定义信息),之后将BeanDefinition(bean定义信息)放到IOC Container当中。但是,xml中的信息必须要进行抽奖层定义规范进行解析(读取BeanDefinitionReader)才能被Container识别。在Container中获取到的BeanDefinition通过BeanFactoryPostProcessor进行转换属性值(修改xml配置文件中的信息)。
如下代码:
是将root赋值给username,而赋值的过程就通过BeanFactoryPostProcessor实现
如果需要自定义修改文件的信息只需要实现BeanFactoryPostProcessor即可。
通过ConfigurableListableBeanFactory对象获取BeanDefinition
2、BeanFactory通过反射实例化对象
Bean的生命周期在单例模式下就是在初始化的时候创建的。
a、通过反射完成实例化、
b、填充属性(populateBean)、
c、执行Aware接口需要实现的方法、【Aware接口的意义:方便通过spring中的Bean对象来获取对应容器中的相关属性值】
d、BeanPostProcessor:before
e、init-method初始化方法
f、BeanPostProcessor:after
g、完整对象
h、销毁流程
如果需要在spring生命周期的不同阶段左不同的处理工作,可以使用观察者模式:监听器、监听事件
super():定义一些属性;
SetConfigLocations():定义配置文件的位置(applicationContext.xml)
refresh():加载所有 bean 定义并创建所有单例
prepareRefresh():准备工作方便后面能存储工作
1、先创建容器。如果存在工厂销毁;createBeanFactory()创建工厂;setSerializationId()为序列化指定ID;定制工厂,设置相关的值;
2、loadBeanDefinitions()加载配置文件。由于未读取到配置文件,所以beanDefinitionMap的值未0
当将xml配置文件转换成IOC Container可以识别的信息,就将信息存储到Map中
3、初始化BeanFactory
4、调用BeanFactoryPostProcessor
5、之后进行实例化,但是在实例化的时候需要使用到BeanPostProcessor,所以需要准备BeanPostProcessor和监听器。
6、initMessageSource()国际化处理
7、准备监听器,初始化 多波器
8、注册监听器registerListeners()
9、接下来需要实例化。实例化所有剩下的非懒加载单利对象
判断容器里面有没有Bean,没有则继续doGetBean()
真正干活的方法是doGetBean
10、创建Bean的实例
11、populateBean填充属性值
12、执行Aware接口需要实现的方法
13、执行before方法
14、初始化之后调用after方法
15、对象创建成功