Spring IoC基础
出现问题
例如:现有一个针对 User 的操作,利用 Service 和 Dao 两层结构进行开发
在没有使用 IoC 思想的情况下,Service 层想要使用 Dao 层的具体实现的话,需要通过 new 关键字在UserServiceImpl
中手动 new 出 IUserDao
的具体实现类 UserDaoImpl
(不能直接 new 接口类)。
很完美,这种方式也是可以实现的,但是我们想象一下如下场景:
开发过程中突然接到一个新的需求,针对对IUserDao
接口开发出另一个具体实现类。因为 Server 层依赖了IUserDao
的具体实现,所以我们需要修改UserServiceImpl
中 new 的对象。如果只有一个类引用了IUserDao
的具体实现,可能觉得还好,修改起来也不是很费力气,但是如果有许许多多的地方都引用了IUserDao
的具体实现的话,一旦需要更换IUserDao
的实现方式,那修改起来将会非常的头疼。
解决问题
使用 IoC 的思想,我们将对象的控制权(创建、管理)交有 IoC 容器去管理,我们在使用的时候直接向 IoC 容器 “要” 就可以了
这样的好处是,如果DAO层的实现类需要修改的话,直接注解@Resource写上具体实现类,这时候只需要修改注解一行即可完成改变,而如果是new的方式的话,Service层中则有很多需要修改
什么是IoC
IoC概念
IoC(Inverse of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。
为什么叫控制反转?
- 控制 :指的是对象创建(实例化、管理)的权力
- 反转 :控制权交给外部环境(Spring 框架、IoC 容器)
IoC作用
根据上面出现的问题,以及我们是如何解决问题的,我们可以知道,IoC 的思想就是两方之间不互相依赖,由第三方容器来管理相关资源。这样有什么好处呢?
- 对象之间的耦合度或者说依赖程度降低;
- 资源变的容易管理;比如你用 Spring 容器提供的话很容易就可以实现一个单例。
相关概念
什么是 Spring Bean?
简单来说,Bean 代指的就是那些被 IoC 容器所管理的对象。
比如被@Component、@Service、@Controller、@Repository标注的类
或者被@Bean标注的类等等
我们需要告诉 IoC 容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。
什么是DI(依赖注入)?
也就是说,UserService实例依赖了UserDao实例,而UserService实例和UserDao实例都在Spring容器中,那么我们就可以通过在xml/java类/注解中,配置好UserService和UserDao这两个实例之间的依赖关系,让Spring容器在创建UserService实例的时候,顺便帮我们把UserDao实例填充到UserService实例中,这个过程就叫做依赖注入——DI(Dependency Injection)
看到这里,应该不会把IoC和DI的关系混淆了吧。。。
IoC在Spring 中的体现
将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。
IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
理解方式一
代码解释:
1、先实例化出来一个spring客户端,并指定去applicationContext.xml中读取Bean的注入信息
2、从spring客户端中获取到一个名为"userDao"的bean对象
3、调用userDao的save方法
理解方式二
Spring 启动时读取应用程序提供的 Bean 配置信息(xml,注解,java类),并在 Spring 容器中生成一份相应的 Bean 配置注册表,然后根据这张注册表实例化 Bean,装配好 Bean 之间的依赖关系(依赖注入DI),为上层应用提供准备就绪的运行环境。其中 Bean 缓存池为 HashMap 实现
参考
本文作者:bourbonbote
本文链接:https://www.cnblogs.com/bourbonbote/p/16573552.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步