Spring IOC思想(Inversion of Control 控制反转)

IOC思想

在接触spring之前,我们原来的项目中 ,每次用户想要一些其他的功能,我们就要通过改变原来的代码来实现,当代码量比较大的时候,修改代价非常昂贵。因此IOC思想就出来了。它的本质就是:获得依赖对象的方式反转了。

跟以前的项目进行对比:

以前的项目:

Dao层

public interface UserDao {
    void getUser();
}

Dao层实现类DaoImpl

public class UserDaoImpl implements UserDao{
    public void getUser() {
        System.out.println("默认用户");
    }
}

Service层

public interface UserService {
    void getUser();
}

Service层实现类ServiceImpl

public class UserServiceImpl implements UserService{
    //用户每次增加需求都要改变代码
     private  UserDao userDao = new UserDaoImpl();

    public void getUser() {
        userDao.getUser();
    }   
}

测试类(用户)

public class MyTest {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        userService.getUser();
    }
}

结果:输出“默认用户”

那么问题来了,用户想要增加一些其他的功能。
按照以前的思想,我们要重新添加一个dao接口和实现类还要对service层也进行大改,这样改动是违反了开闭原则的。好的程序是在不动原来代码的基础上对其进行一定的修改,那么我们上面项目的那种方式就被摒弃了,我们会采用一个setUserDao的方法动态实现值的注入。

利用了IOC思想的新项目:

新增了一个Mysql用户的功能,想要实现把原来的默认用户与mysql用户自由切换。

新的ServiceImpl

public class UserServiceImpl implements UserService{
    //用户每次增加需求都要改变代码
     private  UserDao userDao ;

    public void getUser() {
        userDao.getUser();
    }
    //重点:利用set进行动态实现值的注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

写了上面的setUserDao的方法后呢,我们就不用每次改Service层的代码,直接在测试类里调用这个方法,传一个对象过来就可以了。

新的测试类

public class MyTest {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();

        //需要强转才能调用,因为setUserDao方法是在UserServiceImpl中,需要它的对象才能调用,简化后是下方aaa处代码
        ((UserServiceImpl)userService).setUserDao(new UserDaoMySQLImpl());
        userService.getUser();

        //aaa
        /*UserServiceImpl userService1 = new UserServiceImpl();
        userService1.setUserDao(new UserDaoMySQLImpl());*/
    }
}

测试结果:
在这里插入图片描述

这样,我们可以直接通过setUserDao的方法里传不同的dao层实现类的对象来实现对应不同dao层对象的不同的功能,所以说以后添加功能时只需要写dao层和测试类就可以,减少了对service层的改动。

根据代码我们可以看出:
之前,所有的对象都需要程序员手动创建,而加入set的动态值注入后,程序被动的接受对象。控制权从程序员自己变成了用户,用户需要什么样的需求,我们可以通过IOC思想很快完成。这就是IOC的思想,跟策略模式有些类似。这只是简单的思想理解,具体应用肯定不止于此的,希望通过这篇博客,我们刚学习spring的小白能够对IOC思想有一个简单的理解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值