在最开始的业务中,用户的需求可能会影响原来的代码,这个时候就需要程序员根据用户需求去修改源码
举个栗子:
在一次普通的程序设计中,我们会有以下几个部件:
- UserMapper 接口
public interface UserMapper {
void getUser();
}
- UserMapperImpl 接口实现类
public class UserMapperImpl implements UserMapper {
public void getUser(){
System.out.println("默认获取用户的数据");
}
}
- UserService 业务接口
public interface UserService {
void getUser();
}
- UserServiceImpl 业务接口实现类
public class UserServiceImpl implements UserService {
private UserMapper userMapper = new UserMapperImpl();
public void getUser(){
userMapper.getUser();
}
}
- 测试类
public class MyTest {
public static void main(String []args){
UserService userService=new UserServiceImpl();
((UserServiceImpl) userService).getUser();
}
}
当我们要调用业务层的一个功能时,业务层会声明dao层该实体类对象,并使用相应方法调用dao层对应实现类对象的方法,籍此完成功能,但是当dao层出现一个新的实现类的时候,业务层要使用这个类的实现方法就需要更改对应代码(修改业务实现类中声明的对象)
上面这个样子的话,如果只有几行代码那么改起来并不发杂,但是如果有很多个实现类呢,这样就会很麻烦,而且每次都要程序员手动去改,这样是更麻烦的,太不智能了,所以说要改进
设置一个set注入,就是在业务实现类中添加一个set方法
public class UserServiceImpl implements UserService {
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper){
this.userMapper=userMapper;
}
public void getUser(){
userMapper.getUser();
}
}
再看这个时候的测试
public class MyTest {
public static void main(String []args){
UserService userService=new UserServiceImpl();
((UserServiceImpl) userService).setUserMapper(new UserMapperImpl());
userService.getUser();
}
}
仔细看一下,这样一改,我们再需要调用不同实现类的的功能时,就不用去动业务层和dao层的代码了,只需要更改测试类要调用的不同实现类就可,
对比一下修改之后的变化:没修改的时候,测试的时候想要换一个实现类的功能,就得去业务层修改对应的代码,但是实际中什么dao层、service层都是不能给别人看的所以说改这个东西就得程序员去改而且东西多了多麻烦,程序员总不能一种杵在哪改吧;改完之后呢,想要换一个功能,就在测试类里改一下不同的对象名就可以了,不需要程序员去改内部的东西了
不知道看我博客的人会不会懂,反正我是有九分懂,想想改之前改一下就得程序员去干活,,但是修改之后就不需要程序员上了,这就是一种转变吧,控制权从程序员手中转让出来,控制权发生转变。最初的控制权在程序员手上,用户要用不同的功能,程序员就要为其更改代码,创建与其相关的对象去实现功能,提供一个接口就可以把这个权力交给用户,让用户自己去调用对象。下面有一句话总结(不是我说的)
控制反转(IOC)是一种思想,依赖注入(DI)是实现IOC的一种方法
唔,看上面两幅图会不会更明白点。上面只是IOC的思想,然后我觉得重要的是Spring里的IOC,毕竟我觉得Spring就是一个大容器,会存放管理一大堆bean,而且它最重要的就是IOC和AOP了。
Spring可以使用xml配置和注解两种方式实现IOC,学完感觉注解更方便
- xml配置:bean的定义信息和实现是分离的
- 注解:定义信息直接以注解的形式定义在实现类中
Spring容器在初始化时先读取配置文件,根据配置文件或元数据(我也不知道元数据是什么)创建与组织对象存入容器中,程序要用的时候再从IOC容器里取出来要用的对象,所以说在Spring中,这个控制权就交给Spring容器了,控制反转也就是这个容器实现的
所有的理解都是我在B站跟随狂神学习的,如果觉得我的理解有问题,可以去B站搜索《遇见狂神说》,最近一直跟着学ssm,感觉很不错,nice!如有问题请大神指出,感谢: