ioc 订阅
国际奥林匹克委员会,简称为国际奥委会,是一个国际性的、非政府的、非赢利的组织。是奥林匹克运动的领导机构,它于1981年9月17日得到瑞士联邦议会的承认,确认其为无限期存在的具有法人资格的国际机构。总部位于瑞士洛桑。由法国人皮埃尔·德·顾拜旦建立,首任主席是泽麦特里乌斯·维凯拉斯。据2017年01月16日《人民日报》(海外版)第06版介绍,国际奥委会有100个委员和32个荣誉委员。 [1]  1894年6月23日,国际奥委会在巴黎召开的国际体育代表大会上成立,发起人是法国的教育家皮埃尔·德·顾拜旦男爵。成立之初总部设在巴黎,1914年第一次世界大战爆发,为避战火,1915年4月10日迁入有“国际文化城”之称的瑞士洛桑。国际奥委会根据现代奥林匹克运动创始人顾拜旦的理想,恢复奥林匹克运动的目的,在于增强各国运动员之间的友谊与团结,促进世界和平以及各国人民之间的相互了解,发展世界体育运动。《奥林匹克宪章》明文规定,国际奥委会的宗旨是:鼓励组织和发展体育运动和组织竞赛;在奥林匹克理想指导下,鼓舞和领导体育运动,从而促进和加强各国运动员之间的友谊。国际奥委会组织举办奥林匹克运动会、青年奥林匹克运动会、冬季奥林匹克运动会、残疾人奥林匹克运动会。它组织的首届夏季奥运会于1896年于希腊雅典举行,首届冬奥会于1924年在法国霞慕尼举行。在2018世界品牌500强排行榜中,国际奥林匹克委员会排名第125位。 [2] 展开全文
国际奥林匹克委员会,简称为国际奥委会,是一个国际性的、非政府的、非赢利的组织。是奥林匹克运动的领导机构,它于1981年9月17日得到瑞士联邦议会的承认,确认其为无限期存在的具有法人资格的国际机构。总部位于瑞士洛桑。由法国人皮埃尔·德·顾拜旦建立,首任主席是泽麦特里乌斯·维凯拉斯。据2017年01月16日《人民日报》(海外版)第06版介绍,国际奥委会有100个委员和32个荣誉委员。 [1]  1894年6月23日,国际奥委会在巴黎召开的国际体育代表大会上成立,发起人是法国的教育家皮埃尔·德·顾拜旦男爵。成立之初总部设在巴黎,1914年第一次世界大战爆发,为避战火,1915年4月10日迁入有“国际文化城”之称的瑞士洛桑。国际奥委会根据现代奥林匹克运动创始人顾拜旦的理想,恢复奥林匹克运动的目的,在于增强各国运动员之间的友谊与团结,促进世界和平以及各国人民之间的相互了解,发展世界体育运动。《奥林匹克宪章》明文规定,国际奥委会的宗旨是:鼓励组织和发展体育运动和组织竞赛;在奥林匹克理想指导下,鼓舞和领导体育运动,从而促进和加强各国运动员之间的友谊。国际奥委会组织举办奥林匹克运动会、青年奥林匹克运动会、冬季奥林匹克运动会、残疾人奥林匹克运动会。它组织的首届夏季奥运会于1896年于希腊雅典举行,首届冬奥会于1924年在法国霞慕尼举行。在2018世界品牌500强排行榜中,国际奥林匹克委员会排名第125位。 [2]
信息
创建者
皮埃尔·德·顾拜旦(法国人)
外文名
International Olympic Committee(英),Comité international olympique (法)
简    称
国际奥委会(IOC)
成    员
206国家和地区
总    部
瑞士洛桑(Lausanne)
中文名
国际奥林匹克委员会
官    网
http://www.olympic.org/
成立时间
1894年6月23日
现任主席
托马斯·巴赫
官方语言
英语、法语
国际奥林匹克委员会发展历程
1894年6月16日-24日,根据世界著名的国际体育活动家,法国人皮埃尔·德·顾拜旦的建议,来自法国、英国、希腊、瑞典、意大利、俄国(俄罗斯)、比利时、捷克斯洛伐克、新西兰、美国、阿根廷、匈牙利12个国家的49个体育组织的代表,在巴黎索邦神学院举行国际体育运动代表大会。在开幕式上,法国著名古希腊文化专家切奥多尔·莱拉赫发表演说,巴黎国家歌剧院合唱团为大会演唱了阿波罗颂歌,唤起了与会者对古奥运会的神往。 [3]  会议期间,又先后有21个国家致函,向大会表示支持和祝贺。这次会议通过了成立国际奥委会(成立时间1894年6月23日,成立时的名称是“奥林匹克运动会国际委员会”)的决议,并从79名正式代表中选出15人任第1届国际奥委会委员。大会还决定由奥运会举办国的国际奥委会委员担任国际奥委会主席。由于首届奥运会定于1896年在希腊首都雅典举行,因此希腊委员泽麦特里乌斯·维凯拉斯当选国际奥委会第一任主席,顾拜旦为秘书长。会议规定法语(现为英、法两种语言)为国际奥委会法定语言。大会还决定沿袭古奥运会传统,每四年举行一次运动会,还规定奥运会的比赛项目为田径、水上运动(包括帆船、划船、游泳)、击剑、摔跤、拳击、马术、射击、体操、球类运动等。第一届奥运会原定于1900年于巴黎举行,后来考虑希腊为古代奥运会发源地,在希腊举行比在巴黎意义更重大些,顾拜旦尊重了大家的意见。大会决定把第一届会期改在1896年,鉴于古代奥运会遗址奥林匹亚已成了一片废墟,会址改设在希腊首都雅典。奥运会最早始于古希腊的奥林匹亚由古代希腊人民为祭神和崇拜英雄而举行的一些竞赛活动逐渐发展形成的。举行的地点就在古希腊雅典城西南方向360公里外的奥林匹亚村举行,因此而得名。第一届古代奥运会于公元前776年举行,共举行过293次。后来罗马帝国的入侵古希腊后,由于罗马皇帝狄奥多西信奉基督教,禁止一切关于异教的活动,因此运动会在公元393年被罗马皇帝狄奥多西废除。 [1]  1889年,法国的顾拜旦男爵提出恢复奥林匹克运动的建议。第一届近代奥运会于1896年在希腊举行。以后每四年举行一次。即使其间因故不能举行,届数仍然依次照算(第6、12、13届未举行。第6届由于第一次世界大战的爆发未能举行,第12,13届则因为第二次世界大战的爆发未能举行)。至2016年,已经举行过31次奥运会,最近的一次是在巴西的里约热内卢举行的奥运会。1897年一家法文报纸首次称之为“国际奥林匹克委员会”,1901年正式改用现名。1914年第一次世界大战爆发,为避免战火洗劫,1915年4月10日总部从巴黎迁到瑞士洛桑。早在1922年,中国奥委会就得到了国际奥委会的承认。 [4]  中国曾派运动员参加了1932年、1936年和1948年的三次奥运会。新中国首次派队参加了1952年在赫尔辛基的第15届奥运会。但不久,当时的时任国际奥委会主席布伦戴奇把台湾列入了国际奥委会所承认的各国奥委会名单之中,企图制造“两个中国”。中国多次抗议交涉无效,于1958年声明中断与国际奥委会的关系。从1946年起,国际奥委会执委会分别与冬、夏季国际单项体育联合会之间不定期举行联席会议;从1952年起,国际奥委会执委会与国家奥委会之间也不定期举行联席会议。1975年,中国奥委会要求国际奥委会恢复在奥林匹克运动中的合法代表权。1979年10月,国际奥委会通过《名古屋决议》,恢复了中国奥委会在国际奥委会的权利,确认中国为“中国奥委会”,使用中华人民共和国国旗和国歌;同时规定设在台北的奥委会为“中华台北奥委会”,使用“不同于其使用的旗、徽和歌”。会址设在台北的奥委会改名为“CHINESE TAIPEI OLYMPIC COMMITTEE”。大陆方面自此将“CHINESE TAIPEI”翻译为“中国台北”。何振梁于1981年和1985年当选为国际奥委会委员和执委会委员。1985年,国际奥委会启动奥林匹克全球伙伴计划(TOP计划),四年一期,实施TOP营销计划实施以来,这项收入不断攀升,并逼近电视转播权收入。1986年,国际奥委会授予中国奥委会奥林匹克杯,以表彰中国对发展中国家,特别是对非洲国家体育援助作出的巨大贡献。1989年8月,何振梁当选为国际奥委会副主席,这是中国人首次担任这个职务。 [5]  1993年,中国奥委会曾向国际奥委会提出了北京举办2000年奥运会的申请,但最后以2票之差而落选。1993年6月20日,国际奥委会执委会决定暂时承认马其顿为其成员。同年9月,巴勒斯坦被接受为临时委员。1993年9月,布隆迪、佛得角、科摩罗群岛、圣多美和普林西比、多米尼加等被接纳为新成员。1994年6月,瑙鲁加入国际奥委会。1994年8月29日至9月3日,第12届奥林匹克代表大会在巴黎召开,它也是现代奥林匹克运动恢复100周年的庆祝活动的一部分。参加本届大会的代表共有3427人,其中:国际奥委会委员和名誉委员101人;来自 48个国际单项体联的代表132人;来自191个国家或地区奥委会的代表407人;运动员代表67人;记者代表738人。在大会上发言的共达439人次。1995年7月,柬埔寨、几内亚比绍加入国际奥委会。1996年,国际奥委会与联合国粮农组织(FAO)签署了合作协议,双方愿采取积极具体措施为全球农村地区的人口谋取福利。国际奥委会与奔驰汽车公司就在6个非洲国家体育发展签订了一项耗资600万马克的“非洲奥林匹克计划”。1997年和1998年间,国际奥委会曾通过中国奥委会的协助,两次向朝鲜民主主义人民共和国体育界提供了食品援助。另外,国际奥委会还向巴塞罗那市签署合同,帮助重建萨拉热窝的扎特拉体育设施。1997年3月5日,国际奥委会同美国广播公司(NBC)签署了价值23亿美元电视转播权合同。根据协议,国际奥委会授予NBC在美国境内转播2004年奥运会、2006年冬奥会和2008年奥运会的权利,5月,国际奥委会和悉尼奥运会组委会共同与欧洲广播公司(EBU)签署了价值3.5亿美元的合同。另外,国际奥委会还制定了一项“奥林匹克计划”(TDP),利用五环标志和各国奥委会的会徽和名称进行市场销售。这一计划的实施,使得各国奥委会、尤其是发展中国家奥委会均能从中受益。 [6]  1997年7月3日,国际奥委会主席萨马兰奇宣布香港将以"中国香港"的名义参加奥运会。1998年12月,帕劳、厄立特里亚加入国际奥委会。1999年1月6日,中国奥委会全会在北京召开,决定由北京再次代表中国申办2008年第29届奥运会。1999年2月,国际奥委会在洛桑召开了世界反兴奋剂大会。大会通过了《洛桑宣言》,决定成立一个世界性的、独立的世界反兴奋剂组织(WADA)。国际奥委会承诺向该机构提供2500万美元的资金。1999年10月,在雅典召开的国际奥委会执委会决定:每四年在奥运会的发祥地举办一届世界青年节。2000年3月6日,国际奥委会在巴黎授予中国女子足球队“妇女和体育奖”。2001年7月,在第112届国际奥委会全会上,北京赢得了2008年奥运会主办权。在国际奥委会的倡议之下,2001年第56届联合国代表大会通过了一项由世界上170多个国家提出的题为“通过体育和奥林匹克理想来建立一个和平和更加美好的世界”的决议,呼吁在2002年盐湖城冬季奥运会期间实现“奥林匹克休战”。2003年7月,第115届国际奥委会全会于在布拉格召开,经过两轮投票,温哥华最后以56票胜出成为2010年第21届冬季奥运会举办城市。2004年,印度尼西亚的国际奥委会委员哈桑因涉嫌在一起建设工程中进行非法活动被判刑。同年8月他被赶出了国际奥委会。2005年,前国际奥委会副主席、韩国人金云龙被迫辞职。起因是他已经由于涉嫌韩国的体育-金钱腐败案件而被停职。为了避免被奥委会驱逐他不得不选择辞职。2004年,保加利亚国际奥委会委员伊万·斯拉夫科夫涉嫌腐败活动,被赶出了国际奥委会。2005年12月,国际奥委会委员,法国前体育部长和1976年蒙特利尔奥运会110米栏金牌得主德鲁特因为腐败案件被停职。 [7]  2006年15日,韩国籍国际奥委会委员朴永圣因为涉嫌挪用公款,已经被暂时剥夺了委员资格。国际奥委会在一份声明中说,在国际奥委会道德委员会对朴永圣调查期间,朴永圣“一切与国际奥委会委员资格有关的权利都将被暂时剥夺”。2011年7月8日,鉴于荷属安的列斯群岛已于2010年10月10日正式解散,国际奥委会第123次全会据此取消荷属安的列斯群岛的国家奥委会资格,同时批准了一系列相应措施,以尽可能保护该国运动员的利益,尤其是参与2012年伦敦奥运会的相关权益。 [8]  2013年9月9日,国际奥委会第125次全会在阿根廷首都布宜诺斯艾利斯投票选出了新一任的国际奥委会主席。最终来自德国的托马斯·巴赫从6名候选人中胜出,成为第九任国际奥委会主席,任期8年。上一任主席雅克·罗格退休。同时经过两轮投票,东京获得2020年夏季奥运会主办权。这是东京在1964年首次举办夏季奥运会后再获举办权。 [9]  2013年12月7日,国际奥委会主席巴赫表示,如果印度不能遵守奥林匹克反腐败规定将面临被开除会籍的下场。 [10]  2014年5月9日,国际奥委会发布公告,美国全国广播公司(NBC)与其签署了一份价值75亿美元的协议,获得了从2021到2032年间奥运会的独家转播权。协议还要求,NBC需另外支付1亿美元,用于2015至2020年间多项体育运动的推广。进入21世纪,NBC便一直独享奥运会转播权,其在2011年签署的一份文件就以44亿美元取得了从2014到2020年间历届奥运会的转播权。 [11]  2015年12月,国国际奥委会在官方网站正式宣布了反腐监督热线——这在历史上是前所未有的。决定将从2016年开始,对各国际体育组织实施财政和管理审计,审计将在第三方独立组织的主持下进行,包括国际奥委会和奥林匹克运动会组织委员会也包括在内。 [12]  2014年12月8日,在摩纳哥国际奥委会第127次全会表决了这一名为《奥林匹克2020议程》的改革提案,获全票通过(104名国际奥委会委员96人与会、8人缺席)。国际奥委会的奥运改革拉开序幕。全会同时投票,正式接纳科索沃奥委会成为其成员。 [13]  新的申办体系下,国际奥委会将变“申办”为“邀请”,申办城市可于邀请阶段与国际奥委会进行探讨,并需将承办奥运会融入其自身的发展规划中,而不是反向为之,国际奥委会甚至允许跨城、跨境联合申办,只不过巴赫称那须得是“特殊情况下的特事特办”。在新的奥运设项规则下,国际奥委会变大项基础制为小项基础制,不再将设项局限于28个大项,而是通过规定运动员、官员和小项的总数上限来实现规模控制,其中夏季奥运会的“帽”是10500名运动员、310个小项,冬奥会则为2900名运动员和100个小项。东道主将在增项议题上拥有更多主动权。 [14-15]  2015年7月31日,国际奥委会第128次全会在吉隆坡举行,经过85位国际奥委会委员的投票,国际奥委会主席巴赫宣布,北京获得2022年冬季奥运会举办权。北京成为首个同时主办夏季奥运会和冬季奥运会的城市,瑞士西南部城市洛桑则获得了2020年青冬奥会的举办权。 [16]  2015年8月2日,通过由国际奥委会所有协会成员参与的投票决定,南苏丹得到国际奥委会的最终认可,成为奥林匹克大家庭的最新成员,也就是第206名成员国。 [17]  2016年6月3日,国际奥委会发表公报宣布组成难民奥林匹克运动队,以迎接即将到来的里约奥运会。这支难民奥林匹克运动队由10名运动员组成,其中包括5名南苏丹难民、2名叙利亚难民、2名刚果(金)难民和1名埃塞俄比亚难民。他们将参加里约奥运会田径、游泳和柔道等项目的比赛。 [18]  全会同时表决通过了空手道、滑板、竞技攀岩、冲浪和棒垒球这5大项运动进入2020年东京奥运会的竞赛项目。 [19]  2017年7月11日,国际奥委会130届全会举行投票,一致决定2024年和2028年夏季奥运会的承办城市将同时产生,唯一的悬念是两个申办城市洛杉矶和巴黎谁先举办。 [20]  2019年6月23日,国际奥委会在瑞士洛桑举行国际奥委会新总部的揭幕。 [21] 
收起全文
精华内容
下载资源
问答
  • IOC的相关理解总结

    万次阅读 多人点赞 2020-04-20 13:54:07
    一、对IOC和DI的基本认识 (一)理解IoC,即“控制反转” (二)IoC具体做什么? (三)理解IoC和DI的关系 二、对IOC容器初始化的理解 四、对DI依赖注入的理解(主要是) 参考书籍、文献和资料 一、对IOC和DI...

    目录

    当前没有去添加对应的源码,只是自己的一些总结,可能理解有错误或不到位,还请指出。

    一、对IOC和DI的基本认识

    (一)理解IoC,即“控制反转”

    (二)IoC具体做什么?

    (三)理解IoC和DI的关系

    二、对IOC容器初始化的理解

    三、对DI依赖注入的理解

    参考书籍、文献和资料


    当前没有去添加对应的源码,只是自己的一些总结,可能理解有错误或不到位,还请指出。

    一、对IOC和DI的基本认识

    (一)理解IoC,即“控制反转”

    在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

    谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建以及外部资源获取(不只是对象包括比如文件等)

    为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转,依赖对象的获取被反转了

    (二)IoC具体做什么?

    IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

    • 传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;
    • 有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
    • IoC对编程实现由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找

    (三)理解IoC和DI的关系

    DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

    理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

    谁依赖于谁:当然是应用程序依赖于IoC容器;

    为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

    谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

    ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

    IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”

    二、对IOC容器初始化的理解

    IOC容器初始化的基本步骤主要是两个方面:

    • 初始化的入口由容器实现中的refresh()方法调用来完成。
    • 对Bean定义载入IOC容器使用的方法是loadBeanDefinition()。

    大致过程如下:

    • 通过ReasourceLoader来完成资源文件的定位,DefaultResourceLoader是默认的实现,同时上下文本身就给出了ResourceLoader的实现,可以通过类路径、文件系统、URL等方式来定位资源
    • 如果XmlBeanFactory作为IOC容器,那么需要为它指定Bean定义的资源,也就是说Bean定义文件是通过抽象成Resource来被IOC容器处理,容器通过BeanDefinitionReader来完成定义信息的解析和Bean信息的注册,往往使用XmlBeanDefinitionReader来解析Bean的XML定义文件---实际的处理过程是委托给BeanDefinitionParserDelegate来完成的,从而得到Bean的定义信息,这些信息在Spring中使用BeanDefinition来表示(这个名字可以让我们想到loadBeanDefinition()、registerBeanDefinition()这些相关的方法,他们都是为处理BeanDefinition服务的)。
    • 解析得到BeanDefinition以后,需要在IOC容器中注册,这由IOC实现BeanDefinitionRegister接口来实现,注册过程就是在IOC容器内容维护一个HashMap来保存得到的BeanDefinition的过程,这个HashMap是IOC容器持有Bean信息的场所,以后Bean的操作都是围绕这个HashMap来实现
    • 之后我们通过BeanFactory和ApplicationContext来享受Spring IOC的服务了,在使用IOC容器的时候我们注意到,除了少量粘合代码,绝大多数以正确IOC风格编写的应用程序代码完全不关心如何到达工厂,因为容器将把这些对象与容器管理的其他对象钩在了一起,基本的策略是把工厂放到已知的地方,最好放在对预期使用的上下文有意义的地方,以及代码要实际访问工厂的地方。
    • Spring本身提供了对声明式载入Web应用程序用法的应用程序上下文,并将其存储在ServletContext的框架实现中

    三、对DI依赖注入的理解

    当Spring IOC容器完成了Bean定义资源的定位、载入和解析注册,IOC容器就可以管理Bean定义的相关数据了,但是此时IOC容器还没有对所管理的Bean进行依赖注入,依赖注入 在以下两种情况下发生:

    • 用户第一次调用getBean()方法时,IOC容器触发依赖注入。
    • 当用户在配置文件中将<bean>元素配置了lazy-init=false属性时,即让容器在解析注册Bean定义时进行预实例化,触发依赖注入。

    Beanfactory接口定义了Spring IOC容器的基本功能规范,是Spring IOC容器所应遵守的最低层和最基本的编程规范。BeanFactory接口中定义了几个getBean()方法,用于用户向IOC容器索取被管理的Bean的方法,通过分析其子类的具体实现来理解Spring IOC容器在用户索取Bean时如何完成依赖注入

    • getBean方法肯定不陌生,必经之路,然后调用doGetBean,进来以后首先会执行transformedBeanName找别名,看你的Bean上面是否起了别名。然后进行很重要的一步,getSingleton,这段代码就是从你的单例缓存池中获取Bean的实例。那么你第一次进来肯定是没有的,缓存里肯定是拿不到的。也就是一级缓存里是没有的。那么它怎么办呢?他会尝试去二级缓存中去拿,但是去二级缓存中拿并不是无条件的,首先要判断isSingletonCurrentlyInCreation(beanName)他要看你这个对象是否正在创建当中,如果不是直接就退出该方法,如果是的话,他就会去二级缓存earlySingletonObjects里面取,如果没拿到,它还接着判断allowEarlyReference这个东西是否为true。它的意思是说,是否允许让你从单例工厂对象缓存中去拿对象。默认为true。好了,此时如果进来那么就会通过singletonFactory.getObject()去单例工厂缓存中去拿。然后将缓存级别提升至二级缓存也就早期暴露的缓存。
    • getSingleton执行完以后会走dependsOn方法,判断是否有dependsOn标记的循环引用,有的话直接卡死,抛出异常。比如说A依赖于B,B依赖于A 通过dependsOn注解去指定。此时执行到这里就会抛出异常。这里所指并非是构造函数的循环依赖。
    • beforeSingletonCreation在这里方法里,就把你的对象标记为了早期暴露的对象,提前暴露对象用于创建Bean的实例
    • 紧接着就走创建Bean的流程开始。在创建Bean之前执行了一下resolveBeforeInstantiation。它的意思是说,代理AOPBean定义注册信息但是这里并不是实际去代理你的对象,因为对象还没有被创建。只是代理了Bean定义信息,还没有被实例化把Bean定义信息放进缓存,以便我想代理真正的目标对象的时候,直接去缓存里去拿。
    • 接下来就真正的走创建Bean流程,首先走进真正做事儿的方法doCreateBean然后找到createBeanInstance这个方法,在这里面它将为你创建你的Bean实例信息(Bean的实例)。如果说创建成功了,那么就把你的对象放入缓存中去(将创建好的提前曝光的对象放入singletonFactories三级缓存中)将对象从二级缓存中移除因为它已经不是提前暴露的对象了。但是。如果说在createBeanInstance这个方法中在创建Bean的时候它会去检测你的依赖关系,会去检测你的构造器。然后,如果说它在创建A对象的时候,发现了构造器里依赖了B,然后它又会重新走getBean的这个流程,当在走到这里的时候,又发现依赖了A此时就会抛出异常。为什么会抛出异常,因为,走getBean的时候他会去从你的单例缓存池中去拿,因为你这里的Bean还没有被创建好。自然不会被放进缓存中,所以它是在缓存中拿不到B对象的。反过来也是拿不到A对象的。造成了死循环故此直接抛异常。这就是为什么Spring IOC不能解决构造器循环依赖的原因因为你还没来的急放入缓存你的对象是不存在的。所以不能创建。同理@Bean标注的循环依赖方法也是不能解决的,跟这个同理。那么多例就更不能解决了。为什么?因为在走createBeanInstance的时候,会判断是否是单例的Bean定义信息mbd.isSingleton();如果是才会进来。所以多例的Bean压根就不会走进来,而是走了另一段逻辑,这里不做介绍。至此,构造器循环依赖和@Bean的循环依赖还有多例Bean的循环依赖为什么不能解决已经解释清楚。然后如果说,Bean创建成功了。那么会走后面的逻辑。
    • 将创建好的Bean放入缓存,addSingletonFactory方法就是将你创建好的Bean放入三级缓存中,并且移除早期暴露的对象。
    • 通过populateBean给属性赋值,我们知道,创建好的对象,并不是一个完整的对象,里面的属性还没有被赋值。所以这个方法就是为创建好的Bean为它的属性赋值。并且调用了我们实现的的XXXAware接口进行回调初始化,然后调用我们实现的Bean的后置处理器,给我们最后一次机会去修改Bean的属性

    参考书籍、文献和资料

    1.https://www.iteye.com/blog/jinnianshilongnian-1413846

    2.《Sring 5 核心原理与30个类手写实战》,谭勇徳,中国公信出版社,2019.

    展开全文
  • SpringIoc 实现原理

    万次阅读 多人点赞 2019-04-20 16:44:33
    什么是SpringIOC spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合 “控制反转”,不是什么技术,而是一种设计思想...

    什么是SpringIOC

    spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合

    “控制反转”,不是什么技术,而是一种设计思想。

    在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

    ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

    ●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

    IOC实现原理

    使用反射机制+XML技术

    展开全文
  • IOC

    2018-05-28 15:47:13
    IOC 是什么?Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好...

    IOC 是什么?

    Ioc—Inversion of Control,即控制反转,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了,那我们来深入分析一下:

    谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

    为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

    用图例说明一下,传统程序设计如图2-1,都是主动去创建相关对象然后再组合起来:


    2-1 传统应用程序示意图

    当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图2-2所示:


    2-2IoC/DI容器后程序结构示意图

    IOC 能做什么?

    IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

    其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了主从换位的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

    IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:别找我们,我们找你;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

    IOC DI

    DI—Dependency Injection,即依赖注入:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

    理解DI的关键是:谁依赖谁,为什么需要依赖,谁注入谁,注入了什么,那我们来深入分析一下:

    谁依赖于谁:当然是应用程序依赖于IoC容器;

    为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

    谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

    注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

    IoCDI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:依赖注入,相对IoC 而言,依赖注入明确描述了被注入对象依赖IoC容器配置依赖对象

    展开全文
  • 浅谈IOC--说清楚IOC是什么

    万次阅读 多人点赞 2018-03-29 16:22:44
    什么是IOC3.IOC也叫依赖注入(DI)4.IOC的优缺点5.IOC容器的技术剖析6.IOC容器的一些产品7.参考博文本文旨在用语言(非代码)说清楚IOC到底是什么,没有什么高深的技术,园中的老牛、大虾们看到这里可以绕行了,以免浪费...

    转载自:http://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html

    https://segmentfault.com/a/1190000014803412

    1.IOC的理论背景

    2.什么是IOC

    3.IOC也叫依赖注入(DI)

    4.IOC的优缺点

    5.IOC容器的技术剖析

    6.IOC容器的一些产品

    7.参考博文

    本文旨在用语言(非代码)说清楚IOC到底是什么,没有什么高深的技术,园中的老牛、大虾们看到这里可以绕行了,以免浪费您宝贵的时间。IOC这个东西DebugLZQ早就想写了,但是出于对文章权威性的考虑(不能误人子弟- -!),本文主要内容来源于最近LZ看的一些国内外的关于IOC的博文、博问,所有引用到的文章,在参考博文中均已注明。

    1.IOC的理论背景

    我们知道在面向对象设计的软件系统中,它的底层都是由N个对象构成的,各个对象之间通过相互合作,最终实现系统地业务逻辑[1]。

      图1 软件系统中耦合的对象

      如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务。我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。

      齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。

      图2 对象之间的依赖关系

      耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson 1996年提出了IOC理论,用来实现对象之间的“解耦”,目前这个理论已经被成功地应用到实践当中。

    2.什么是IOC

      IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。

      1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。对于面向对象设计及编程的基本思想,前面我们已经讲了很多了,不再赘述,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。

      IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。如下图:

    图3 IOC解耦过程

      大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。

      我们再来做个试验:把上图中间的IOC容器拿掉,然后再来看看这套系统:

    图4 拿掉IOC容器后的系统

      我们现在看到的画面,就是我们要实现整个系统所需要完成的全部内容。这时候,A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫无联系,这样的话,当你在实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。所以,如果真能实现IOC容器,对于系统开发而言,这将是一件多么美好的事情,参与开发的每一成员只要实现自己的类就可以了,跟别人没有任何关系!

        我们再来看看,控制反转(IOC)到底为什么要起这么个名字?我们来对比一下:

        软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。

        软件系统在引入IOC容器之后,这种情形就完全改变了,如图3所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

        通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

    3.IOC也叫依赖注入(DI)

      2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

      所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。

      学过IOC的人可能都看过Martin Fowler(老马,2004年post)的这篇文章:Inversion of Control Containers and the Dependency Injection pattern[2]。

      博客园的园友EagleFish(邢瑜琨)的文章: 深度理解依赖注入(Dependence Injection)[3]对老马那篇经典文章进行了解读。

        CSDN黄忠成的Inside ObjectBuilder[4]也是,不过他应该来自台湾省,用的是繁体,看不管繁体中文的,可以看园中的吕震宇博友的简体中文版[]Object Builder Application Block[5] 。

    4.IOC的优缺点

     In my experience, IoC using the Spring container brought the following advantages[6]:

    • flexibility
      • changing the implementation class for a widely used interface is simpler (e.g. replace a mock web service by the production instance)
      • changing the retrieval strategy for a given class is simpler (e.g. moving a service from the classpath to the JNDI tree)
      • adding interceptors is easy and done in a single place (e.g. adding a caching interceptor to a JDBC-based DAO)
    • readability
      • the project has one unified and consistent component model and is not littered with factories (e.g. DAO factories)
      • the code is briefer and is not littered without dependency lookup code (e.g. calls to JNDI InitialContext)
    • testability
      • dependencies are easy to replace mocks when they're exposed through a constructor or setter
      • easier testing leads to more testing
      • more testing leads to better code quality, lower coupling, higher cohesion

      使用IOC框架产品能够给我们的开发过程带来很大的好处,但是也要充分认识引入IOC框架的缺点,做到心中有数,杜绝滥用框架[1]。

        第一、软件系统中由于引入了第三方IOC容器,生成对象的步骤变得有些复杂,本来是两者之间的事情,又凭空多出一道手续,所以,我们在刚开始使用IOC框架的时候,会感觉系统变得不太直观。所以,引入了一个全新的框架,就会增加团队成员学习和认识的培训成本,并且在以后的运行维护中,还得让新加入者具备同样的知识体系。

        第二、由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。如果你要追求运行效率的话,就必须对此进行权衡。

        第三、具体到IOC框架产品(比如:Spring)来讲,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本。

        第四、IOC框架产品本身的成熟度需要进行评估,如果引入一个不成熟的IOC框架产品,那么会影响到整个项目,所以这也是一个隐性的风险。

        我们大体可以得出这样的结论:一些工作量不大的项目或者产品,不太适合使用IOC框架产品。另外,如果团队成员的知识能力欠缺,对于IOC框架产品缺乏深入的理解,也不要贸然引入。最后,特别强调运行效率的项目或者产品,也不太适合引入IOC框架产品,像WEB2.0网站就是这种情况。

    5.IOC容器的技术剖析

      IOC中最基本的技术就是“反射(Reflection)”编程,目前.Net C#、Java和PHP5等语言均支持,其中PHP5的技术书籍中,有时候也被翻译成“映射”。有关反射的概念和用法,大家应该都很清楚,通俗来讲就是根据给出的类名(字符串方式)来动态地生成对象。这种编程方式可以让对象在生成时才决定到底是哪一种对象。反射的应用是很广泛的,很多的成熟的框架,比如象Java中的Hibernate、Spring框架,.Net中 NHibernate、Spring.Net框架都是把“反射”做为最基本的技术手段。

    6.IOC容器的一些产品

      Sun ONE技术体系下的IOC容器有:轻量级的有Spring、Guice、Pico Container、Avalon、HiveMind;重量级的有EJB;不轻不重的有JBoss,Jdon等等。Spring框架作为Java开发中SSH(Struts、Spring、Hibernate)三剑客之一,大中小项目中都有使用,非常成熟,应用广泛,EJB在关键性的工业级项目中也被使用,比如某些电信业务。

        .Net技术体系下的IOC容器有:Spring.Net、Castle等等。Spring.Net是从Java的Spring移植过来的IOC容器,Castle的IOC容器就是Windsor部分。它们均是轻量级的框架,比较成熟,其中Spring.Net已经被广泛应用于各种项目中。

      总之就是很多很多,不甚枚举.....

    7.参考博文

    [1] 架构师之路(39)---IoC框架 ,王泽宾,CSDN, 2009.

    [2] Inversion of Control Containers and the Dependency Injection pattern ,Martin Fowler,2004.

    [3] 深度理解依赖注入(Dependence Injection),EagleFish(邢瑜琨), 博客园, 2007.

    [4]Inside ObjectBuilder ,黄忠成, CSDN, 2006.

    [5][]Object Builder Application Block ,吕震宇,博客园, 2006.

    [6]link

    展开全文
  • Spring简介以及IOC详解

    万次阅读 2021-09-07 12:50:56
    【应用】能够独立完成springIOC的快速入门 【应用】能够掌握spring的bean标签的配置 【应用】能够独立完成bean的对象属性注入 【应用】能够独立完成bean的普通属性注入 【理解】能够独立完成bean的集合属性注入 1、...
  • 浅谈 IOC 什么是 IOC

    万次阅读 多人点赞 2019-05-27 14:19:26
    本文以文字为主题,并没有代码案例,仅限于记录自己对于 IOC 的理解,文中也啥特别高深的东西,大牛和大佬可以忽略本文,以免浪费您宝贵的时间 什么是 IOCIOC (Inversion Of Control,控制倒转),是spring...
  • IOC-源码

    2021-03-30 20:30:56
    IOC
  • IOC容器单例与多例

    万次阅读 2019-03-24 12:19:31
    IOC默认使用单例模式创建Bean,默认在spring容器启动时会自动创建对象。 @Lazy 懒加载:容器启动不创建对象,而在第一次使用Bean时创建对象,并初始化。 @Configuration public class MainConfig2 { @Lazy @...
  • IOC详解IOC详解IOC详解IOC详解IOC详解IOC详解IOC详解IOC详解
  • IoC对象实例IoC对象实例IoC对象实例
  • IOC之深入理解SpringIoC

    2021-02-24 23:36:52
    理解好它的关键在于我们需要回答如下四个问题:谁控制谁控制什么为何是反转哪些方面反转了在回答这四个问题之前,我们先看IOC的定义:所谓IOC,就是由SpringIOC容器来负责对象的生命周期和对象之间的关系上面这句话...
  • IoCIoC基础

    2019-06-02 19:33:22
    上文提到Spring的核心是IoC和AOP,今天开始学习核心之一的IoC,同样是带着IoC是什么,为什么,怎么用来学习IoC IoC是什么 先看看IoC的全名是什么。IoC——Inversion of Control,即“控制反转”。这个可不是什么技术...
  • Spring的IOC原理(通俗易懂)

    万次阅读 多人点赞 2018-04-06 19:52:46
    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由Ñ个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 如果我们打开机械式手表的后盖,就会看到与...
  • 【Spring-IOC基础】深入浅出Spring-IOC

    万次阅读 2020-04-20 16:20:03
    IOC(Inversion Of Control) 1.概念: 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency ...
  • Spring ioc Spring ioc

    2008-12-03 20:19:27
    Spring ioc Spring ioc
  • 【Spring】IOC理论推导、IOC本质

    万次阅读 2021-04-22 16:00:30
    1. IOC理论推导 1.UserDao接口 2. UserDaoImpl实现类 3. Userservice业务接口 4. UserserviceImpl业务实现类 在之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求取修改原代码!如果...
  • Spring IoC 演示
  • ioc4js IOC for Javascript 是一个非侵入式的依赖注入/控制反转框架,它借鉴了 Spring IoC
  • 其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC、DI以及Ioc容器等概念。通过本文我们将一起学习这些概念,并理清他们之间微妙的关系。对于大部分小菜来说,当听到大牛们高谈DIP、IoC、DI以及...
  • IOCDemo.rar

    2021-04-12 19:00:52
    IOC 学习
  • IOC详解

    2020-09-04 23:51:00
    IOC概念 什么是IOC: 控制反转,把对象创建和对象间的调用过程,交给Spring进行管理。 使用IOC可以降低耦合度。 IOC底层原理:XML解析,工厂模式,反射。 图解IOC底层原理: IOC思想基于IOC容器完成的,IOC容器...
  • 手写springIoC

    2021-03-19 14:05:44
    手写springIoC
  • spring_iocspring_ioc

    2011-10-19 09:09:39
    spring_iocspring_iocspring_iocspring_iocspring_iocspring_iocspring_iocspring_iocspring_ioc
  • IoCIoC容器基本原理

    千次阅读 2019-06-02 22:10:51
    上一篇学习了IoC的基础知识,明白了IoC是什么,为什么需要使用IoC以及IoC和DI的区别,接下来让我们继续往下学习IoC容器的基本原理。 IoC容器的概念 IoC容器就是具有依赖注入功能的容器,IoC具有负责实例化,定位,...
  • Spring_Ioc Description the ioc of Spring //英文有点蹩脚还是用中文来进行解释 spring_ioc的一个测试案例,主要是用来实现spring的控制反转机制(ioc),然后进行junit测试,详尽的写了几种xml的实例化方式(三种)
  • springIOC的简单实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 303,003
精华内容 121,201
关键字:

ioc