植物百科网
当前位置: 首页 农业百科

什么是springioc容器及其优点(Spring容器IOC解析)

时间:2023-07-21 作者: 小编 阅读量: 1 栏目名: 农业百科

什么是springioc容器及其优点Spring有两大核心特性IOC和AOP,今天我们来聊的是IOC。相信很多同学每天都在使用Spring的IOC特性,但对其原理及实现理解比较模糊,那么今天就借助Spring容器实现原理,简单说说IOC。说到IOC就涉及到两个概念控制反转、依赖注入。所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。

什么是springioc容器及其优点?Spring有两大核心特性 IOC和AOP,今天我们来聊的是IOC相信很多同学每天都在使用Spring的IOC特性,但对其原理及实现理解比较模糊,那么今天就借助Spring容器实现原理,简单说说IOC说到IOC 就涉及到两个概念控制反转(Inversion of Control)、依赖注入(Dependency Injection),下面我们就来聊聊关于什么是springioc容器及其优点?接下来我们就一起去了解一下吧!

什么是springioc容器及其优点

Spring有两大核心特性 IOC和AOP,今天我们来聊的是IOC。相信很多同学每天都在使用Spring的IOC特性,但对其原理及实现理解比较模糊,那么今天就借助Spring容器实现原理,简单说说IOC。说到IOC 就涉及到两个概念控制反转(Inversion of Control)、依赖注入(Dependency Injection)。

首先来看什么是控制反转

在介绍控制反转之前呢我们看一段最早的代码

Public class PersonServiceBean{ PrivatePersonDaoBeanpersonDao=newPersonDaoBean();Publicvoidsave(Personperson){personDao.insert(person);}}

PersonDaoBean 是在应用内部创建及维护的。所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制反转权就由应用转到了外部容器,控制权的转移就是所谓反转。

用Spring的写法:把依赖对象交给外部容器去负责

