首先,什么是耦合?
简单的说就是,假如类A因为需要功能F而调用类B,在通常的情况下类A需要引用类B,那么类A就依赖于类B了,但是当类B不存在的时候类A就无法使用了。
但若使用了IoC,类A调用的仅仅是实现了功能F的接口的某个类,这个类可能是类B,也可能是另一个类C,由spring的配置文件来决定。
这样,类A就不再依赖于类B了,耦合度降低,重用性提高了。
栗子:
Spring配置文件
<?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">
<!--创建Service和Dao对象-->
<bean id="userService" class="com.shangguigu.spring5.service.UserService">
<!--注入UserDao对象-->
<property name="userDao" ref="userDaoImpl"></property> </bean>
<bean id="userDaoImpl" class="com.shangguigu.spring5.dao.UserDaoImpl">
</bean>
</beans>
UserDao
public interface UserDao {
public void update();
}
UserImpl
public class UserDaoImpl implements UserDao {
@Override
public void update() {
System.out.println("Userdao update....");
}
}
UserService
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(){
System.out.println("add ........");
//原始方式
//UserDao userDao = new UserDaoImpl();
//userDao.update();
userDao.update();
}
}
测试类
public class TestBean {
@Test
public void testBean(){
//1.spring加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("beans2.xml");
//2.spring通过配置文件加载类
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
}
可以看出,UserService仅仅是调用了实现UserDao接口的实现类,如果将UserImpl改为DogDaoImpl只需要改变配置文件就行,而不用去更改UserService中的代码。
若按照UserService中的原始方式,UserDaoImpl更改,也会影响到UserService。
以上,即通过Spring实现了解耦。