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. 636. Exclusive Time of Functions 进程的执行时间

    [抄题]: Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU ...

  2. 泛型、反射和抽象工厂结合解决多DB问题

  3. scala开发环境

    1. Intellij IDEA Scala开发环境搭建 Intellij IDEA 15.0.3 默认配置里面没有Scala插件,需要手动安装,在Intellij IDEA 15.0.3 第一次运行 ...

  4. Linux编程实现蜂鸣器演奏康定情歌

    Linux编程实现蜂鸣器演奏康定情歌 摘自:https://blog.csdn.net/jiazhen/article/details/3490979   2008年12月10日 15:40:00 j ...

  5. Linux 上安装 rlwrap

    1.安装rlwrap的初衷; 2.安装rlwrap工具和遇到的问题; 3.使用rlwrap 工具; 1.安装rlwrap的初衷: 在Windows 下使用SQLPLUS都是可以使用上下左右方向键前后左 ...

  6. JS中关于位置和尺寸的api

    HTMLElement.offsetParent 由于offsetTop 和 offsetLeft 都是相对于 offsetParent 内边距边界的,故offsetParent的意义十分重大.off ...

  7. Smarty的基本语法------变量调节器

    (1)首字母大写capitalize示例:{$articleTitle|capitalize}(2)字符串连接 cat示例:{$articleTitle|cat:" yesterday.&q ...

  8. Perl 学习笔记-列表和数组

    笔记来自<<Perl语言入门第5版>> 1. Perl中列表指标量的有序集合,数组则是存储列表的变量, 这两个术语经常混用,不过更精确地说,列表指数据,而数组指变量.数组的表示 ...

  9. osgQt支持触摸屏

    1. osgQt的构造函数添加:setAttribute(Qt::WA_AcceptTouchEvents);//wyh 2. event()修改,支持触摸时间 bool GLWidget::even ...

  10. #2002 无法登录 MySQL 服务器

    phpMyAdmin无法登录,输入用户名和密码后点击“执行”后一直报 “#2002 无法登录 MySQL 服务器”. 解决办法,将 “phpMyAdmin/libraries”文件夹下的config. ...