图片看不清的话,看文字吧:
四月 07, 2015 3:43:54 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans.xml]
----------------实例化bean----------------------
InstantiationAware BeanPostProcessor. postProcess BeforeInstantiation
InstantiationAware BeanPostProcessor.postProcess AfterInstantiation
Instantiation AwareBeanPostProcessor.postProcess PropertyValues
----------------初始化bean----------------------
调用BeanNameAware.setBeanName()。
调用BeanFactoryAware.setBeanFactory()。
调用BeanPostProcessor.postProcess BeforeInitialization(), 将salary调整为800。
调用InitializingBean.afterPropertiesSet()。
调用init-method所指定的myInit(),将salary设置为600。
调用BeanPostProcessor.postProcess AfterInitialization(), getWorkType为空,设置为默认临时工
第一次从容器中获取worker
name:小强;workType:临时工;salary:600
修改第一次从容器中获取worker的workType
第一次从容器中获取worker(修改过后的)
name:小强;workType:正式工;salary:600
第二次从容器中获取worker
name:小强;workType:正式工;salary:600
查看worker1和worker2是否指向同一引用
worker1==worker2:true
四月 07, 2015 3:43:54 下午 org.springframework.beans.factory.xml.XmlBeanFactory destroySingletons
信息: Destroying singletons in org.springframework.beans.factory.xml.XmlBeanFactory@16905e: defining beans [worker]; root of factory hierarchy
----------------销毁bean----------------------
调用DisposableBean.destroy()。
调用destroy-method所指定的myDestroy()。
我们可以看到第二次获取worker时,直接从容器的缓存中获取,它们两个的指向的是同一个引用!切记!
四、ApplicationContext与beanfactory的区别
从ApplicationContext应用上下文容器中获取bean和从bean工厂容器中获取bean的区别?
具体案例:
1、从ApplicationContext中获取bean
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
当我们去实例化beans.xml,该文件中配置的bean被实例化,(该bean的scope是singleton(单例))
2、如果我们使用beanfactory去获取bean,当你只是实例化该容器,那么容器的bean不被实例化,只有当你去使用getBean某个bean时(感谢hemi1995指出错别字),才会实时的创建
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
factory.getBean("student");
结论:
1、如果使用ApplicationContext,则配置的bean如果是singleton(单例)不管你用不用都被实例化,好处就是可以预先加载,坏处是浪费内存,
2、如果是用BeanFactory,则当你实例化该对象的时候,配置的bean不会被马上实例化,当你使用的时候才会被实例化(就像延缓加载机制)好处就是节约内存,缺点是速度回降慢,
3规则:一般没有特殊的要求,应当使用ApplicationContext完成(90%以上的项目)
使用ApplicationContext三种经常用到的实现:
1、ClassPathXmlApplicationContext->从类路径加载
2、FileSystemXmlApplicationContext->从文件系统加载
举例:ApplicationContext ac = newFIleSystemXmlApplicationContext("C:\Users\Workspaces\MyEclipse
8.5\myspring\src\com\zqx\inter\beans.xml");
3、XmlWebApplicationContext->从web系统中加载(当tomcat启动的时候加载)
欢迎微信搜索关注:java进阶架构师私信关键字【架构】即可获取免费最新的2018Java架构学习资料(里面有并发编程、高性能及分布式、Jvm性能调优、Spring源码,redis深入,Springboot cloud等多个知识点的架构资料)最新活动,双十一包邮送15本实体书,快快搜索公众号来参与吧!
---------------------
作者:一杯甜酒
来源:CSDN
原文:https://blog.csdn.net/u012562943/article/details/50469095
版权声明:本文为博主原创文章,转载请附上博文链接!