范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

SpringBean生命周期管理系列之三Spring创建对象的流程框架

  Spring Bean与Java Bean相比较,就是由Spring IOC容器负责实例化、组装、管理,而Java Bean需要用户自己创建、管理和使用,其基本流程是创建对象(new一个对象),使用对象,使用完成之后JVM自动进行垃圾回收。Spring Bean在整个生命周期,提供了很多的切入点,用户可以根据实际的情况进行干预,在确定主线的前提下,最大化的提供灵活性。
  在一边Spring跟源码,一边分析之后,画出了Spring Bean的生命周期如下图所示:
  Spring Bean创建流程框架Spring Bean创建流程框架
  根据上图,可以看出启动Java程序,首先启动JVM,然后找到main入口类,开始Spring Bean的生命周期。
  第一,进行Spring容器的准备工作,创建容器工厂,创建Spring容器,创建BeanFactory;
  第二,扫描XML和注解,把Bean包装成BeanDefinition放在beanDefinitionMap中;
  第三,调用BeanFactoryPostProcessor的后置处理器方法;
  第四,进行对象实例化之前,可以调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法;
  第五,实例化,根据构造函数创建对象;
  第六,实例化之后,调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法;
  第七,实例化之后,调用InstantiationAwareBeanPostProcessor.postProcessProperties方法;
  第八,设置对象的属性,通过Spring的依赖注入实现;
  第九,如果实现了Aware接口,则引入相对应的对象作为类的变量;
  第十,对象初始化之前,调用Bean后置处理器postProcessBeforeInitialization方法;
  第十一,对象初始化,即调用InitializingBean.afterPropertiesSet方法或调用init-method方法;
  第十三,对象初始化之后,调用Bean后置处理器postProcessAfterInitialization方法;
  第十四,如果生成的对象为singleton类型,则存放入Spring容器,供程序使用,使用完成之后,会调用DisposableBean.destroy方法,调用destroy-method方法;如果生成的对象为prototype类型,则用户自己管理,重新向Spring容器获取对象时,会重新创建一个新对象。职责划分
  弄清楚Spring Bean的生命周期,尤其是可以干预点,特别的重要,因为Spring的重要特性都是通过这些切入点完成的,比如AOP、IOC等。其实从整个过程来看,我们简单从层次的角度做一下划分。
  第一层,是JVM层,Java程序要运行必须要先启动JVM,JVM的启动流程和原理这里就不展开了;
  第二层,是Spring工厂层,这一层主要通过BeanFactoryProcessor,及其子接口来实现;
  第三层,是Spring容器类,是Spring的重点,主要是InstantiationAwareBeanPostProcessor、BeanPostProcessor等后置处理器,这些处理器对于所有Spring容器的Bean都起作用,这一点特别重要 。
  第四层,类自身的方法,比如构造函数、getter和setter函数、实现的InitializingBean, BeanNameAware, DisposableBean,ApplicationContextAware等接口。代码实现
  Listen类:@Component public class Listen implements InitializingBean, BeanNameAware, DisposableBean,ApplicationContextAware {     private String who;     private String how;     private String when;      public  Listen()     {      }     public Listen(String who,String how,String when){         this.who = who;         this.how = how ;         this.when = when;         System.out.println("======Listen 调用构造函数");     }      public String getWho() {         return who;     }     @Value("${english.listen.who}")     public void setWho(String who) {         this.who = who;         System.out.println("======Listen 调用属性注入{who}");     }      public String getHow() {         return how;     }      @Value("${english.listen.how}")     public void setHow(String how) {         this.how = how;         System.out.println("======Listen 调用属性注入{how}");     }      public String getWhen() {         return when;     }      @Value("${english.listen.when}")     public void setWhen(String when) {         this.when = when;         System.out.println("======Listen 调用属性注入{when}");     }      public void myInit(){         System.out.println("======Listen 调用init-method方法");     }      public void myDestroy(){         System.out.println("======Listen 调用destroy-method方法");     }      @Override     public void setBeanName(String name) {         System.out.println("======Listen 调用BeanNameAware.setBeanName方法");     }      @Override     public void destroy() throws Exception {         System.out.println("======Listen 调用DisposableBean.destroy方法");     }      @Override     public void afterPropertiesSet() throws Exception {         System.out.println("======Listen 调用InitializingBean.afterPropertiesSet方法");     }      @Override     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {         System.out.println("======Listen 调用ApplicationContextAware.ApplicationContextAware方法");     } }
  TestBeanFactoryPostProcessor类:@Component public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {     @Override     public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {         System.out.println("======TestBeanFactoryPostProcessor 调用BeanFactoryPostProcessor.postProcessBeanFactory方法");     } }
  TestBeanPostProcessor类:@Component public class TestBeanPostProcessor implements BeanPostProcessor, InstantiationAwareBeanPostProcessor {     public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {         System.out.println("======TestBeanPostProcessor 调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation: beanName = "+beanName);         return null;     }      public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {         System.out.println("======TestBeanPostProcessor 调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation: beanName = "+beanName);         return true;     }      public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)             throws BeansException {         System.out.println("======TestBeanPostProcessor 调用InstantiationAwareBeanPostProcessor.postProcessProperties: beanName = "+beanName);         return null;     }        @Nullable     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {         System.out.println("======TestBeanPostProcessor 调用BeanPostProcessor.postProcessBeforeInitialization方法: beanName = "+beanName);         return bean;     }      @Nullable     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {         System.out.println("======TestBeanPostProcessor 调用BeanPostProcessor.postProcessAfterInitialization方法: beanName = "+beanName);         return bean;     } }
  MyEnglishMain入口函数:这里采用单独加载特定类的方式,以减少干扰信息。public class MyEnglishMain {     public static void main(String[] args) {         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("TestBean.xml");         Listen listen =(Listen) applicationContext.getBean("listen");         ((AbstractApplicationContext)applicationContext) .close();     } }
  TestBean.xml配置文件<?xml version="1.0" encoding="UTF-8"?>                                                                                                   
  执行结果:这里删除了其他无关信息
  执行结果特殊说明
  1、如果一个类实现了InitializingBean, BeanNameAware, DisposableBean,ApplicationContextAware,也实现了BeanFactoryPostProcessor、BeanPostProcessor、InstantiationAwareBeanPostProcessor接口,Spring会首先构造实现BeanFactoryPostProcessor、BeanPostProcessor、InstantiationAwareBeanPostProcessor接口的类,导致BeanNameAware、InitializingBean在前执行。
  2、一定要自己去跟代码,你想获得比单纯看博客文章多得多的知识,和更深的理解。同时也要去看博客,建立一个框架,然后跟源码,不停的调整框架,形成自己的独有的认知框架。

