Ioc的理解:调用类对某一接口的实现类的依赖关系又第三方注入,以移除调用类对接口实现类的依赖。又叫做依赖注入。调用者对接口的选择权利被剥夺,交给了第三方。举个例子,学生本来可以选择哪个老师给他上课的,但是这个权利被学校剥夺了,由学校分配学生的老师是谁。

Ioc的类型:

  构造函数:将依赖的对象通过构造函数注入。第三方将需要的对象准备好,在创建对象时通过构造函数传参注入所需对象

  属性:声明依赖的对象,并提供setter/getter方法。第三方通过set方法注入。

  接口:将依赖的对象抽象到接口中,通过实现这个接口方法完成注入。第三方创建需要注入的对象后,通过调用接口方法实现注入。

容器完成注入工作:以上的实现都是由第三方创建所需的注入对象,我们想要把 new 的工作也去掉。

  Ioc原理:spring的实现是通过配置文件注入,原理是java的反射机制,根据类的全限定名找到文件并通过类加载加载并实例化。

  资源访问:加载配置文件

BeanFactory和ApplicationContext:

  BeanFactory面向spring容器底层,ApplicationContext面向开发人员

  BeanFactory:类工厂,创建并管理各种类的对象并交由Spring容器管理。BeanFactory位于顶端,下面提供了不同功能的实现。资源访问的相关类加载配置文件,然后将资源文件给BeanFactory装载,BeanFactory负责创建配置文件中指定的对象(创建的时机是第一调用的时候),并提供方法getBean得到对象。注意BeanFactory的初始化需要Log4j日志配置文件与jar包。

  ApplicationContext:由BeanFactory派生而来,实现了更多实际可用的功能。主要实现类是ClassPathXmlApplicationContext和FileSystemApplicationContext,分别从类路径和文件系统中加载配置文件。初始化ClassPathXmlApplicationContext时直接给定配置文件的路径(可以是多个配置文件,Spring将自动融合),然后就可以调用getBean获取实例了。注意ApplicationContext的初始化和BeanFactory有重大区别就是BeanFactory初始化时不会创建配置文件中的对象,知道第一次调用时才创建,但是ApplicationContext初始化 时就会创建配置文件中配置的对象。

  类注解的配置方式:@Configuration,在该注解的类中,提供实例化对象的方法并以@Bean(name="xxx")。使用ApplicationContext的实现类AnnotationApplicationContext并传入@Configuration注解的类,然后就可以调用getBean获取实例了。

  WebApplicationContext:从web根目录路径装载配置文件,WebApplicationContext可以获得ServletContext的引用,整个web应用上下文对象作为属性传入ServletContext中,为此Spring提供了一个WebApplicationContextUtils,通过该类的getWebApplicationContext(ServletContext sc),可以从ServletContext对象中获取WebApplicationContext。

  Bean的作用域:在非Web环境中,只有singleton和prototype。WebApplicationContext为Bean添加了三个作用域:request,session,global session。

  WebApplicationContext和ServletContext的融合:WebApplicationContext实现了ApplicationContext,并定义了一个常量ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,容器启动时,WebApplicationContext以它为键存放了ServletContext的属性列表,因此可以在web容器(Tomcat)中通过以下方式获取 WebApplicationContext:

WebApplicationContext wpc = ( WebApplicationContext ) ServletContext.getAttribute ( WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE );

  WebApplicationContext的初始化:必须在拥有web容器的前提下才能初始化WebApplicationContext,因为它的启动需要ServletContext,我们可以在web.xml中配置自启动的Servlet或者ServletContextListener,借助其中任何一个都可以启动WebApplicationContext。Spring对这两种方式都有相应的实现,分别是:org.springframework.web.context.ContextLoaderListener,org.springframework.web.context.ContextLoaderServlet。我们只需在web.xml中配置即可。同样的需要注意,WebApplicationContext的启动也需要Log4j配置信息。

  父子容器:通过HierarchicalBeanFactory接口,springIoc容器可以创建父子层级关联的容器体系,子容器可以访问符容器的Bean,在容器中,Bean的id必须唯一,但是子容器可以设置和父容器id相同的Bean。这提高了Spring的扩展性,第三方可以通过编程向已经存在的父容器中添加功能。比如SpringMVC,视图层Bean位于子容器中,这样视图层就可以引用业务层和持久层的Bean,但是业务层和持久层的Bean不可见视图层的Bean。

  Bean的生命周期:由多个特定的生命阶段组成,每个阶段都有一个接口,允许外界对Bean加以控制。我们可以从两个层面定义Bean的生命周期,一是Bean的作用范围,二是Bean经历的一系列阶段。

