浅谈对Spring IOC的理解

在理解IOC之前先举一个例子,通过这个例子来理解体会IOC。

比如图书馆有一个管理员叫张三。

那么我们可以写以下代码:

	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(Librarian 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();
		}
	}

这里是实例化图书馆这个类之后,需要管理员才注入,如果要其他的职位,那么就可以通过馆长这个类注入了。

至于接口注入,由于其额外需要声明一个接口,且效果和属性注入并没有什么本质区别,因此不是很提倡,所以就不写了,感兴趣的可以自己查一下。

猜你喜欢

转载自blog.csdn.net/RebelHero/article/details/79667422