SpringIOC个人解析
来源:互联网 发布:中级计算机程序员证 编辑:程序博客网 时间:2024/05/11 23:03
IOC定义
Ioc—Inversion of Control,即“控制反转”是一种设计思想,在java中,如果一个对象需要使用另外一个对象,比如电脑对象需要使用鼠标对象,此时,需要使用鼠标对象,则不需要电脑对象自己创建鼠标对象,而是由IOC容器根据电脑对象的要求,为电脑对象创建鼠标对象,提供给电脑对象。IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了
Spring IOC原理
IoC是spring的核心,贯穿始终。所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系,即所有对象的创建及销毁都交由spring的IOC容器进行管理。而对象直接的关系及引用也是依赖于springIOC容器的管理和注入。IOC的好处是松耦合,使用IOC容器,应用程序所需要的一些组件不必再由自己创建,而交由IOC容器管理,当需要变更应用程序某些实现类的功能时,不再需要硬编码,而只需修改spring的配置文件即可。下面是一个简单的IOC例子。
Spring IOC简单例子
我们这里写一个简单例子,定义三个类,computer,keyboard,mouse,computer有个玩游戏的功能,玩游戏需要使用keyboard和mouse,keyboard和mouse又可以分为不同的品牌。按照这个需求我们先使用java普通的实现,然后再使用SpringIOC实现,再对比二者之间的优劣。
普通的java实现代码如下:
//鼠标类public interface Mouse { public String getBrand();}//罗技鼠标public class LogitechMouse implements Mouse{ @Override public String getBrand() { // TODO Auto-generated method stub return "logitechMouse"; }}//雷蛇鼠标public class RazerMouse implements Mouse{ @Override public String getBrand() { // TODO Auto-generated method stub return "RazerMouse"; }}//键盘类public interface Keyboard { public String getBrand();}//罗技键盘public class LogitechKeyboard implements Keyboard{ @Override public String getBrand() { // TODO Auto-generated method stub return "logitechKeyboard"; }}//雷蛇键盘public class RazerKeyboard implements Keyboard{ @Override public String getBrand() { // TODO Auto-generated method stub return "RazerKeyboard"; }}////电脑类public class Computer { private Keyboard keyboard; private Mouse mouse; public void playGame(){ System.out.println("I use " + mouse.getBrand()+" and " +keyboard.getBrand()+" play games"); } public static void main(String[] args) { Computer computer = new Computer(); //创建电脑 Mouse mouse = new LogitechMouse(); //创建鼠标 Keyboard keyboard = new LogitechKeyboard(); //创建键盘 computer.setMouse(mouse); //为电脑配置鼠标 computer.setKeyboard(keyboard); //为电脑配置键盘 computer.playGame(); //用电脑打游戏 } public Keyboard getKeyboard() { return keyboard; } public void setKeyboard(Keyboard keyboard) { this.keyboard = keyboard; } public Mouse getMouse() { return mouse; } public void setMouse(Mouse mouse) { this.mouse = mouse; }
观察上诉代码,我们发现,当我们要完成使用电脑打游戏这个功能时,我们首先得找一台电脑,接着再给电脑配置鼠标键盘,这些动作都需要我们主动去做。即在如上应用程序中需要我们主动去创建电脑,鼠标,键盘等对象,我们才能打游戏。下面我们来看看使用springIOC怎么实现:
//修改上面computer类中的main方法,改为通过springIOC容器获取对象 public static void main(String[] args) { ApplicationContext ctx = new FileSystemXmlApplicationContext( new String[]{"config/context.xml"}); Computer computer = (Computer) ctx.getBean("computer"); computer.playGame(); }
spring配置文件如下
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-autowire="byName"> <bean id="computer" class="com.mytest.demo.Computer"/> <bean id="mouse" class="com.mytest.demo.LogitechMouse"/> <bean id="keyboard" class="com.mytest.demo.LogitechKeyboard"/></beans>
观察实现电脑打游戏这个需求的两种方式,我们发现再普通的java应用程序中,我们所需要的对象需要应用程序主动创建,依赖关系也是由应用程序来维护。而通过springIOC方式,我们只需要在配置文件中进行简单的配置,在应用程序中初始化IOC容器,对象的管理全部交给了IOC容器,应用程序只需直接执行他需要的方法即可。对于上述例子,普通java程序实现好比当我们需要玩游戏时,我们得自己买电脑,自己买鼠标,键盘(new 对象),当现有鼠标键盘不满足要求的时候,我们还得重新买新鼠标,键盘(重新new 对象),一切弄好后才能打游戏。而通过IOC容器则好比去网吧,我们只要说出我们对电脑的要求(配置文件),网吧都直接提供给我们,这样我们就能愉快的打游戏了,而不需要关心电脑,鼠标,键盘这些东西从哪里来。当对鼠标,键盘不满意,和网吧说一声(修改配置文件),即可使用上新鼠标键盘打游戏。上面只是一个简单的IOC例子,但是已经体现了出了使用IOC编程的优越性,代码耦合性更低,需要切换需要使用的对象时也不再需要硬编码,只需要简单改下配置文件就可实现。
Spring IOC部分源码分析
上面的例子在SpringIOC中的实现通俗的解释其实就是三个步骤
1:读取配置文件context.xml,扫描其中的配置属性
Spring IOC部分配置解析
- SpringIOC个人解析
- SpringIOC--初始化源码解析
- SpringIOC--初始化源码解析
- SpringIOC--初始化源码解析
- springIOC源码解析(一)
- springIOC源码解析(二)
- springIOC源码解析(三)
- springIOC源码解析(四)
- springIOC源码解析(五)
- springIOC源码解析(六)
- SpringIOC源码解析
- SpringIOC源码解析
- 对SpringIOC和DI的个人理解
- springIoC
- springIoc
- SpringIOC
- springIOC
- springIOC
- leetcode week13
- 检索和关闭游标+检索游标+关闭游标
- 数控机床故障诊断和维护维修
- 设计模式之建造型-建造者模式(4)
- [leetcode]: 342. Power of Four
- SpringIOC个人解析
- MySQL 学习<七> 插入、更新与删除数据
- Mysql 5.5 在windows 或linux下修改max_allowed_packet参数
- ES报错too-many-open-files解决
- XML基础语法
- docker搭建squid+php+nginx+supervisor
- 医疗人工智能的真实使用反馈,看医生如何看待它的价值?【智库2861】
- Gorm错误
- jsp学习笔记(一)