Spring 理解IOC

本文详细介绍了Spring IoC(控制反转)的概念,包括反转控制权的转移过程,以及如何通过XML文件实现依赖注入。通过代码示例展示了传统方式与Spring配置方式下的实现差异,并说明了在不同实现类之间的灵活性与维护性提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

纸上得来终觉浅

做笔记一个重要的问题是,在没有系统的掌握一项技能之前,无法系统的对其进行总结。 实际上,能够做的就是盲人摸象,一点点总结和记录,在回头的时候做更深入的总结和理解

1.初识Spring IOC

1) IOC即控制反转,inverse of control, 既然是反转,原来的控制权在哪里?,现在的控制权又在哪里?,如何反转。 首先看一张对IOC进行描述的图片:



可以这样来理解:类1中包含了类2,那么在类1实例化的时候,类2会进行实例化,而类2如何实例化是由类1控制的,这时候控制权在类1,如果采用Spring的控制反转的话,用一个文件来确定类1,类2的关系,采用文件综合的来指定类1,类2的关系的这种方式,叫做依赖注入(DI)。  IOC是思想,DI是实现。下面用代码来描述:

2)代码实现

A:传统方式

package com.roadArchitectWeb.dao;
public interface AnimalDao {
	/*所有动物有一个说话的方法*/
	public void say();
}
package com.roadArchitectWeb.dao;
public class CatDaoImpl implements AnimalDao{
	String says="喵喵";
	public void say(){
		System.out.println("CatDaoImpl.say():"+says);
	}
}
package com.roadArchitectWeb.dao;
public class DogDaoImpl implements AnimalDao{
	String says="汪汪";
	public void say() {
		System.out.println("DogDaoImpl.say():"+says);
	}
}
package com.roadArchitectWeb.dao;
class AnimalSay1{
	AnimalDao animalDao = new CatDaoImpl();
	public void Say(){
		animalDao.say();
	}
}
class AnimalSay2{
	AnimalDao animalDao = new CatDaoImpl();
	public void Say(){
		animalDao.say();
	}
}
class AnimalSay3{
	AnimalDao animalDao = new CatDaoImpl();
	public void Say(){
		animalDao.say();
	}
}
public class AnimalMain {
	public static void main(String[] args) {
		AnimalSay1 animalSay = new AnimalSay1();
		animalSay.Say();
		AnimalSay2 animalSay2 = new AnimalSay2();
		animalSay2.Say();
		AnimalSay3 animalSay3 = new AnimalSay3();
		animalSay3.Say();
	}
}

结果是:

CatDaoImpl.say():喵喵

CatDaoImpl.say():喵喵

CatDaoImpl.say():喵喵


代码很好理解,现在一个问题是,如果猫叫声换为"喵喵喵",那么CatDaoImpl中says的应该改为“喵喵喵”, 如果使用单个文件来进行配置,而不是直接修改CatDaoImpl,那么修改的控制权就由CatDaoImpl交给了xml文件。

B:Spring 配置方式

修改CatDaoImpl:

package com.roadArchitectWeb.dao;
public class CatDaoImpl implements AnimalDao{
	/*这个时候并没有值,会有xml文件注入*/
	private String says;
	/*set方法,为了bean注入*/
	public void setSays(String says) {
		this.says = says;
	}
	public void say(){
		System.out.println("CatDaoImpl.say():"+says);
	}
	/*一个无参的构造方法*/
	public CatDaoImpl(){
		
	}
}

修改AnimalMain:

package com.roadArchitectWeb.dao;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

class AnimalSay1{
	/*创建Spring的IOX容器对象*/
	ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
	/*从IOC容器中获取Bean实例*/
	CatDaoImpl catDaoImpl = (CatDaoImpl)ctx.getBean("CatDaoImpl");
	/*调用其中的say方法*/
	AnimalDao animalDao = catDaoImpl;
	public void Say(){
		animalDao.say();
	}
}
class AnimalSay2{
	AnimalDao animalDao = new CatDaoImpl();
	public void Say(){
		animalDao.say();
	}
}
class AnimalSay3{
	AnimalDao animalDao = new CatDaoImpl();
	public void Say(){
		animalDao.say();
	}
}
public class AnimalMain {
	public static void main(String[] args) {
		AnimalSay1 animalSay1 = new AnimalSay1();
		animalSay1.Say();
	}
}
把AnimalSay1中实例化方式catDaoImpl实例化方式改为从xml文件中获取bean;


applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="CatDaoImpl" class="com.roadArchitectWeb.dao.CatDaoImpl">
<property name="says" value="喵喵喵"></property>
</bean>

</beans>


最后输出:

CatDaoImpl.say():喵喵喵


2.Spring

上面代码会有这样一个问题,AnimalSay1如果实现类不是CatDaoImpl,而是DogDaoImpl,  当然我们可以在xml中再增加一个bean,然后在AnimalSay1中获取这个bean;不过如果这个步骤也采用注入的方法完成,那么在实现类由CatDaoImpl改为DogDaoImpl的时候,AnimalSay1将不做任何改动。   AnimalSay2和AnimalSay3同AnimalSay1

DogDaoImpl:

package com.roadArchitectWeb.dao;
public class DogDaoImpl implements AnimalDao{
	private String says;
	public void setSays(String says) {
		this.says = says;
	}
	public void say() {
		System.out.println("DogDaoImpl.say():"+says);
	}
	public DogDaoImpl(){
		
	}
}

AnimalMain:

package com.roadArchitectWeb.dao;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

class AnimalSay1{
	private AnimalDao animalDao;
	public void setAnimalDao(AnimalDao animalDao) {
		this.animalDao = animalDao;
	}
	public void Say(){
		animalDao.say();
	}
	public AnimalSay1(){
		
	}
}
class AnimalSay2{
	private AnimalDao animalDao;
	public void setAnimalDao(AnimalDao animalDao) {
		this.animalDao = animalDao;
	}
	public void Say(){
		animalDao.say();
	}
	public AnimalSay2(){
		
	}
}
class AnimalSay3{
	private AnimalDao animalDao;
	public void setAnimalDao(AnimalDao animalDao) {
		this.animalDao = animalDao;
	}
	public void Say(){
		animalDao.say();
	}
	public AnimalSay3(){
		
	}
}
public class AnimalMain {
	public static void main(String[] args) {
		/*创建Spring的IOX容器对象*/
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		/*从IOC容器中获取Bean实例*/
		AnimalSay1 animalSay1 = (AnimalSay1)ctx.getBean("AnimalSay1");
		/*调用其中的say方法*/
		animalSay1.Say();
		/*从IOC容器中获取Bean实例*/
		AnimalSay2 animalSay2 = (AnimalSay2)ctx.getBean("AnimalSay2");
		/*调用其中的say方法*/
		animalSay2.Say();
		/*从IOC容器中获取Bean实例*/
		AnimalSay3 animalSay3 = (AnimalSay3)ctx.getBean("AnimalSay3");
		/*调用其中的say方法*/
		animalSay3.Say();
	}
}

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="CatDaoImpl" class="com.roadArchitectWeb.dao.CatDaoImpl">
<property name="says" value="喵喵喵"></property>
</bean>
<bean id="DogDaoImpl" class="com.roadArchitectWeb.dao.CatDaoImpl">
<property name="says" value="汪汪汪"></property>
</bean>
<bean id="AnimalSay1" class="com.roadArchitectWeb.dao.AnimalSay1">
<property name="animalDao" ref="CatDaoImpl"></property>
</bean>
<bean id="AnimalSay2" class="com.roadArchitectWeb.dao.AnimalSay2">
<property name="animalDao" ref="DogDaoImpl"></property>
</bean>
<bean id="AnimalSay3" class="com.roadArchitectWeb.dao.AnimalSay3">
<property name="animalDao" ref="CatDaoImpl"></property>
</bean>
</beans>

结果如下:

CatDaoImpl.say():喵喵喵
CatDaoImpl.say():汪汪汪
CatDaoImpl.say():喵喵喵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值