安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

Spring容器IOC解析

3月15日 顾昀汐投稿
  Spring有两大核心特性IOC和AOP,今天我们来聊的是IOC。相信很多同学每天都在使用Spring的IOC特性,但对其原理及实现理解比较模糊,那么今天就借助Spring容器实现原理,简单说说IOC。说到IOC就涉及到两个概念控制反转(InversionofControl)、依赖注入(DependencyInjection)。
  首先来看什么是控制反转
  在介绍控制反转之前呢我们看一段最早的代码PublicclassPersonServiceBean{PrivatePersonDaoBeanpersonDaonewPersonDaoBean();Publicvoidsave(Personperson){personDao。insert(person);}}
  PersonDaoBean是在应用内部创建及维护的。所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制反转权就由应用转到了外部容器,控制权的转移就是所谓反转。
  用Spring的写法:把依赖对象交给外部容器去负责PublicclassPersonServiceBean{PrivatePersonDaoBeanpersonD把容器创建好的对象依赖注入进PersonServiceBean,通过构造方法或set方法PublicPersonServiceBean(PersonDaoBeanpersonDao){this。personDaopersonD}或PublicvoidsetPersonDao(PersonDaoBeanpersonDao){this。personDaopersonD}Publicvoidsave(Personperson){personDao。insert(person);}}
  其次来看什么是依赖注入
  所谓依赖注入:就是在运行期间,由外部容器动态的将依赖对象注入到组件中。
  简单的说,Spring就是通过工厂反射将我们的bean放到它的容器中,当我们想用某个bean的时候,只需要调用getBean(beanId)方法。
  依赖注入的方式:
  第一。构造器注入;
  第二。set方法注入;
  第三。使用Field注入(用于注解方式)
  然后我们写一段简单的模拟Spring的代码来实现IOC容器
  思路:Spring容器的原理实现主要依赖于反射。过程其实就是通过解析xml文件,获取到用户配置的bean,然后通过反射将这些bean进行存储(放到集合中),然后对我提供一个getBean方法,以便我们获取到这些bean。下面是一段简单的模拟代码:packagecom。spring。importjava。util。HashMimportjava。util。Limportjava。util。Mimportorg。jdom。Dimportorg。jdom。Eimportorg。jdom。input。SAXBimportorg。jdom。xpath。XPpublicclassClassPathXmlApplicationContextimplementsBeanFactory{容器的核心,用来存放注入的BeanprivateMapString,ObjectcontainernewHashMapString,Object();解析xml文件,通过反射将配置的bean放到container中publicClassPathXmlApplicationContext(StringfileName)throwsException{SAXBuildersbnewSAXBuilder();Documentdocsb。build(this。getClass()。getClassLoader()。getResourceAsStream(fileName));Elementrootdoc。getRootElement();ListlistXPath。selectNodes(root,beansbean);扫描配置文件中的beanfor(inti0;ilist。size();i){Elementbean(Element)list。get(i);Stringidbean。getAttributeValue(id);Stringclazzbean。getAttributeValue(class);反射ObjectoClass。forName(clazz)。newInstance();container。put(id,o);}}OverridepublicObjectgetBean(Stringid){returncontainer。get(id);}}
  说明:首先声明一个存放bean的Map,然后通过jdom解析配置文件,循环遍历所有的节点,并通过反射将它们放到我们之前声明的Map中。然后提供一个getBean的方法,让我们可以通过beanId来获取到我们想要的bean。
  下面是一个简单的xml配置文件:?xmlversion1。0encodingUTF8?beansbeanidEclasscom。spring。factory。EnglandbeanidSclasscom。spring。factory。SpainbeanidPclasscom。spring。factory。Portugalbeans
  客户端通过调用前面的ClassPathXmlApplicationContext,来加载上面的配置文件,然后就可以通过Id来获得我们需要的bean了:packagecom。spring。publicclassTest{publicstaticvoidmain(String〔〕args)throwsException{加载配置文件BeanFactoryfnewClassPathXmlApplicationContext(applicationContext。xml);英格兰Objectoef。getBean(E);Teame(Team)e。say();西班牙Objectosf。getBean(S);Teams(Team)s。say();葡萄牙Objectopf。getBean(P);Teamp(Team)p。say();}}
  输出结果:England:我们是欧洲的中国队,不在乎这次小组没出线。。。Spain:我们是两届欧洲杯冠军、一届世界杯冠军!Portugal:我们的C罗一个顶十个!
  其它代码:工厂接口packagecom。spring。publicinterfaceBeanFactory{ObjectgetBean(Stringid);}Team接口packagecom。spring。publicinterfaceTeam{voidsay();}英格兰packagecom。spring。publicclassEnglandimplementsTeam{publicvoidsay(){System。out。println(England:我们是欧洲的中国队,不在乎这次小组没出线。。。);}}西班牙packagecom。spring。publicclassSpainimplementsTeam{Overridepublicvoidsay(){System。out。println(Spain:我们是两届欧洲杯冠军、一届世界杯冠军!);}}葡萄牙packagecom。spring。publicclassPortugalimplementsTeam{Overridepublicvoidsay(){System。out。println(Portugal:我们的C罗一个顶十个!);}}
  以上内容是对Spring的一个简单模拟,当然Spring远比这个要复杂的多,也强大的多,而且获取bean的方式也不止通过工厂这一种。这里只是做一个粗略的Demo说说对容器的简单理解,向Spring致敬。
  扩展,那么如果有property属性的bean该如何初始化呢?(依赖注入)
  如xml配置方式:bean有property属性,包含name和ref。
  这里提供思路,感兴趣的同学可以自行实现,也可参看spring的源码。
  思路:
  1。获取Bean的set方法setA反射
  2。获取Bean的声明的属性。equals(propertyDefine。getName())
  3。获取Bean的ref通过ref作为Key从Map中获取到实例对象
  4。setA。invoke(Bean,实例对象)反射
  整个原理大致分三步:
  1。读取xml文件
  2。实例化bean保存到map中
  3。为有property的Bean注入Bean0对象
  说了这么多,那么IOC有什么好处呢
  降低组件的耦合,使各层解耦。bean对象交于容器管理。
  小结
  相信读完此篇会对SpringIOC的概念和实现原理更加清晰。
  控制反转:就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器Spring负责。
  依赖注入:由外部容器Spring动态的将依赖对象注入到组件中。
  实现原理:JAVA反射机制。
