我们都知道,在创建一个spring应用的时候,通过构建spring容器,根据容器获取bean,那么spring是如何创建bean的呢?首先在创建bean容器时,通过上下文也就是非BeanFactory创建时,被标记的java对象就会在容器创建时被创建,如代码所示:
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountDao adao = ac.getBean("accountDao",IAccountDao.class);
其中依赖注入也在这时候完成,需要注意的是,spring初始化bean是需要步骤的,这个过程类似jvm的类加载机制
1. bean的生命周期
1.1 BeanDefinition
对于一个普通类的实例化过程,当启动jvm时,代表该类的字节码文件被加载进内存中,在方法区生成代表这个类的唯一class模板,并通过这个模板在堆中生成对象,但是bean实例化过程却没有这么简单:
假如在X类上加了@XXX之类的注解,使之能被spring扫描并创建,按道理应该创建X的对象放入spring容器中,其实该不该创建并不能确切的知道,比如该类被设置为懒加载或者是prototype
类型的就不会立即创建对象,虽然不会创建对象,但spring会创建BeanDefinition
的子类来存储X类的信息,比如名字,描述信息等,让后将该对象放进map中
1.2 bean的产生
运行我们的java程序,通过xml文件或者注解的方式都会创建我们的bean容器,这个容器首先会将xml文件中的bean标签或者被注解的类放进去,那么这个时候会不会new一个对象呢?答案是不确定的,比如该类被设置为懒加载或者是prototype
类型的,所以spring会先对它进行解析parse
,将解析的类放进GenericBeanDefinition
这个对象中,并且设置该类的属性:
通过一系列设置值过后,spring就会根据名称将这个BeanDefinition对象放进map和list中