Spring学习(2)

举报
幼儿园老大* 发表于 2024/09/27 21:28:58 2024/09/27
【摘要】 IOC 原理代码耦合实际开发中,我们如果在对象 A 内部去创建、修改或者注销另一个对象 B,这会导致对象之间非常复杂的依赖关系,不利于代码的维护更新。比如我们直接在上层类内调用了底层类的构造方法,一旦底层类的构造方法发生改变,就必须修改所有上层类的代码。依赖注入( Dependency Injection ) 我们用依赖注入的方式来降低耦合度。所谓依赖注入,就是把底层对象作为参数传入上层对象...

IOC 原理

代码耦合

实际开发中,我们如果在对象 A 内部去创建、修改或者注销另一个对象 B,这会导致对象之间非常复杂的依赖关系,不利于代码的维护更新。

比如我们直接在上层类内调用了底层类的构造方法,一旦底层类的构造方法发生改变,就必须修改所有上层类的代码。

依赖注入

( Dependency Injection ) 我们用依赖注入的方式来降低耦合度。所谓依赖注入,就是把底层对象作为参数传入上层对象。避免底层类被修改后上层类代码也要随之改动。我们一般通过构造方法或者 setter 方法注入底层对象。

  1. 设值注入:依赖的对象通过 setter 方法传入的,对象已经实例化,发生属性填充和依赖注入的时候。

  2. 构造注入:依赖的对象是通过构造器传入,发生在实例化 Bean 的时候。

主要采用设值注入,性能更好更易读。但对于依赖关系无需变化的 Bean 采用构造注入。所有的依赖关系全部在构造器内设定。

优势:使用依赖注入后,即使底层类发生变化,上层类代码也不必改动,大大降低了代码的耦合度。

劣势:但这也导致了我们在初始化对象的过程中要书写复杂的代码。

控制反转

( Inversion of Control ) 控制反转,将对象的管理权交给 IOC 容器。

Spring 框架内会定义一个 IOC 容器类,通过其来统一管理对象的生命周期:创建、资源存取、注销;并自动维护对象间的依赖关系。用户只需要配置 XML 文件或者添加注解标明类之间的映射关系,初始化过程中的代码将由 IOC 容器自动完成。

IOC 容器底层通过工厂模式和 Java 反射机制来实现:

  1. IOC 容器根据 XML 配置文件或者注解读取 Bean 中保存的对象信息。
  2. IOC 容器充当工厂类,利用 Java 反射机制读取需要生成哪些对象,来自动生成相应的对象。

基础概念

IOC 容器

在 Spring 框架中已经定义了 ApplicationContext 和 BeanFactory 作为 IOC 容器类。其中 ApplicationContext是 BeanFactory 的子类,提供了事件发布、国际化信息支持等其他高级特性。

我们可以通过 IOC 容器类的 setBean 方法创建 Bean ,也可以通过 getBean 方法把 Bean 实例化并使用。



public void testUser(){
    // 加载配置文件,创建 IOC 容器对象
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    // IOC 容器根据 Bean 创建对象实例
    Person newUser = (Person) context.getBean("person");
    // 调用对象方法
    System.out.print(newUser.toString());
}Copy to clipboardErrorCopied

Java Bean

Java Bean 就是程序中被管理的对象在 IOC 容器中的代理,记录了对象信息。

Bean 包含以下参数:Bean 名称(name) 、所代理的类(class) 、以及作用域(scope)。

Bean 的作用域

  • singleton 单例模式(默认): 在整个 IoC 容器中,Bean 只有一个对象实例。
  • prototype 原型模式: 每次调用 Ioc 容器的 getBean 方法,都将产生一个新的对象实例。
  • request: 对于每次 HTTP 请求,Bean 都将产生一个新的对象实例。
  • session: 对于每个 HTTP Session,Bean 都将产生一个新的对象实例。
  • global session: 对于每个全局的 HTTP Session,Bean 都将产生一个新的对象实例。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。