目录
1、控制反转(IoC)
什么是控制反转
IoC与IoC容器的关系
Spring框架的控制反转
2、Bean
注解:
3、DI
4、总结
1、控制反转(IoC)
什么是控制反转
IoC(Inversion of Control,控制反转)是一种编程思想,其核心是将传统上由程序代码直接操控的对象调用权交给一个容器(外部实体),通过这个容器来实现对象的创建、装配和管理。在IoC中,对象的依赖关系不再由对象自身负责,而是由IoC容器来管理。
IoC的主要目的是降低代码之间的耦合度,提高代码的可维护性、可测试性和可扩展性。通过IoC,对象在被创建的时候,其依赖的对象的引用会被外界实体(IoC容器)注入到对象中,即依赖被注入到对象中。这种依赖注入的方式使得对象不需要关心其依赖项的具体实现,只需要关注其接口和功能,从而实现了对象之间的解耦。
IoC的实现方式多种多样,其中最常见的是依赖注入(Dependency Injection,简称DI)。依赖注入是指在创建对象时,将其依赖的其他对象(或依赖项)通过构造函数、属性或接口方法等方式注入到目标对象中。这样,目标对象就不需要负责自己的依赖项的创建和管理,而是由IoC容器来负责。
IoC与IoC容器的关系
IoC容器是实现IOC思想的具体工具或平台。没有IoC容器,也可以实现IOC思想,但可能需要更多的手动配置和代码编写。而IoC容器则通过自动化和配置化的方式,使得IOC思想的实现更加简单和高效。
在使用IoC容器时,通常会将对象的创建、配置和依赖注入等任务交给容器来管理,从而实现代码的解耦和复用。这样可以更加专注于业务逻辑的实现,而无需关心对象的创建和管理等细节。
Spring框架的控制反转
在Spring框架中,IoC(Inversion of Control,控制反转)是一种核心的设计思想,它降低了类与类之间的依赖程度,使得代码更加灵活和易于测试。通过IoC,Spring容器负责创建对象实例、管理对象的生命周期,并自动处理对象之间的依赖关系。
具体来说,Spring IoC容器实现了IoC思想,它负责对象的创建、装配以及生命周期管理。这意味着,开发者不再需要在代码中显式地通过new关键字来创建对象实例,而是将对象的创建和管理交给Spring容器来处理。IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。Spring容器会根据配置(通常是通过XML配置文件或注解)自动创建对象实例,并将它们装配在一起,形成完整的应用程序。
在Spring中,IoC的实现主要依赖于依赖注入(Dependency Injection,DI)机制。依赖注入是指Spring容器在创建对象时,将其所依赖的其他对象(也称为依赖项)注入到该对象中。这样,对象就不需要显式地创建其依赖项,而是由Spring容器负责创建和注入。IoC 的思想就是两方之间不互相依赖,由第三方容器来管理相关资源。
Spring提供了多种实现IoC的方法,包括:
- 注解方式:通过在类或方法上添加注解(如@Autowired、@Resource等),告诉Spring容器需要进行依赖注入的对象或方法。
- XML配置方式:在XML配置文件中配置bean的信息,包括bean的id、class、依赖关系等。Spring容器会读取这些配置信息,并据此创建和管理对象。
- 自动扫描方式:通过配置自动扫描的包路径,Spring容器会自动扫描指定包下的类,将其注册为bean,并进行依赖注入。
2、Bean
IOC容器的作用以及内部存放的是什么?
IOC容器负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象。被创建或被管理的对象在IOC容器中统称为Bean,IOC容器中放的就是一个个的Bean对象。
在Spring框架中,Bean是一个由Spring IoC容器实例化、配置和管理的对象。Bean是一个被Spring管理的Java对象,它是一个完整的对象,拥有属性和对应的方法。org.springframework.beans
和 org.springframework.context
这两个包是 IoC 实现的基础。
注解:
@Component | 通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用 |
@Repository | 对应持久层即 Dao 层,主要用于数据库相关操作。 |
@Service | 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。 |
@Controller | 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。 |
@Component
注解作用于类,而@Bean
注解作用于方法。
3、DI
依赖注入:在容器中建立bean与bean之间的依赖关系的过程。
当IOC容器中创建好service和dao对象后,程序能正确执行么?
不能,因为service运行需要依赖dao对象。IOC容器中虽然有service和dao对象,但是service对象和dao对象没有任何关系,需要把dao对象交给service,也就是要绑定service和dao对象之间的关系。像这种在容器中建立对象与对象之间的绑定关系就要用到DI(Dependency Injection)依赖注入。
IOC容器中哪些bean之间要建立依赖关系?
要根据业务需求提前建立好关系,如业务层需要依赖数据层,service就要和dao建立依赖关系。
4、总结
- IOC:控制反转,控制反转的是对象的创建权。
- DI:依赖注入,绑定对象与对象之间的依赖关系。
- IOC容器:Spring创建了一个容器用来存放所创建的对象,这个容器就叫IOC容器。
- Bean:容器中所存放的一个个对象就叫Bean或Bean对象。
IoC与DI的共同目标是充分解耦,具体实现是使用IoC容器管理bean。在IoC容器内将有依赖关系的bean进行关系绑定(DI) 。最终结果为:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系。