Spring_总结_02_依赖注入

一、前言

本文承接上一节: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声明了销毁方法,该方法也会被调用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏精讲JAVA

关于Spring底层原理面试的那些问题,你是不是真的懂Spring?

Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员...

2.4K30
来自专栏Android开发与分享

【Android】Retrofit 2.0 的使用一、概述二、原理二、使用

一、概述 Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库。来自官网的介绍: A type-safe HTT...

44950
来自专栏java思维导图

Spring思维导图,让Spring不再难懂(ioc篇)

写在前面 写过java的都知道:所有的对象都必须创建;或者说:使用对象之前必须先创建。而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对象...

42780
来自专栏扎心了老铁

zookeeper curator使用caches实现各种监听

1、篇首语 curator是zookeeper的一个高级api开发包。封装了zookeeper众多的recipes,并且实现了一些新的recipes原语,最重要...

58750
来自专栏JetpropelledSnake

Python入门之Python中的logging模块

基本用法 下面的代码展示了logging最基本的用法。 import logging import sys # 获取logger实例,如果参数为空则返回ro...

30580
来自专栏冷冷

Spring 必知概念(二)

13、Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要...

22590
来自专栏CSDN技术头条

给你一份超详细 Spring Boot 知识清单

在过去两三年的 Spring 生态圈,最让人兴奋的莫过于 Spring Boot 框架。Spring Boot 应用本质上就是一个基于 Spring 框架的应用...

67620
来自专栏java学习

你竟敢说你懂Spring框架?有可能你是没看到这些...(上)

所以,特地去搜刮了一些关于spring的面试题,希望能帮助各位同学在升职加薪的路上,一去不复返。

13620
来自专栏深度学习计算机视觉

Spring常见面试题整理

1.什么是Spring? Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的...

1.5K40
来自专栏Java3y

Spring IOC知识点一网打尽!

20080

扫码关注云+社区

领取腾讯云代金券