计算机系统应用教程网站

网站首页 > 技术文章 正文

阿瑟Spring (5):IOC 控制反转 阿瑟五一档电影

btikc 2024-10-15 09:03:25 技术文章 11 ℃ 0 评论

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();
        }
    }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表