在传统的程序计划中,当一个对象(A)需要使用另一个对象(B)的功能时,通常会在对象 A 内部主动创建对象 B 的实例,即对象 A 对对象 B 的创建和生命周期管理具有控制权。而在控制反转的头脑下,对象 A 所依赖的对象 B 的创建、实例化以及依赖关系的建立,不再由对象 A 自身负责,而是由一个外部的容器(比如 Spring 容器)来负责管理。如许一来,对象 A 得到依赖对象 B 的过程被反转了,控制权从对象 A 转移到了外部容器,这就是 “控制反转” 名称的由来。
IoC 容器负责创建对象、管理对象的生命周期,并在得当的时候将对象注入到需要它们的其他对象中。应用程序中的各个组件(对象)只需要关注自身的业务逻辑,而不需要关心依赖对象的创建和获取过程。容器会根据配置信息(如 XML 配置文件或注解)来确定对象之间的依赖关系,并自动完成对象的实例化和注入。
XML 配置:在 Spring 早期,XML 是配置 Bean 的主要方式。通过编写 XML 文件,**将 Bean 的定义信息(如 Bean 的类名、依赖关系、属性值等)与 Bean 的实现类分脱离来。**如许做的好处是可以在不修改实现类代码的情况下,修改 Bean 的配置信息,便于对系统举行维护和扩展。但缺点是 XML 文件可能会变得冗长复杂,增加了配置的难度和维护成本。
注解配置:随着 Spring 框架的发展,注解配置逐渐流行起来。使用注解(如 @Component、@Service、@Repository、@Autowired 等)可以直接在实现类中定义 Bean 的信息和依赖关系,将 Bean 的定义和实现合二为一。这种方式淘汰了大量的 XML 配置,使得代码更加轻便,开辟服从更高,实现了所谓的 “零配置”(或者说淘汰了显式配置)。
相关
ApplicationContext 接口,工厂的接口,使用该接口可以获取到详细的 Bean 对象。该接口下有两个详细的实现类。
ClassPathXmlApplicationContext,加载类路径下的 Spring 配置文件。(注:ClassPathXmlApplicationContext在读取application.xml文件时,就会自动创建bean实例)
FileSystemXmlApplicationContext,加载当地磁盘下的 Spring 配置文件。
Spring 框架的 Bean管理的配置文件方式
id 属性
id 属性为每个 Bean 提供了一个唯一的标识符。
class 属性
class 属性指定了 Bean 对象的全限定类名。在这个例子中,com.example.service.UserService 就是 UserService 类的完整路径,Spring 容器会根据这个路径来创建相应的 Bean 实例。