保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

不懂控制反转么?大白话讲清楚spring中这些晦涩的概念

  前面介绍了spring环境的搭建,在搭建spring环境的时候分为java环境和javaWeb环境,在javaWeb环境下通常会结合springMVC使用,在java项目中只需要把spring的包导入工程中,一般初学者会把所有的包全部导入,然后就可以通过获得applicationContext,把类的实例化交给spring管理,然后从spring容器中获得类的实例。
  spring中有控制反转(Ioc)和依赖注入(DI)两个概念,Ioc和DI是spring的核心概念,同时也是一种新的编程思想。
  控制反转(Ioc)
  控制反转,顾名思义就是控制权的改变,在没有接触spring之前,我们要使用一个类的实例,必须使用new的方式生成一个对象,这个过程的主动权掌握在程序员亦自己写的程序中,但是使用了spring之后,实例的创建不再由程序员手动实现,而是由spring容器来完成,实现了控制的反转,即主动权交给了spring的IOC容器。
  依赖注入(DI)
  一个类包括属性和方法,在创建了实例对象之后,或者在创建实例对象的同时,需要初始化成员变量(属性),在spring之前成员变量的初始化可以通过构造方法或setXXX方法;在spring出现之后,由于实例的创建交给了spring的IOC容器,那么成员变量的初始化也依赖于IOC容器,由容器去注入成员变量的值。
  上面介绍了IOC和DI两个概念,可以得出IOC和DI其实是在做一件事,就是spring的IOC容器创建实例对象,一切对象的实例化都交给了spring容器,在程序中不必手动使用new的方式实例化变量。
  spring提供两种不同的方式来配置spring,一种是配置文件(XML),另一种是基于注解(Annotation)。下面针对IOC和DI使用两种方式一一做介绍
  在介绍之前必须了解如何在java项目中获得spring容器,也即ApplicationContext。ClassPathXmlApplicationContextcpacnewClassPathXmlApplicationContext(classpath:applications。xml);
  获取ApplicationContext的方式有三种,这里使用的ClassPathXmlApplicationContext,ClassPathApplicationContext是ApplicationContext的子类,这里的cpac就是spring的IOC容器,通过它的getBean()方法可以获得容器中已经初始化的实例。
  配置文件(XML)
  假如我们有下面的学生类(student)packagecom。cn。study。day1;publicclassStudent{privateStringid;privateStringname;privateStringage;publicStringgetId(){returnid;}publicvoidsetId(Stringid){this。idid;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this。namename;}publicStringgetAge(){returnage;}publicvoidsetAge(Stringage){this。ageage;}OverridepublicStringtoString(){returnStudent〔idid,namename,ageage〕;}在有了有参的构造函数,必须要提供一个无参构造publicStudent(Stringid,Stringname){this。idid;this。namename;}无参构造publicStudent(){}publicvoidinit(){System。out。println(我正在初始化!);}publicvoiddestroy(){System。out。println(我将要被销毁了,。再见!);}}
  此类有三个属性id、name、age,下面通过配置文件的方式,在spring的配置文件中配置,beanidstudentclasscom。cn。study。day1。Studentpropertynameidvalue1propertypropertynamenamevalue测试propertypropertynameagevalue23propertybean
  在spring的配置文件中配置标签,id属性在配置文件中必须唯一,class属性指定类的权限类名,下面有标签,指定Student的三个属性,且指定了属性值,测试结果如下,Student〔id1,name测试,age23〕
  这里可以看到输出了配置的值,这种方式是使用属性注入的方式,要求必须有setXXX方法,还有另外一种方式,通过构造方法的方式注入,!构造方法注入beanidstudent2classcom。cn。study。day1。Studentinitmethodinitdestroymethoddestroyconstructorargnameidvalue2constructorargconstructorargnamenamevaluetest2constructorargbean
  既然是通过构造方法的方式注入,那么在Student类中必须要有这个构造方法,在上面的Student类中已经有了有参的构造方法,我们知道在自定义了有参的构造方法之后,系统不会再默认的提供无参构造,我们还必须添加无参构造,下面看测试结果,Student〔id2,nametest2,agenull〕
  由于我们只注入了id、name两个属性,这里可以打印出,age由于未赋值且其类型为String,则默认为null。
  上面是通过配置文件的方式,配置了根据属性、构造方法注入的方式,这个例子是比较简单的,下面看一个复杂的例子,在程序中经常会采用分层、面向接口编程的思绪,
  DAO接口packagecom。cn。study。day1。inter;publicinterfacedbDAO{一个简单的dao层的保存接口publicvoidsave(Stringstr);}
  service接口packagecom。cn。study。day1。inter;publicinterfaceServiceInter{service层的保存方法publicvoidsave(Stringstr);}
  DAO实现类packagecom。cn。study。day1。inter。impl;importcom。cn。study。day1。inter。dbDAO;publicclassDbDAOImplimplementsdbDAO{Overridepublicvoidsave(Stringstr){TODOAutogeneratedmethodstubSystem。out。println(str,我会执行数据插入操作!你会吗?);}}
  service实现类packagecom。cn。study。day1。inter。impl;importcom。cn。study。day1。inter。ServiceInter;importcom。cn。study。day1。inter。dbDAO;publicclassServiceImplimplementsServiceInter{DAO接口对象privatedbDAOdbDAO;setXXX方法publicvoidsetDbDAO(dbDAOdbDAO){this。dbDAOdbDAO;}Overridepublicvoidsave(Stringstr){TODOAutogeneratedmethodstubif(str!null!。equals(str)){dbDAO。save(str);System。out。println(执行完了DAO层的方法,我是service层的方法!);}}}
  在service的实现类中有一个DAO层的接口对象,我们下面看这种是如何根据属性注入的,!下面是一个复杂的属性注入的例子beaniddbDaoclasscom。cn。study。day1。inter。impl。DbDAOImplbean!下面的这个类,有一个dbDAO的属性,需要进行属性注入,必须提供一个set方法beanidserviceclasscom。cn。study。day1。inter。impl。ServiceImplpropertynamedbDAOrefdbDaopropertybean
  首先,配置DAO层的bean,这里的class属性必须配置其实现类,然后配置service的实现类,在ServiceImpl中有一个dbDAO类型的属性,使用ref属性引用上面的bean。测试结果如下,我是测试方法,我会执行数据插入操作!你会吗?执行完了DAO层的方法,我是service层的方法!
  ref属性可以引用spring配置文件中的bean,使用id的值。
  通过上面的介绍,可以知道使用配置文件这种方式可以很方便的配置,但是当需要配置的类很多,且依赖很多的情况下,这种方式会很繁琐,那么另外一种方式便派上了用场。
  注解(Annotation)
  spring提供Component、Repository、Controller、Service四种注解,其实,只使用Component一个便可以做到,Repository、Controller、Service只是针对不同的层设置的,可以更加明显,Repository对应DAO层,Controller对应控制层,Service对应服务层,使用这三个注解可以明显的分层,使系统容易理解,也可以只使用Component。
  使用了注解需要开启组件自动扫描机制,在spring的配置文件中开启组件自动扫描机制,需要context命名空间的支持,下面是一个配置文件的例子,lt;?xmlversion1。0encodingUTF8?beansxmlnshttp:www。springframework。orgschemabeansxmlns:xsihttp:www。w3。org2001XMLSchemainstancexmlns:aophttp:www。springframework。orgschemaaopxmlns:txhttp:www。springframework。orgschematxxmlns:contexthttp:www。springframework。orgschemacontextxsi:schemaLocationhttp:www。springframework。orgschemabeanshttp:www。springframework。orgschemabeansspringbeans3。0。xsdhttp:www。springframework。orgschematxhttp:www。springframework。orgschematxspringtx3。0。xsdhttp:www。springframework。orgschemaaophttp:www。springframework。orgschemaaopspringaop3。0。xsdhttp:www。springframework。orgschemacontexthttp:www。springframework。orgschemacontextspringcontext3。0。xsd!spring自动检测context:componentscanbasepackagecom。cn。study。day1beans
  在spring配置文件的头部添加context命名空间的支持,然后使用标签开启组件扫描,basepackage属性指定扫描的基包,此包及此包下的子包都会进行扫描。开启了组件扫描之后,还需要自动注入,网上有说需要:,其实前面的组件扫描已经包含了此标签的作用,为此不需要配置此标签了,自动注入默认根据类型(byType)进行注入,还有根据名字注入(byName)即bean中id的值,还有根据构造方法注入(constructor)。自动注入需要Aotuwired注解,此注解可以放在属性上,也可以放在setXXX方法上,放在属性上则可以省略setXXX方法,下面是具体的例子packagecom。cn。study。day1;importorg。springframework。stereotype。Component;Component(su)publicclassStudentAnnotation{publicvoidprint(){System。out。println(我是使用注解生成的类!);}}
  在类上使用Component注解,且指定了实例的名为su,如果不指定则默认为类名称首字母小写,即studentAnnotation。
  下面是一个自动扫描和自动注入的例子,packagecom。cn。study。day1。inter。impl;importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。stereotype。Service;importcom。cn。study。day1。inter。ServiceInter;importcom。cn。study。day1。inter。dbDAO;ServicepublicclassServiceImplimplementsServiceInter{DAO接口对象AutowiredprivatedbDAOdbDAO;setXXX方法publicvoidsetDbDAO(dbDAOdbDAO){this。dbDAOdbDAO;}Overridepublicvoidsave(Stringstr){TODOAutogeneratedmethodstubif(str!null!。equals(str)){dbDAO。save(str);System。out。println(执行完了DAO层的方法,我是service层的方法!);}}}
  类上使用了Service注解,属性上使用了Autowired注解,这时setDbDAO()方法可以不要。Autowired注解就是为了省略setXXX方法的,Autowired注解默认使用的按照类型注入,如果存在多个相同类型的实例,这里自动注入会失败,为了可以正确注入,引入另外一个注解Qualifier(value),此注解的value属性可以指定一个bean的id值,做到自动注入。
  Qualifier可以用在属性或者setXXX方法上。
  综上,通过配置文件和注解两种方式介绍了依赖注入。

又是一年中秋初中作文400字又是一年中秋!人们都说中秋节是团圆节,又是一年中秋初中生作文。真的是这样吗?也许吧!有些人能在这个节日里团圆,但我不能。我只能孤独地行走于这月光之下。独自站在……那微笑给了我温暖作文微笑,是生活的食粮,清新的空气吗?或许是。老师、亲人信任的微笑,朋友友情的微笑,陌生人和蔼可亲的微笑都可以牵动着你的心。小编收集了那微笑给了我温暖作文,欢迎阅读。第一篇:……美妙的中秋节作文(精选5篇)无论是身处学校还是步入社会,大家都写过作文吧,作文是由文字组成,经过人的思想考虑,通过语言组织来表达一个主题意义的文体。那么你知道一篇好的作文该怎么写吗?下面是小编整理的美妙的……我心爱的小狗作文五篇我心爱的小狗,我向天大喊,我喜欢你,不能离开你,即使你走到天涯海角,我也要找到你!下面是小编收集整理的我心爱的小狗作文五篇,希望对您有所帮助!篇1:我心爱的小狗我心爱的小……也是一堂语文课语文只是一个没有主题的事物,但它恰恰是许多中学生头疼的事。往小的方面说,语文只是一个普通的课本,而往大了说,生活中处处充满了语文。要想学好语文,就必须培养对语文的兴趣。每……难忘的一件事作文作文600字一件令人害怕的事编者按:回想起这件难忘的事,让我既感到温暖又感到害怕。下面我们一起看看这篇《一件令人害怕的事》。一件怎么样的事呢?一件难忘的事,回想起来,我是既感到温暖又感到害怕。……美丽中秋节的日记400字中秋的月光美丽中秋节的日记400字:中秋的月光一轮金黄的圆月已经高高地挂在天空中,向地上洒下皎洁的月光,像轻纱似的一般温柔。天空中云很淡,风很轻,月光很美,这构成了一幅漂亮的画。在……08年上海中考优秀作文我眼中的色彩之八凭窗远眺,我的眼前万紫千红。风轻轻拂过,和着夏的炎热,掺着花草的清新,扬起我缕缕青丝时,告诉我,我眼中的色彩是青春,我的青春色彩变幻。勤绿色为木则荣,为草则绿……奶奶的生日作文300字今天奶奶生日,姑姑,爸爸,妈妈和奶奶的朋友都会来给奶奶过生日,一下来这么多人肯定很热闹。一大早,奶奶吃完早餐后,就忙着准备今天中午的菜。临近中午的时候,爸爸,妈妈,还有奶……中学生外婆作文导语:我的外婆性格温和,她很少批评我,希望我快乐的成长。下面是小编整理的一些关于外婆的优秀作文,欢迎查阅!篇一:我的外婆我有一位心地善良、勤快好乐、言传身教的好外婆,在我……学校还挺好自从上学以来,就一直盼望着有个长长的假期,最好一直都不开学,这样我就可以每天都睡懒觉,玩游戏,还不用写作业。我知道这只不过是一个幻想而已没想到今年的疫情却帮我实现了这一愿……渐渐明白初中作文渐渐明白了父爱我的父亲比我高一个头。戴着一副眼镜,可就是一个这么平凡的人,对我有着不平凡的爱。那年,我暑假去北京姨妈家玩。独自一个人,我卷着身子,靠在后车座里。背着……
数科日报丨腾讯拟收购手机厂商黑鲨俞敏洪回应新东方辞退员工01丨腾讯拟收购小米系手机厂商黑鲨腾讯拟收购游戏手机公司黑鲨科技,收购后,黑鲨整体将并入任宇昕主导的腾讯集团平台与内容事业群(PCG)。一旦交易完成,这家以游戏手机为主的……介绍秦兵马俑的作文兵马俑,即秦始皇兵马俑,亦简称秦兵马俑或秦俑,第一批全国重点文物保护单位,第一批中国世界遗产,位于今陕西省西安市临潼区秦始皇陵以东1。5千米处的兵马俑坑内。以下是小编收集的关于……爱有摩尔质量吗高三作文世间的物质千千万,而组成物质的元素现已知道的不过百十种!然而每一种元素都有自己的摩尔质量,它体现了组成物质的元素在这个世界的份与量!每到这里,我都会问自己:世间的爱有摩尔质量吗……感受日全食失落今天嘛,7月22日。本世纪最为壮观的日全食在亚洲上演了,上海本应也是最佳观测点之一了啦,可是,天公呀,不作美。其实,在昨天,我就在电视上看到一些气象专家们预测今天上海可能……挫折的记叙文作文700字生活中每个人在遇到挫折时,面对它的做法和态度都各有不同。下面是小编为大家精心整理的关于挫折的记叙文作文700字,希望能够帮助到你们。挫折如果你十分珍爱自己的羽毛,不……观看护城河护城河,河长大约七公里,河宽大约二米,水深深不可测。今天我就来观赏护城河。当太阳从东方升起,护城河里的水总是那么平静。当阳光普照河水,河水就红丹丹的,仿佛那是一块红光发亮……自然景观优秀作文范文8篇【篇一:秋天的景象】秋天,果实累累,景色宜人,水果们穿起了美丽的衣服在开晚会呢!在秋天里,梨子、苹果、柿子你挤我碰都争着要别人去摘呢!田野里农民伯伯在聚精会神的收割稻谷,……致逝去的初中E度网专稿未经允许不得转载三年岁月年华,依旧怀念青春。你们做过摩天轮么?在夜晚时特别的美丽。很遗憾的是我只在白天享受过,就像遗憾那逝去的三年。三年记忆点点滴滴……作文我喜欢的动物小狗你喜欢什么动物呢?小狗你是否喜欢呢?以下是小编收集的关于《作文我喜欢的动物小狗》,仅供大家阅读参考!作文我喜欢的动物小狗你们知道吗?在大妈家里有一只可爱的小狗。它全身长着……三年级期末考试作文会飞的母鸡森林里有一只母鸡,它不像别的母鸡那样寻找食物或孵小鸡,它的理想是有朝一日能够飞上天空。它在森林里飞,在草地上飞,可是怎么样也飞不起来。其它的母鸡都嘲笑它:母鸡想飞?真是天……中秋节初三随笔作文8篇中秋节初三随笔作文1适逢中秋之夜,我仰望天空,望见一轮圆月,但不是我们常说的一轮皎洁的圆月,天空中有层层清云,如烟似雾,弥蒙在月光下。月晕恰恰是这圆月与清云的红娘,牵于二……感恩亲情作文600字亲情就在我们身边,等着我们去挖掘,让我们人人做一个有心人,去努力品味身边的亲情,丰富多姿多彩的人生。下面是小编为大家带来的感恩亲情作文600字,希望对大家有帮助!作文一:……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网