zoukankan      html  css  js  c++  java
  • 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声明了销毁方法,该方法也会被调用。

  • 相关阅读:
    06 is和==的区别 encode()编码 decode()解码
    05 dic的增删改查 字典的嵌套 考试题dic.get()的相关使用
    03 编码 int ,bool,str的常用操作 主要讲str
    01 基本数据类型 变量 if语句
    04 列表的增删改查 常用方法 元祖 range
    02 while循环 格式化输出 运算符
    多校2 Harmonious Army hdu6598 网络流
    P3159 [CQOI2012]交换棋子 网络流
    P2172 [国家集训队]部落战争 最大流
    P2402 奶牛隐藏 网络流
  • 原文地址:https://www.cnblogs.com/shirui/p/9375135.html
Copyright © 2011-2022 走看看