Spring-IoC(Inversion of Control )控制反转

Posted 永旗狍子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-IoC(Inversion of Control )控制反转相关的知识,希望对你有一定的参考价值。

Inverse Of Controll:控制反转

反转了依赖关系的满足方式,由之前的自己创建依赖对象,变为由工厂推送。(变主动为被动,即反转)简单一点就是静止套娃

解决了具有依赖关系的组件之间的强耦合,使得项目形态更加稳健

项目中强耦合问题

public class UserDAOImpl implements UserDAO{....}
public class UserServiceImpl implements UserService {
    // !!!强耦合了UserDAOImpl!!!,使得UserServiceImpl变得不稳健!!
    private UserDAO userDAO= new UserDAOImpl();
    @Override
    public User queryUser() {
        return userDAO.queryUser();
    }
    ....
}

解决方案

<bean id="userDAO" class="com.qf.spring.part1.injection.UserDaoImpl"></bean>
<!-- UserServiceImpl组件 -->
<bean id="userService" class="com.qf.spring.part1.injection.UserServiceImpl">
    <!-- 由spring为userDAO属性赋值,值为id="userDAO"的bean -->
    <property name="userDAO" ref="userDAO"/>
</bean>

此时,如果需要更换其他UserDAO实现类,则UserServiceImpl不用任何改动!则此时的UserServiceImpl组件变得更加稳健!

实例:

 实现类

public class EmpDaoImpl implements EmpDao {
    public void show() {
        System.out.println("这个是EmpDao");
    }
}
public class EmpServiceImpl implements EmpService {
    private EmpDao empDao;


    public void showAll() {
        empDao.show();
        System.out.println("这个是Services");
    }

    public EmpDao getEmpDao() {
        return empDao;
    }

    public void setEmpDao(EmpDao empDao) {
        this.empDao = empDao;
    }
}

application-config.xml配置文件

   <!-- 配置实例(id:“唯一标识”  class="需要被创建的目标对象全限定名") -->
    <bean id="empDao" class="com.cos.qf.Dao.impl.EmpDaoImpl" />

    <!-- empServiceImpl组件 -->
    <bean id="empService" class="com.cos.qf.Services.impl.EmpServiceImpl" >
        <property name="empDao" ref="empDao"/>
    </bean>

测试方法:

   @Test
    public void text1(){
        //1. 读取配置文件中所需创建的bean对象,并获得工厂对象
        ApplicationContext ctx = new ClassPathXmlApplicationContext("application-config.xml");
        //2. 通过id获取bean对象
        EmpService empService = (EmpService)ctx.getBean("empService");
        //3. 使用对象
       empService.showAll();
    }

以上是关于Spring-IoC(Inversion of Control )控制反转的主要内容,如果未能解决你的问题,请参考以下文章

Understanding Inversion of Control, Dependency Injection and Service Locator Print

spring的IOC(Inversion of Control)控制反转

Inversion of Control Containers and the Dependency Injection pattern (Martin Fowler)

IOC(Inversion of Control)设计模式

Another Version of Inversion 二维树状数组求逆序对

ioc(Inversion of Control)控制反转和DI