网站首页 > 技术文章 正文
PS:创作不易,感谢阅读,希望对读者有所帮助,喜欢的话可以点赞、收藏、关注,作者会持续更新 Java 生态圈常见知识。黑色加粗为重点关注内容!
控制反转
- 将设计好的对象交给 IOC 容器控制,而不是传统的在对象内部直接控制。
- IOC 容器负责创建对象,管理对象(通过依赖注入 DI),装配对象,配置对象,并且管理这些对象的整个生命周期
- 所谓的控制反转概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
IOC容器
- 实际上是一个 map,用来存放各种 Bean 对象
- 在项目启动时,读取配置文件中,Bean 的全限定类,使用反射创建对象,存在 map 中
- 当代码需要使用到这些 Bean 对象时,再通过 DI,注入对象所需要的外部资源
IOC作用
- 管理对象的创建和维护依赖关系
- 对象的创建并不是一件简单的事,在对象关系比较复杂时,如果依赖关系需要开发来维护的话,那是相当头疼的
- 实现对象的解耦,由容器去维护具体的对象
- 托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,如 AOP,可以把这部分处理交给容器,应用程序则无需关心类是如何完成代理的
IOC的优势
- 最小化应用程序中的代码量
- 使应用程序易于测试,因为它不需要单元测试用例中的任何单例 或 JNDI 查找机制。
- 以最小的影响和最少的侵入机制促进低耦合
- 支持即时实例化、和延迟加载服务
IOC的实现原理
- Spring 中的 IoC 的实现原理就是:工厂模式 + 反射机制
Spring中如何实现一个 IOC 容器
- 配置文件中指定需要扫描的包路径
- 定义一些注解,分别表示访问控制层、业务服务层、数据持久层、依赖注入、配置文件等
- 从配置文件中获取需要扫描的包路径,将路径下所有 .class 结尾的文件,添加到一个 Set 集合中存储
- 遍历 Set 集合,获取有指定注解的类,将其交给 IOC 容器,定义一个线程安全的 map 存储这些对象
- 遍历 IOC 容器,获取每一个类的实例,有的类依赖其他类,进行递归依赖注入
工厂模式+反射机制代码示例如下
interface Fruit {
public abstract void eat();
}
class Apple implements Fruit {
public void eat(){
System.out.println("Apple");
}
}
class Orange implements Fruit {
public void eat(){
System.out.println("Orange");
}
}
/* 工程模式 */
class Factory {
public static Fruit getInstance(String ClassName) {
Fruit f=null;
try {
/* 利用反射创建类 */
f=(Fruit)Class.forName(ClassName).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return f;
}
}
class Client {
public static void main(String[] a) {
Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
if(f!=null){
f.eat();
}
}
}
猜你喜欢
- 2024-10-15 BATJ面试必会之 Spring 篇(30题) 面试spring的面试题
- 2024-10-15 Spring知识点提炼 spring题
- 2024-10-15 springmvc的核心是啥,请求的流程怎么处理,控制反转怎么实现
- 2024-10-15 spring源码分析——spring大纲 spring源码分析和总结简书
- 2024-10-15 Spring思维导图,让Spring不再难懂(ioc篇)
- 2024-10-15 Spring框架介绍及使用 spring框架的使用步骤
- 2024-10-15 架构师必知必会:Java内置的控制反转机制-Service Provider
- 2024-10-15 轻松理解 Spirng IoC/控制方向反转
- 2024-10-15 什么是控制反转(ioc),通过解释总结告诉你
- 2024-10-15 搞透IOC,Spring IOC看这篇就够了
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)