浅谈对Spring IOC的理解
2018-03-23 18:17
141 查看
在理解IOC之前先举一个例子,通过这个例子来理解体会IOC。
比如图书馆有一个管理员叫张三。
那么我们可以写以下代码:
可以看见,张三这个管理员和图书馆紧密的耦合在一起了,但是图书馆万一把管理员换为李四,那又要新建一个李四类。通过分析可以知道,我们就把图书管理员作为一个接口。那么有下面的代码:
在这里,管理员这个职位同时依赖于Librarian接口和Zhangsan类,那么如何让张三和管理员无关但是又能完成相应的工作呢?那么我们引入馆长这个身份,馆长将张三安排在管理员这个职位上,他负责了图书馆,管理员,张三的协调控制。
那么通过上面这个例子我们可以去理解IOC的概念了。
IOC(inverse of Control)字面意思是控制反转,它具体而言是两方面的内容,一是控制,二是反转。对于软件来说,就是某一接口具体实现类的选择控制权从调用类中移除,转交由第三方决定,在Spring中就是由Spring容器借由Bean进行配置。
DI(Dependency Injection)即依赖注入,也就是让调用类对某一接口实现类的依赖关系由第三方(容器或者协助类)注入,以移除调用类对某一接口实现类的依赖。可以说是IOC更通俗更容易理解的解释。
IOC有三种注入方式,构造函数注入,属性注入和接口注入,Spring支持构造函数注入和属性注入。
先介绍第一种,构造函数注入:
馆长并不是只管管理员这一职位,还有其他的,因此,我们可以使用属性注入的方式,也就是通过Setter方法完成调用类所需的依赖注入。如下:
这里是实例化图书馆这个类之后,需要管理员才注入,如果要其他的职位,那么就可以通过馆长这个类注入了。
至于接口注入,由于其额外需要声明一个接口,且效果和属性注入并没有什么本质区别,因此不是很提倡,所以就不写了,感兴趣的可以自己查一下。
比如图书馆有一个管理员叫张三。
那么我们可以写以下代码:
public class Library{ public void librarian(){ Zhangsan zs = new Zhangsan(); zs.work("图书管理员"); } }
可以看见,张三这个管理员和图书馆紧密的耦合在一起了,但是图书馆万一把管理员换为李四,那又要新建一个李四类。通过分析可以知道,我们就把图书管理员作为一个接口。那么有下面的代码:
public class Library{ public void librarian(){ //图书管理员是一个接口 Librarian lib = new Zhangsan(); lib.work("图书管理员"); } }
在这里,管理员这个职位同时依赖于Librarian接口和Zhangsan类,那么如何让张三和管理员无关但是又能完成相应的工作呢?那么我们引入馆长这个身份,馆长将张三安排在管理员这个职位上,他负责了图书馆,管理员,张三的协调控制。
那么通过上面这个例子我们可以去理解IOC的概念了。
IOC(inverse of Control)字面意思是控制反转,它具体而言是两方面的内容,一是控制,二是反转。对于软件来说,就是某一接口具体实现类的选择控制权从调用类中移除,转交由第三方决定,在Spring中就是由Spring容器借由Bean进行配置。
DI(Dependency Injection)即依赖注入,也就是让调用类对某一接口实现类的依赖关系由第三方(容器或者协助类)注入,以移除调用类对某一接口实现类的依赖。可以说是IOC更通俗更容易理解的解释。
IOC有三种注入方式,构造函数注入,属性注入和接口注入,Spring支持构造函数注入和属性注入。
先介绍第一种,构造函数注入:
public class Library{ private Librarian lib; public Library(Librarian lib){ this.lib = lib; } public void whatWork(){ zs.work("图书管理员"); } } //通过馆长这个类注入 public class Curator{ public void curator(){ //指定管理员为张三 Librarian lib = new Zhangsan(); Library libry = new Library(lib); libry.whatWork(); } }
馆长并不是只管管理员这一职位,还有其他的,因此,我们可以使用属性注入的方式,也就是通过Setter方法完成调用类所需的依赖注入。如下:
public class Library{ private Librarian lib; public void setLib(Librari 9a13 an lib){ this.lib = lib; } public void whatWork(){ zs.work("图书管理员"); } } //通过馆长这个类注入 public class Curator{ public void curator(){ //指定管理员为张三 Librarian lib = new Zhangsan(); Library libry = new Library(); libry.setLib(lib); libry.whatWork(); } }
这里是实例化图书馆这个类之后,需要管理员才注入,如果要其他的职位,那么就可以通过馆长这个类注入了。
至于接口注入,由于其额外需要声明一个接口,且效果和属性注入并没有什么本质区别,因此不是很提倡,所以就不写了,感兴趣的可以自己查一下。
相关文章推荐
- 浅谈对Spring IOC以及DI的理解
- 学习AOP之透过Spring的Ioc理解Advisor
- 深入理解Spring的两大特征(IOC和AOP)
- 谈谈对Spring IOC的理解
- spring里面的ioc的理解?
- Spring4深入理解IOC&DI02----Bean配置--自动装配、bean之间的继承与依赖、使用外部属性文件
- 谈谈对Spring IOC的理解
- Spring中IOC(DI)的理解
- Spring中IOC理解
- Spring AOP详解 (转) 以及IOC(个人理解)
- Spring IoC的理解----找女朋友的方法
- 谈谈对Spring IOC的理解
- spring中aop、ioc简单理解
- (转)spring IOC、DI理解
- 对Spring中IOC和DI的理解
- JAVA中的一些概念, IOC DI spring 讲的很好很容易理解
- 谈谈对Spring Ioc的理解
- 谈谈对Spring IOC的理解
- Spring面试:IOC和AOP的理解
- spring IOC AOP DI的理解