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. svn配置多仓库与权限控制

    telnet: connect to address 47.106.115.228: Connection refused svn执行上下文错误由于目标计算机积极拒绝无法连接 标签: svn 2017 ...

  2. SQL Server的聚集索引和非聚集索引

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)…… (一) ...

  3. VMware 桥接模式 复制物理网络连接状态的作用

    参考: https://docs.vmware.com/cn/VMware-Workstation-Pro/15.0/com.vmware.ws.using.doc/GUID-826323AD-D01 ...

  4. HUST数媒1501班第2周作业成绩公布

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

  5. [GO]使用bufio的文件读取方式

    package main import ( "os" "fmt" "bufio" "io" ) func ReadFil ...

  6. org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions:323) | Loading XML bean definitions from class path resource [

    今天遇到一个这样的错误,这个错误是说我的spring的框架的文档没有写正确.但是反复检查,文档没有错误,原因是我使用了自己只做的user library,而且使用了 下边的System library ...

  7. c#范型

    泛型介绍:范型类和范型方法同事具备可重用性.类型安全和效率,这是非范型类和非范型方法无法具备的. 所谓范型,即通过参数化类型实现同一份代码上操作多种数据类型,范型编程是一种编程范式,它利用“参数化类型 ...

  8. URAL 1430. Crime and Punishment(数论)

    题目链接 题意 :给你a,b,n,让你找出两个数x,y,使得n-(a*x+b*y)最小. 思路 : 分大小做,然后枚举a的倍数 #include <stdio.h> #include &l ...

  9. kalilinux-漏洞评估

    Nessus\OpenVAS http://www.tenable.com/products/nessus/select-your-operating-system http://www.nessus ...

  10. C# 调用带输入输出参数的存储过程

    //调用存储过程执行类似于2//select count(*) from userinfo where username=username and pwd=pwd and grade=grade3// ...