资讯专栏INFORMATION COLUMN

Spring IoC学习总结

silencezwm / 1513人阅读

摘要:学习总结学习整理的一些笔记,很简单。大部分认为和只是不同的叫法而已。依赖注入的两种方式和注解使用注释驱动的功能源码剖析

Spring IoC学习总结

学习spring Ioc整理的一些笔记,很简单。分享给大家。

IoC 基本概念

在这之前,我们先记住一句话。好莱坞原则:Don"t call us, we will call you.
其实这句话很恰当地形容了“反转”的意味;
Ioc, Inversion of Control,控制反转,它还有一个别名叫“依赖注入”(DI Dependency Injection)。IoC不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”

谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

还有一个概念:DI 依赖注入。大部分认为IoC和DI只是不同的叫法而已。
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么

谁依赖于谁:当然是应用程序依赖于IoC容器;

为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

Spring IoC

我理解的spring IoC分为两部分:Bean实例的创建依赖注入

Spring IoC容器如何实例化Bean呢?传统应用程序可以通过new和反射方式进行实例化Bean。而Spring IoC容器则需要根据Bean定义里的配置元数据使用反射机制来创建Bean。(大家可以了解一下Java的反射机制,这是Spring Ioc实现Bean实例化的核心机制)在Spring IoC容器中根据Bean定义创建Bean主要有以下几种方式:

使用构造器实例化Bean 有参/无参

使用静态工厂实例化Bean

使用实例工厂实例化Bean

  
  
      
   
  
  
      
 

  
  
       


  
  
  
  
   

另外,静态工厂和实例工厂方法还有对应的静态工厂类和实例工厂类

/**
*   静态工厂类
*
**/
public class DemoStaticFactory {  
    //工厂方法  
       public static HelloApi newInstance(String message) {  
              //返回需要的Bean实例  
           return new Demo(message);  
}  
}  

/**
*   实例工厂类
*
**/
package com.java.spring;  
public class DemoInstanceFactory {  
public HelloApi newInstance(String message) {  
          return new Demo(message);  
   }  
} 

这一块补充一个细节。Spring什么时候实例化bean,首先要分2种情况:

第一:如果你使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化

第二:如果你使用ApplicationContext作为Spring Bean的工厂类,则又分为以下几种情况:

   (1):如果bean的scope是singleton的,并且lazy-init为false(默认是false,所以可以不用设置),则ApplicationContext启动的时候就实例化该Bean,并且将实例化的Bean放在一个map结构的缓存中,下次再使用该Bean的时候,直接从这个缓存中取 
   (2):如果bean的scope是singleton的,并且lazy-init为true,则该Bean的实例化是在第一次使用该Bean的时候进行实例化 
   (3):如果bean的scope是prototype的,则该Bean的实例化是在第一次使用该Bean的时候进行实例化 

通常使用ApplicationContext作为容器的。

使用@Autowire注解注入的时机则是容器刚启动的时候就开始注入;注入之前要先初始化bean;
ApplicationContext 的初始化和BeanFactory 有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean 时才实例目标Bean;而ApplicationContext 则在初始化应用上下文时就实例化所有单实例的Bean。

了解Bean的实例化后,接下来就是Bean实例之间的关系,也就是依赖注入;
Spring IoC容器的依赖有两层含义:Bean依赖容器容器注入Bean的依赖资源

Bean依赖容器:也就是说Bean要依赖于容器,这里的依赖是指容器负责创建Bean并管理Bean的生命周期,正是由于由容器来控制创建Bean并注入依赖,也就是控制权被反转了,这也正是IoC名字的由来,此处的有依赖是指Bean和容器之间的依赖关系。

容器注入Bean的依赖资源:容器负责注入Bean的依赖资源,依赖资源可以是Bean、外部文件、常量数据等,在Java中都反映为对象,并且由容器负责组装Bean之间的依赖关系,此处的依赖是指Bean之间的依赖关系,可以认为是传统类与类之间的“关联”、“聚合”、“组合”关系。

Spring IoC容器注入依赖资源主要有以下两种基本实现方式:

构造器注入:就是容器实例化Bean时注入那些依赖,通过在在Bean定义中指定构造器参数进行注入依赖,包括实例工厂方法参数注入依赖,但静态工厂方法参数不允许注入依赖;

setter注入:通过setter方法进行注入依赖;

一、构造器注入:
1)常量值

 
常量

2)引用


二、setter注入:
1)常量值


常量

2)引用


3)数组:

  
      
        1  
        2  
        3  
      
  

4)列表:

  
      
        1  
        2  
        3  
      
  

5)集合:

  
      
        1  
        2  
        3  
      
  

6)字典



    
    



    键常量值常量
    

7)Properties

另外,基于注解驱动的Spring Ioc的原理以及Spring IoC源码剖析相关我在在网上找到一些文章,大家也可以看一下。
Spring依赖注入的两种方式xml和注解
使用注释驱动的Ioc功能
Spring IoC源码剖析

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67521.html

相关文章

  • 慕课网_《Spring入门篇》学习总结

    摘要:入门篇学习总结时间年月日星期三说明本文部分内容均来自慕课网。主要的功能是日志记录,性能统计,安全控制,事务处理,异常处理等等。 《Spring入门篇》学习总结 时间:2017年1月18日星期三说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://git...

    Ververica 评论0 收藏0
  • Spring IOC知识点一网打尽!

    摘要:使用的好处知乎的回答不用自己组装,拿来就用。统一配置,便于修改。 前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工厂模式,总的来说还是非常值得的! 本来想的是刷完《Spring 实战 (第4版)》和《精通Spring4.x 企业应用开发实战》...

    djfml 评论0 收藏0
  • 零基础带你看Spring源码——IOC控制反转

    摘要:依赖注入是向某个类或方法注入一个值,其中所用到的原理就是控制反转。但发现更多时间是在调和的源码。里面就是从中取出这个,完成控制反转的。控制反转的优点最后来以我个人观点谈谈控制反转的优点吧。控制反转为了降低项目耦合,提高延伸性。 本章开始来学习下Spring的源码,看看Spring框架最核心、最常用的功能是怎么实现的。网上介绍Spring,说源码的文章,大多数都是生搬硬推,都是直接看来的...

    wing324 评论0 收藏0
  • Spring IOC 容器源码分析系列文章导读

    摘要:本文是容器源码分析系列文章的第一篇文章,将会着重介绍的一些使用方法和特性,为后续的源码分析文章做铺垫。我们可以通过这两个别名获取到这个实例,比如下面的测试代码测试结果如下本小节,我们来了解一下这个特性。 1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本。经过十几年的迭代,现在的 Spring 框架已经非常成熟了...

    NSFish 评论0 收藏0
  • 面试官:“谈谈Spring中都用到了那些设计模式?”。

    摘要:会一直完善下去,欢迎建议和指导,同时也欢迎中用到了那些设计模式中用到了那些设计模式这两个问题,在面试中比较常见。工厂设计模式使用工厂模式可以通过或创建对象。 我自己总结的Java学习的系统知识点以及面试问题,已经开源,目前已经 41k+ Star。会一直完善下去,欢迎建议和指导,同时也欢迎Star: https://github.com/Snailclimb... JDK 中用到了那...

    Astrian 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<