Public class PersonServiceBean{ PrivatePersonDaoBeanpersonDao;//把容器创建好的对象依赖注入进PersonServiceBean,通过构造方法或set方法PublicPersonServiceBean(PersonDaoBeanpersonDao){this.personDao=personDao;}或PublicvoidsetPersonDao(PersonDaoBeanpersonDao){this.personDao=personDao;}Publicvoidsave(Personperson){personDao.insert(person);}}

其次来看什么是依赖注入

所谓依赖注入:就是在运行期间,由外部容器动态的将依赖对象注入到组件中。

简单的说,Spring就是通过工厂 反射将我们的bean放到它的容器中,当我们想用某个bean的时候,只需要调用 getBean("beanId")方法。

依赖注入的方式:

第一.构造器注入;

第二.set方法注入;

第三.使用Field注入(用于注解方式)

然后我们写一段简单的模拟Spring的代码来实现IOC容器

思路:Spring容器的原理实现主要依赖于反射。过程其实就是通过解析xml文件,获取到用户配置的bean,然后通过反射将这些bean进行存储(放到集合中),然后对我提供一个getBean方法,以便我们获取到这些bean。下面是一段简单的模拟代码:

package com.spring.factory;import java.util.HashMap;import java.util.List;import java.util.Map;import org.jdom.Document;import org.jdom.Element;import org.jdom.input.SAXBuilder;import org.jdom.xpath.XPath;public class ClassPathXmlApplicationContext implements BeanFactory {//容器的核心,用来存放注入的Beanprivate Map<String, Object> container = new HashMap<String, Object>();//解析xml文件,通过反射将配置的bean放到container中public ClassPathXmlApplicationContext(String fileName) throws Exception {SAXBuilder sb = new SAXBuilder();Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream(fileName));Element root = doc.getRootElement();List list = XPath.selectNodes(root, "/beans/bean");//扫描配置文件中的beanfor (int i = 0; i < list.size(); i) {Element bean = (Element) list.get(i);String id = bean.getAttributeValue("id");String clazz = bean.getAttributeValue("class");//反射Object o = Class.forName(clazz).newInstance();container.put(id, o);}}@Overridepublic Object getBean(String id) {return container.get(id);}}

说明:首先声明一个存放bean的Map,然后通过jdom解析配置文件,循环遍历所有的节点,并通过反射将它们放到我们之前声明的Map中.然后提供一个getBean的方法,让我们可以通过beanId来获取到我们想要的bean。

下面是一个简单的xml配置文件:

<?xmlversion="1.0" encoding="UTF-8"?><beans><bean/><bean/><bean/></beans>

客户端通过调用前面的ClassPathXmlApplicationContext,来加载上面的配置文件,然后就可以通过Id来获得我们需要的bean了:

packagecom.spring.factory;publicclass Test {publicstatic void main(String[] args) throws Exception {//加载配置文件BeanFactory f = newClassPathXmlApplicationContext("applicationContext.xml");//英格兰Object oe =f.getBean("E");Team e = (Team)oe;e.say();//西班牙Object os =f.getBean("S");Team s = (Team)os;s.say();//葡萄牙Object op =f.getBean("P");Team p = (Team)op;p.say();}}

输出结果:

England:我们是欧洲的中国队,不在乎这次小组没出线...Spain:我们是两届欧洲杯冠军、一届世界杯冠军!Portugal:我们的C罗一个顶十个!

其它代码:

//工厂接口package com.spring.factory; publicinterface BeanFactory {Object getBean(String id);}//Team接口package com.spring.factory; publicinterface Team {void say();} //英格兰packagecom.spring.factory;publicclass England implements Team{ public void say() {System.out.println("England:我们是欧洲的中国队,不在乎这次小组没出线...");}} //西班牙packagecom.spring.factory;publicclass Spain implements Team{ @Overridepublic void say() {System.out.println("Spain:我们是两届欧洲杯冠军、一届世界杯冠军!");}} //葡萄牙packagecom.spring.factory;publicclass Portugal implements Team { @Overridepublic void say() {System.out.println("Portugal:我们的C罗一个顶十个!");}}

以上内容是对Spring的一个简单模拟,当然Spring远比这个要复杂的多,也强大的多,而且获取bean的方式也不止通过工厂这一种。这里只是做一个粗略的Demo说说对容器的简单理解,向Spring致敬。

扩展,那么如果有 property属性的bean该如何初始化呢?(依赖注入)

如xml配置方式:<property name="dataSource" ref="datas"/> 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对象交于容器管理。

小结

相信读完此篇会对Spring IOC的概念和实现原理更加清晰。

控制反转:就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器Spring负责。

依赖注入:由外部容器Spring动态的将依赖对象注入到组件中。

实现原理:JAVA反射机制。

    推荐阅读
  • 突触名词解释(突触是什么意思)

    突触名词解释突触是指一个神经元的冲动传到另一个神经元或传到另一细胞间的相互接触的结构。突触是神经元之间在功能上发生联系的部位,也是信息传递的关键部位。在光学显微镜下,可以看到一个神经元的轴突末梢经过多次分支,最后每一小支的末端膨大呈杯状或球状,叫做突触小体。这些突触小体可以与多个神经元的细胞体或树突相接触,形成突触。从电子显微镜下观察,可以看到,这种突触是由突触前膜、突触间隙和突触后膜三部分构成。

  • 《守望先锋》对战局影响大招top一览 守望先锋对局战绩

    今天小编要为大家带来的是玩家“黑呦酱”分享的《守望先锋》对战局影响大招top一览,感兴趣的玩家赶紧一起来看看吧!守望先锋大招分为四类,控制类,自身BUFF类,辅助类以及伤害类,由于伤害类大部分使用大招时,本体无法进行有效杀伤,且控制类及自身BUFF类需要其他技能的配合,so,此间因素也要加入考量。

  • 运动后喝黑咖啡还能燃脂吗 运动时喝黑咖啡会加快燃脂吗?

    2、运动过程中身体脂肪会加速燃烧,从而具有一定减肥作用;而黑咖啡热量比较小,加上其中含有大量的咖啡因以及维生素、纤维素物质,适量喝可以促进人体肠胃蠕动,加速脂肪代谢分解,对减肥具有促进作用。

  • 斯威汽车质量怎么样(斯威质量好不好)

    2018年6月起,斯威“品质特工队”以四大火炉的重庆作为起点,途径海南、吐鲁番、格尔木三地,历时近一年进行了数十万公里极限环境适应性试验。极端干燥高温环境下,常见车内温度往往会狂飙到60℃以上,而在斯威G01的车厢里,却始终能够保持清新凉爽的状态。一整套严酷考验下来,斯威G01的性能表现完全得以充分认证。这样一算,斯威G01差不多完成了近百万公里的专业级严酷考验。

  • 春天兰花怎么养 春天兰花怎么养浇水

    白墨兰花哪个品种最好白墨兰花是墨兰的珍贵变异品种假鳞茎椭圆形,已有数百年栽培历史,流传至今,不下十数个品种,它叶色莹润、体态优雅、幽香静远、且抗病,白墨兰花比较好的品种一般分企剑和软剑两个品系。什么兰花开花最香兰花品种很多,按花香来排,在兰花界春兰居首,惠兰次之,随后便是建兰、墨兰和寒兰,春兰的花香味最正宗,持久性也极强。

  • 奔驰e300l前进挡总共有几个(你看了奔驰22款E300L升级这套原厂HUD抬头显示效果觉得怎么样)

    从行车安全的角度来考虑,加装一台HUD是非常有必要的。HUD的全称是HeadUpDisplay,中文翻译过来就是抬头显示器。今天星骏汇小陈通过以上的产品配件图了解,我们看到这台奔驰22款E300L升级HUD抬头显示所需要更换的配件有,抬显仪器,高配仪表盖板,高配仪表电脑,雨量传感器,空调管升级HUD抬头显示把仪表台上的那一块盖板换掉,换成高配的预留好显示器孔位的盖板,装上显示器,从而使仪表显示的内容投射到挡风玻璃上面。

  • 儿童葫芦丝表演(通城千人共奏葫芦丝)

    儿童葫芦丝表演香城都市报讯 10月27日,通城县隽水中学参加湖北省“黄鹤杯”美育节节目视频录制现场,七、八年级千名学生,同奏乐曲《龙的传人》。该校相关负责人介绍,本学期,每天下午预备铃响5分钟,七、八年级各班集体合奏葫芦丝。丝竹声声,已渐成校园一道靓丽的风景线。近年来,该校贯彻落实社会主义核心价值观,注重未成年人思想道德建设,坚持开设中华传统和特色民族特色教育课程,促进学生“德智体”全面发展。

  • 鸡娃时代孩子的成长之道(与其1岁就开始鸡娃)

    出生时大脑发育已经完成25%,1岁完成了50%,3岁完成了60%,6岁达到90%。现在小学虽然是零基础入学,取消了统一考试,但是它对学生的要求并没有降低。吃够了佛系养娃的亏,橙子家的老二断然不肯再佛系养了。北京卫视于2018年摄制的纪录片《起跑线》中,有一个7岁的北京女孩令人印象深刻。她的家庭,在北京三环内有一套房,一辆车。妈妈认为,孩子从小培养兴趣,靠的是父母的指引。

  • 环氧树脂的作用与用途(环氧树脂有什么作用与用途)

    环氧树脂的作用与用途具有优良的物理和电绝缘性能,强度高、收缩性低,耐腐蚀以及有高绝缘的优势,所以被称为万能胶。电器、电机绝缘封装件的浇注。从常压浇注、真空浇注已发展到自动压力凝胶成型。长时间接触胶水时,有人会有细微的皮肤过敏和细微瘙痒疼痛的情况,建议在运用时戴上防护手套,如果出现了这样的情况,需要用酒精擦洗,然后用清水冲洗干净。

  • 明月曾照江东寒剧情(明月曾照江东寒剧情介绍)

    明月曾照江东寒剧情剧情简介:美少女战清泓是武林副盟主战破敌之女,从小被父亲禁止涉及江湖事。十年一期的武林大会即将来临,战清泓瞒着家人偷跑下山,立志夺取武林盟主之位。战清泓与温宥也开始互生情愫,奈何最终被世俗礼法所阻碍。与此同时,江湖上风起云涌,战清泓发现自己自幼背诵的家训竟是人人趋之若鹜的第一神功《鹤羽剑法》。