投诉 评论 转载

房地产和互联网的结束,是细分领域的开始目前来说,国内的互联网形势不容乐观。我们的三大电商平台可以说是完全基于国内人口红利,但是人口红利结束之后,互联网企业将去往何方?其实,除了电商型互联网公司和腾讯之外,诸如……平价蓝牙耳机什么牌子好?老烧分享性价比高的蓝牙耳机推荐蓝牙耳机的便捷性让它迅速席卷市场,成为最热门的数码产品,但是很多朋友并不了解蓝牙耳机,有些还被坑过。不少朋友就问我平价蓝牙耳机什么牌子好?赵群作为发烧友对玩过diy,也买过很多……您能不能发一张你认为最美的风景照片?海南风景,自然,赏心悦目,美,我拍分享大家!洛阳是一个文明的旅游城市,洛阳不仅仅有甲天下的洛阳牡丹。有闻名遐迩的洛阳龙门石窟。古代还有许多皇帝在洛阳建都。洛阳是13朝古都……黑五大促借双十一预热,跨境电商用什么吸引消费者?对于国内消费者而言,购物节愈发常态化。为吸引消费者,跨境电商也逐步本土化。双11刚结束,黑五购物节又即将开始,各大跨境电商平台包括亚马逊海外购、抖音电商、京东国际、敦煌网……哪个小姐姐是假的?YannLeCun说合成人脸并不难分辨近日,测试人类分辨AI合成人脸能力的一个网页吸引了大家的关注。在未看攻略前,也许你也难以分辨真假。自2018年12月英伟达推出StyleGAN以来,合成人脸已经让人难以轻……部署云探针,配置轻量级监控系统先来看一下效果图:1。背景当个人有很多vps或者云服务器的时候,除了管理之外,监控系统的各项服务也是一件重要的事,最好监控系统能够一目了然的知道系统的整体情况,能够……北京真无人车合法上路,百度小马获取首批牌照今日,北京发放无人化载人示范应用通知书,小马、百度成为首批被允许主驾位无安全员、副驾有安全员的无人车商业化试点品牌,这意味着Robotaxi距离真正无人化运营又迈出了一大步。……中国移动老用户须知,这几类号码将无法办理携号转网,望周知我们都知道,国内的手机用户,基本上都是移动、联通、电信的用户,虽然像是广电、英国电信等运营商,也成功挂牌,但它们想要撼动中国三大通信运营商的地位,基本上是不太现实的,截至目前为……联想事件出现反转了吗?司马南先生敢于站出来维护国有资产,就值得点赞!鲁迅先生批的人血馒头现象不能再现了!无论联想事件的结果如果,我都支持司马南老师!!!因为司马南老师不为钱、色动心,不向恶势力……刘强东章泽天成立私募公司!什么是私募公司?昨日,刘强东夫妇成立了一家名为海南三亚天博产业私募基金管理有限公司的私募公司,天眼查显示该公司注册资本1000万人民币,目前该公司由刘强东、章泽天、李瑞玉共同持股。其中,章泽天……Spring容器IOC解析Spring有两大核心特性IOC和AOP,今天我们来聊的是IOC。相信很多同学每天都在使用Spring的IOC特性,但对其原理及实现理解比较模糊,那么今天就借助Spring容器……阿里最近又出事了,这可不是在危言耸听啊阿里最近又出事儿了啊,这次的事情可能比之前垄断被罚的182亿事情更大,堪称是全世界有史以来最大的计算机安全漏洞。10月24号,阿里云在阿帕奇加了日志组件中发现了一个重大的安全漏……
人死能复生,会怎样?互金协会等三协会防范NFT相关金融风险,坚决遏制NFT金融化英特尔致信供应商称禁用新疆产品企业请专职SEO和外包给科技公司做优化,有什么不同?10后的孩子将来工作好找吗?绝不能让中国芯片供应自主计划得逞?上架不到一周,华为新机遭下架,方法堵死了?人民日报狠批通信套餐乱象,升级易降档难。这适用于反垄断法吗?把握数字贸易弯道超车新机遇区块链和智能合约,知识体系全汇总,学习指南来了红米k50系列包揽联发科和高通共四款芯片,卢伟冰你选吧豪威科技明年晶圆代工投片量将缩减5万片月?这应该只是个谣言

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利