BeanFactory中Bean的生命周期:

  ApplicationContext中Bean的生命周期:

[spring] Ioc 基础的更多相关文章

  1. Spring IOC基础回顾 — 组件扫描和装配

    目录 注解形式配置应用IOC 1. 组件自动扫描 2. 组件依赖:为bean添加注解,实现自动注入 3. Spring IOC应用小结 注解形式配置应用IOC 在类定义.方法定义.成员变量定义前使用, ...

  2. Spring IOC基础

    2.1.1 IOC是什么IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的 ...

  3. Spring IOC基础使用

    先下载.导入核心jar包 编写Book类和CollectionUse类 package MyPackageOne; public class Book { private String title; ...

  4. Spring IOC的配置使用(转)

    转:http://www.cnblogs.com/linjiqin/p/3408306.html Spring IOC的配置使用 1.1.1 XML配置的结构一般配置文件结构如下: <beans ...

  5. Spring IOC的配置使用

    1.1.1 XML配置的结构一般配置文件结构如下: <beans> <import resource=”resource1.xml” /> <bean id=”bean1 ...

  6. Spring源码解析02:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  7. Spring源码解析 | 第二篇:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  8. Spring笔记:IOC基础

    Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...

  9. Spring 学习笔记 IoC 基础

    Spring IoC Ioc 是什么 IoC -- Inversion of Control(控制反转)什么是控制?什么是反转? 控制反转了什么? 在很早之前写项目不用 Spring 的时候,都是在 ...

随机推荐

  1. redis高可用 - 主从复制

    工作需要,调研了一下redis的复制实现.在2.8版本之前和之后,复制方式有所不同.2.8之前的复制方式对于初次复制数据没有问题,对于断连接重新复制比较耗性能,因为都是全量复制.2.8之后对断线重连做 ...

  2. Mysql Join语法以及性能优化

    引言 内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分.外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反 ...

  3. 908D New Year and Arbitrary Arrangement

    传送门 分析 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string ...

  4. 朴素贝叶斯算法的python实现-乾颐堂

    算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类别问题 缺点:对输入数据的准备方式敏感 适用数据类型:标称型数据 算法思想: 朴素贝叶斯 比如我们想判断一个邮件是不是垃圾邮件,那么我们知道的 ...

  5. paho_c_pub 使用方法

    Latest Paho Status (2) 摘自:http://modelbasedtesting.co.uk/ I last wrote about the state of Paho in Oc ...

  6. HUST软工1506班第2周作业成绩公布

    说明 本次公布的成绩对应的作业为: 第2周个人作业:WordCount编码和测试 如果同学对作业成绩存在异议,在成绩公布的72小时内(截止日期4月26日0点)可以进行申诉,方式如下: 毕博平台的第二周 ...

  7. Sublime Text 3 -mac简体中文汉化包下载及教程

    Sublime Text 3下载 官方下载地址:http://www.sublimetext.com/3 汉化包链接 1.将上面要求下载的sublime_text_3.zip 文件解压,得到的Defa ...

  8. 大佬福利之在你眼中 Web 3.0 是什么?(转)

    web 3.0 Web 3.0一词包含多层含义,用来概括互联网发展过程中某一阶段可能出现的各种不同的方向和特征.Web 3.0 充满了争议和分歧,它到底应该什么样?具体的标志点又是什么? Web 2. ...

  9. git的使用和一些命令

    1. https://github.com/ 在这个网站注册一个帐号. http://gitref.org/zh/creating/ 待会写.. [命令] a)

  10. Exception (2) Java Exception Handling

    The Java programming language uses exceptions to handle errors and other exceptional events.An excep ...