Spring_总结_02_依赖注入

简介: 一、前言 本文承接上一节:Spring_总结_01_Spring概述 在上一节中,我们了解了Spring的最根本使命、四大原则、六大模块以及Spring的生态。 这一节我们开始了解Spring的第二大原则中的依赖注入,这属于六大模块中的核心容器部分。

一、前言

本文承接上一节:Spring_总结_01_Spring概述

在上一节中,我们了解了Spring的最根本使命、四大原则、六大模块以及Spring的生态。

这一节我们开始了解Spring的第二大原则中的依赖注入,这属于六大模块中的核心容器部分。

 

二、基本概念

1.什么是依赖注入

(1)我们经常说的控制反转(Inversion of Control —IOC)和依赖注入(Dependency Injection—DI),在Spring 环境下是等同的概念。

(2)控制反转是通过依赖注入实现的。

(3)所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系。而不是通过对象本身负责自己的创建和解决自己的依赖。

 

2.依赖注入的本质

创建应用对象之间协作关系(依赖)的行为通常称为装配。这也是依赖注入的本质

 

3.依赖注入主要目的

依赖注入的主要目的是解耦

因为通过装配,对象间的依赖关系不再由对象维护,而是交给容器维护,降低了耦合度。

耦合具有两面性:

(1)紧密耦合的代码难以测试,难以复用,难以理解,并典型地表现出“打地鼠”式的bug特性。

(2)一定程度的耦合又是必须的——完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,不同的类必须以适当的方式进行交互。

总之,耦合是必须的,但应该被小心谨慎地管理(尽量降低耦合度)。

 

三、Spring容器

1.什么是Spring容器

容器是Spring的核心,是用来容纳所有bean的地方。

Spring 容器负责创建对象,装配对象,配置他们并管理他们的整个生命周期。

 

2.两种Spring容器

Spring自带了多个容器实现,可以归为两种不同类型:

(1)bean工厂

            (由BeanFactory接口定义)

是最简单的容器,提供基本的DI支持。(低级封装,功能一般)

(2)应用上下文

             (由ApplicationContext接口定义)

基于BeanFactory构建,并提供应用框架级别的服务。(高度封装,功能强大,推荐使用)

 

四、使用Spring应用上下文

Spring自带了多种类型的应用上下文。

 

1 AnnotationConfigApplicationContext 从一个或多个基于Java的配置类中加载Spirng应用上下文
2 AnnotationConfigWebApplicationContext 从一个或多个基于Java的配置类中加载Spring Web应用上下文。
3 ClassPathXmlApplicationContext 从类路径下的一个或多个XMl配置文件中加载上下文定义,把应用上下文的定义文件作为资源
4 FileSystemXmlapplicationContext 从文件系统下的一个或多个XML配置文件中加载上下文定义
5 XmlWebApplicationContext 从Web应用下的一个或多个XMl配置文件中加载上下文定义

 

 

1.从Java配置中加载上下文

        //1.从Java配置中加载配置,将Bean装载到应用上下文。
        ApplicationContext context=new AnnotationConfigApplicationContext(com.springaction.knights.config.KnightConfig.class);

 

 

2.从类路径加载上下文

 

        //1.从类路径下读取配置文件,将Bean装载到应用上下文。
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

 

 

3.从文件系统加载上下文

 

        //1.从文件系统读取配置文件,将Bean装载到应用上下文。
        ApplicationContext context=new FileSystemXmlApplicationContext("D:/applicationContext.xml");

 

 

应用上下文准备就绪之后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean.

 

 

五、Bean的生命周期

传统Java应用中,使用Java关键字 new 进行bean的实例化,然后bean就可以使用了。一旦该bean不再使用,则由Java自动进行垃圾回收。

理解了Spring bean 的生命周期,就能利用Spring提供的扩展点来自定义bean的创建过程。

 

 

 

 

 

在bean准备就绪之前,bean工厂执行了若干启动步骤:

(1)Spring对bean进行实例化

(2)Spring将值和bean的引用注入到bean对应的属性中

(3)如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法

(4)如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入

(5)如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来

(6)如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法

(7)如果bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。

(8)如果bean使用init-method声明了初始化方法,则会执行init-method配置的方法,

(9)如果bean实现了BeanPostProcessor接口,Spring将调用他们的postProcessAfterInitialization()方法

(10)此时,bean已经准备就绪了,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到该上下文被销毁。

(11)容器关闭

(12)如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。

(13)如果bean使用destroy-method声明了销毁方法,该方法也会被调用。

 

目录
相关文章
|
4月前
|
XML Java 测试技术
Spring Boot中的依赖注入和控制反转
Spring Boot中的依赖注入和控制反转
|
6月前
|
XML Java 程序员
Spring6框架中依赖注入的多种方式(推荐构造器注入)
依赖注入(DI)是一种过程,对象通过构造函数参数、工厂方法的参数或在对象实例构建后设置的属性来定义它们的依赖关系(即与其一起工作的其他对象)。
89 3
|
6月前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
61 0
|
3月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
51 0
|
3月前
|
设计模式 自然语言处理 Java
简单了解下Spring中的各种Aware接口实现依赖注入
在Spring框架中,Aware接口是一组用于提供特定资源或环境信息的回调接口。这些接口被设计用来允许Bean获取对Spring容器或其他相关资源的引用,并在需要时进行适当的处理。
36 2
|
3月前
|
自然语言处理 Java 开发者
简单了解下Spring中的各种Aware接口实现依赖注入
【8月更文挑战第21天】在Spring框架中,Aware接口系列是一种特殊的机制,它允许Bean在初始化过程中获取到Spring容器或容器中的特定资源,从而实现了更加灵活和强大的依赖注入方式。本文将围绕Spring中的各种Aware接口,详细探讨它们如何帮助开发者在工作和学习中更好地实现依赖注入。
104 0
|
4月前
|
缓存 Java Spring
Spring循环依赖问题之Spring不支持构造器内的强依赖注入如何解决
Spring循环依赖问题之Spring不支持构造器内的强依赖注入如何解决
|
5月前
|
设计模式 Java 测试技术
Spring Boot中的依赖注入详解
Spring Boot中的依赖注入详解
|
5月前
|
缓存 Java 测试技术
Spring 框架,不只是依赖注入和面向切面那么简单!
【6月更文挑战第25天】Spring框架超越DI和AOP,涵盖事务管理、数据访问抽象如`JdbcTemplate`、消息驱动支持如`@JmsListener`、缓存管理和测试工具。示例代码展示了其简化复杂性的能力,如自动事务处理、数据库操作及消息队列监听。Spring是构建高效企业级应用的全面解决方案。
38 4
|
5月前
|
Java Spring 容器
spring如何进行依赖注入,通过set方法把Dao注入到serves
spring如何进行依赖注入,通过set方法把Dao注入到serves