Spring中的IOC与DI

spring ioc最关键的作用在于解耦,它可以解除对象之间的耦合,让对象和对象之间完全没有联系,这样我们在完成或修改一个对象时不需要考虑其它对象。

什么是IOC呢?我是如何理解IOC的?

IOC:控制反转。

 

举一个很简单的例子,一个齿轮代表一个对象,如上图所示情况下,每个对象之间耦合度会非常高,有一个出错则整个系统都会出错。

 

 而上图这样看似每个对象还是紧密合在一起,但如果把中间的齿轮拿掉,另外三个齿轮看上去则毫无关联互不影响。中间这个齿轮就可以看作是IOC容器。所以在用到IOC容器时,降低了程序的耦合度。

至于依赖注入DI,我理解为了实现IOC容器的方法。IOC是使创建对象不再需要通过new,而是通过Spring容器。而Spring容器创建对象并交给你使用的过程叫做依赖注入DI。也就是说,spring容器创建对象是通过依赖注入来实现的。

 

下面是我实现依赖注入的代码过程:

UserDao.java

package com.itheima.ioc;

public interface UserDao {
public void say();
}


 

UserDaoImpl.java

package com.itheima.ioc;

public class UserDaoImpl implements UserDao {

@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("UserDao say:'hello'");
}

}


 

UserService.java

package com.itheima.ioc;

public interface UserService {
public void say();
}


 

UserServiceImpl.java

package com.itheima.ioc;

public class UserServiceImpl implements UserService {
//声明UserDao属性
private UserDao userDao;
//添加UserDao属性的setter方法,用于实现依赖注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("UserService say:'hello world'");
}

}

 


 

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-4.3.xsd">
<!-- 将指定类配置给Spring让Spring创建其对象的实例 -->
<bean id="userDao" class="com.itheima.ioc.UserDaoImpl"></bean>
<!-- 添加一个id为userService的实例 -->
<bean id="userService" class="com.itheima.ioc.UserServiceImpl">
<!-- 将UserDao实例注入到UserService -->
<property name="userDao" ref="userDao"></property>
</bean>
</beans>


TestDI.java

package com.itheima.ioc;

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

public class TestDI {

public static void main(String[] args) {
// TODO Auto-generated method stub
//初始化Spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取UserService实例
UserService userService = (UserService) applicationContext.getBean("userService");
//调用实例中的say()方法
userService.say();
}

}


 

 控制台成功输出UserService中的say()方法。

 

接下来是我在编写程序后产生的疑问,也可能是因为我之前的mvc没有学好。我还不明白如何把IOC和依赖注入真正的用在编程代码中来实现系统的某些功能或者达到某些目的。只是片面的理解到,噢,原来IOC和依赖注入的原理是这样,我在xml中要怎么怎么做,然后测试类要初始化Spring容器,加载配置类等等等等。希望我在之后的学习中能更好的运用它,并最后能够写出一个让我满意的系统。


 

posted @ 2020-07-16 13:49  南巷北口  阅读(145)  评论(0)    收藏  举报