经济日报携手京东发布数据土特产变身金疙瘩数据来源京东消费及产业发展研究院擦亮农产品地标名片提起东三省,人们总会联想起肥沃的黑土地,层林尽染的大小兴安岭,高高的谷堆作为北大仓,农业在东北的区域经济中扮演着重要的角色。打造维新华全媒新华社武汉11月22日电(记者徐海波龚联康)轻点鼠标,敲击键盘,便能操作全流程生产坐在办公室,看着屏幕,厂区运行状况也能了然于胸当老字号工业企业邂逅5G工业互联网,立时就有了从内而惠普戴尔联想华硕笔记本电脑品牌相比,哪一款表现更好?惠普戴尔联想华硕笔记本电脑相比,哪一款表现更好呢?提起笔记本电脑,那么一定会想起上述几种笔记本电脑品牌,那么下面就来对比一下吧!先来聊聊惠普笔记本电脑,作为全球知名PC端品牌,惠普WebcatEE安装部署WebcatEE是一个Web版的数据库管理工具,支持多种RDS数据库和NOSQL数据库,拥有SQL在线执行,SQL审核,工单管理,数据库监控等功能。安装部署环境要求1。JDK1。8LAMOST早型星双星统计性质研究取得进展近期,天体与天体物理学(AstronomyAstrophysics)在线发表了中国科学院云南天文台研究人员与合作者关于早型星双星统计性质的研究工作。该工作利用LAMOSTDR8中分研究犹如超级马拉松,如何消除学术倦怠?11。20知识分子TheIntellectual知识分子XPhysicsWorld,带你走进英国媒体视角下的科学议题导读如何消除学术倦怠?荷兰奈梅亨高磁场实验室的凝聚态物理博士研究千元机真我10Pro竟是曲面屏,还是5000毫安轻薄机,值得买吗?这两天有同事问我,说那个真我是什么牌子,咋这么牛,做出来了一款华为P50款的千元机!1699元起步,值得买吗?这品牌值得信任吗?我说,这个品牌是OPPO投资的企业,打造的UI系统是下沉市场不存在降维打击,大家一起三国杀操盘手自述作者关聪编辑冰清下沉市场是一个很形象的词,它暗含着物以类聚,人以群分的假设性前提,堂而皇之的把消费力鄙视链摆在纸上。人们对于下沉市场的想象,总是居于两个极端,认为下沉市场形同鸡肋,欧菲光前总经理来搞新能源智动力大踏步跨界能否成功?11月16日,智动力公告称,公司与三孚新科签署了战略合作框架协议,双方一致同意围绕复合铜箔生产进行全面合作。智动力基于其规划的产能向三孚新科预计首期采购的一步式全湿法复合铜箔化学镀给家里打个电话有那么难吗?事情的背后,不是冷漠也不是不孝顺导语对于许多人来说,上大学那会儿,难忘的事情有很多,最记忆犹新的,是许多个夜晚与父母畅谈心事嘘寒问暖的时候。特别是那些远离家乡几千里之外,只有寒暑假才能回一次家的孩子,更珍惜能够与大小S这些年所做的事情,可能远远比你想象中还要荒唐就在今天,已经离婚有段时间的汪小菲突然在网上大骂台湾艺人徐熙娣,言语之间充满了愤怒,也充满了卑微。很难想象,身为一个北京爷们儿,之前又是妥妥的超级富二代,汪小菲怎么会突然就失控了呢
隐退13年,44岁孙莉复出被群嘲,她走错了哪一步?01hr很长一段时间里,孙莉都活成了外界眼中的人生赢家。容貌清丽。生活富足。丈夫是黄磊,有名气,有地位。更令人羡慕的是,对她数十年如一日的宠爱。就连蒋勤勤都知道孙莉至今不会做菜做饭周末爆出6个瓜,被曝患暗病校园欺凌意外死亡,个个都是大瓜无论何时的娱乐圈都不会平静,即便是在6月25日6月26日这样平凡的周末。童星遭遇校园欺凌事件有了新进展,也有明星回应了狗仔的爆料,各有各的精彩。01林志炫回应狗仔爆料葛斯齐在爆料汪红得快,沉得也快,这8位风光不再女明星,有人太可惜了人无千日好,花无百日红。造星有术的娱乐圈里,从来都不缺一炮而红的幸运儿。但快速走红并不等同于永葆璀璨。许多红极一时的明星,都因为这样那样的原因,陷入无人问津的境地。这次皮哥就给大家14张被大多数60后遗忘的珍贵老画面,你还记得它们吗?1。1982年,东北。上世纪,辽宁省大连市的市井人文老照片。这是一位老前辈给我的翻拍照片,这里记录了大连曾经的精彩照片中还可以看出大连的女子,非常的青春靓丽2。1982年,云南。上新人该如何在头条发展下去,万千坎坷啊在准备做头条前,我也左思右想过做点什么合适,因为工作性质(出差较多)的原因,想着能打理头条的时间也并不多。后来偶然一个机会,在翻看学生时代的一些电视剧时发现,当年那些电视剧电影应该44岁歌手谭晶嫁科学家老公,37岁生双胞胎,如今的她生活美满有才而性缓,定属大才。有智而气和,斯为大智。弘一法师在通往成功的道路上,需要的不止是天赋。即使年少大才,但总归好事多磨,失去了时间的积累和沉淀,就缺少了那一份成功的契机。对于谭晶来突发!沈阳一面馆爆炸致1人轻微伤,目击者现场损失挺严重6月26日上午,辽宁沈阳,浑南区古城子镇一面馆发生爆炸事故,附近门店和停放的车辆受损严重,周围一片狼藉。6月26日中午,潇湘晨报(报料微信xxcbbaoliao)记者从沈阳市浑南区曾国藩被杨辅清十万大军困江西,一女子解其围,使她丈夫连升四级太平天国时期,江西一直是湘军与太平军反复争夺的主战场,拿曾国藩的话来说江西毗连六省,形势极关紧要,现在贼势蔓延,非迅速剿除,则东南均难安枕。的确,从地理位置上看,江西西通湖南,东连我,23岁不计代价,远嫁大10多岁的尿毒症老公,如今双双隐居山间这是我们讲述的第510位真人的故事我是紫苏,一名土生土长的95后大漠姑娘,出生于甘肃,现与先生双双隐居江南乡野,过着日出而耕日落而息的生活。我是一名素食主义者。从小到大,因为一直吃已停产的10种童年零食,以前吃到幸福到哭,你还有印象吗小时候的回忆是最美好的,所以有些时候都是能想起来小时候的事情,尤其是零食简直是忘不掉,那时候吃到嘴里简直是幸福到哭,现在却连看都看不到了,小时候家里人看的严格,现在想吃,却停产了!因晒和黑人丈夫结婚照,网红遭非议他对我很好还入乡随俗给彩礼文薛定谔的猹在如今的中国,跨国婚姻已经不算新鲜事,不过相比于和亚洲人或者欧美白人的结合,跟黑人结合的情况在国内相对还是比较少见,尤其是那些外嫁给黑人的中国女生,也更容易招致非议。日