Spring的IoC框架

容器的含义

Spring中的ApplicationContext继承自BeanFactory, 除了提供了BeanFactory的功能外,还额外提供了依赖管理,消息、生命周期监听等等功能,它就是所谓的“容器”

Bean定义

Bean在容器的定义由BeanDefinition定义. 具体的内容包括:

  • 完整的类名
  • 类的依赖关系
  • 类的生命周期回调
  • 类的其它属性

bean的命名

  • 每个Bean可以由一个id, 多个name来命名;必要的时候还可以通过alias来定义别名
  • 对于没有声明名称的bean,spring容器会自动为它生成一个名称,生成的名称遵循Java规范,将类名的首字母小写,而后遵守camelCase原则

Bean的初始化

从BeanDefinition的内容中可以看出,bean的类名是不可缺少的元素,在spring的配置中,这个属性是通过class属性来定义的. 可以通过三种方式来指定class属性的值:

  • 直接指定由容器创建的类名,这种情况有点类似于用new操作符直接生成对象
  • 通过其它类的静态工厂方法生成相应的类,这种情况下,class方法为静态类的类名,而通过factory-method指定的静态方法返回的对象类型由为实际生成的对象类型.

As a rule, use the prototype scope for all stateful beans and the singleton scope for stateless beans.

  • 通过其它类的方法生成相应的类,这种情况下,class属性的值为空,factory-bean为带有生成方法的对象名,factory-method为生成相应对象的方法名,而真正定义的对象类型则为factory-method返回的类型. 这种方法与类的静态方法生成bean对象基本类似,只不过前一种是通过静态类方法实现,而这种是通过对象方法实现.

依赖注入

在Spring的语境中,依赖注入是指在容器中生成相应的对象后,由容器根据配置信息自动完成bean之间依赖关系的注入,而不是由bean自己去维护和管理相应的依赖关系的做法。在spring中,可以通过两种方式进行依赖注入,通常情况下,通过构造函数进行那些必须的依赖关系的注入,而使用setter方法完成那些可选的依赖关系的注入.

1. 构造函数

使用构造函数完成依赖注入与使用带有参数的静态类工厂方法来实现依赖注入是一样的道理,因此在后面的描述中,不对这两种情况进行更多的区分. 使用构造函数完成依赖注入的时候,需要完成参数类型的解析.

  • 在类型不会千万歧义的情况下(即所有参数的类型都不相同),提供的参数会自动按照相应的类型提供给相应的构造函数,而不需要显式地指定参数的位置
  • 但是如果遇到无法自动完成类型的解析时,则可以通过type属性显式地指定参数的类型
  • 也可以通过index参数直接指定参数的位置,这样提供的bean将会作为第index个构造参数提供给构造方法

2. setter方法

顾名思义,setter方法就是在spring构造完对象后(通常是调用类的无参数构造函数或静态类的不带参数的方法生成的),通过set方法完成相应属性的注入.

依赖注入配置的细节

  • 在配置文件中,属性的值总是通过string类型进行表达的,但实际上的参数类型并不一定是string,两者之间的转换可以通过ConversionService来完成
  • 可以通过p命名空间很方便地实现属性地赋值
  • 通过idref标签可以引用到相应的bean,这种引用方式让容器可以在部署的时候就检查引用的对象是否真实存在,而不是等到运行时再检查

作用域

  • singleton: 每个容器单实例
  • prototype: 原型,每次请求时都会创建一个新的实例; 在这种作用域情况下,容器只负责初始化bean,一旦初始化结束,容器就不再管理这个bean,后续的维护包括资源的回收等问题,全部交由客户端自行维护,因此对于这种作用域的对象来讲,它的析构函数并不会被容器调用,如果客户端需要执行这些操作,可以考虑使用PostProcessor接口来完成.
    另外,如果在singleton作用域的对象中注入了prototype对象,这种引用关系是在初始化的时候就引入了. 这意味着,当singleton对象被初始化完之后,内部的prototype类型的对象就不会再发生变化; 因为初始化操作只会发生一次,如果需要在运行时每次获取新的prototype对象,则需要spring提供的’方法注入’方式来解决
  • application: 每个servletContext一个实例,它与singleton的区别在于它的范围是servletContext, 而singleton是在容器范围
  • request: 每个请求一个实例
  • session: 每个会话一个实例
  • globalSession, webSocket: 前者是用于PortletServlet,后者用于webSocket,略

原文:大专栏  Spring的IoC框架

原文地址:https://www.cnblogs.com/petewell/p/11615079.html

时间: 2024-10-10 21:58:04

Spring的IoC框架的相关文章

大话spring.net之IOC框架的简单搭建

讲了这么多理论,我们来手动实现一个简易的IoC框架的,这样可以加深IoC的理论知识. 一.思路 在我们使用Spring.NET框架的时候,首先需要实例化Spring.NET容器, 然后调用IoC容器IObjectFactory接口中GetObject方法获取容器中的对象.通过这一点就可以告诉我们制作IoC容器需要写一个获取XML文件内容的方法和申明一个Dictionary<string, object>来存放IoC容器中的对象,还需要写一个能从Dictionary<string, obj

Spring.net-简易的IoC框架

两个类: public class Person { public string Name { get; set; } public int Age { get; set; } } public class PersonDao {     private int intpro;     public PersonDao(int intpro)    {        this.intpro = intpro;    }    public Person Entity { get; set; } 

从零开始手写 spring ioc 框架,深入学习 spring 源码

IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过. 但是 spring 源码存在一个问题,那就是过于抽象,导致学习起来成本上升. 所以本项目由渐入深,只实现 spring 的核心功能,便于自己和他人学习 spring 的核心原理. spring 的核心 Spring 的核心就是 spring-beans,后面的一切 spring-boot,spr

Spring之IOC容器注入

上一篇做了IOC和AOP的原理介绍,这一篇主要讲解IOC的注入.不过我依然困惑一个问题: 一 : 依赖注入(DI)中有三种注入方式,那Spring中到底实现了几种方式?也是三种? IOC在很多框架中都有实现,并不是Spring特有的,之前说过IOC主要包含DL(Dependency Lookup)和DI(Dependency Injection),也就是说实现IOC的技术有很多,但是主要包含DI和DL,但是相对而言,DI应用范围比较广泛,我想这也是为什么Martin Fowler将控制反转用依赖

Struts2+Spring+Hibernate 三大框架的合并集成

这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样.  首先看一下分工吧: Struts2做的MVC的流程框架,主要完成从客户端访问到选择action的过程,其中过滤器起到了Controller的作用,action属于model,而jsp则是view页面的展示. Spring主要利用Ioc的特长来管理各种对象:action,service,dao,数据访问源,H

Spring的Ioc

引用:http://www.cnblogs.com/xdp-gacl/p/4249939.html 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框

Spring的IOC原理

1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针.分针和秒针顺时针旋转,从而在表盘上产生正确的时间.图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务.我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组

来,咱们自己写一个Android的IOC框架!

到目前位置,afinal开发框架也是用了好几个月了,还记得第一次使用注释完成控件的初始化和事件绑定的时候,当时的心情是多么的兴奋- -代码竟然可以这样写!然后随着不断的学习,也慢慢的对IOC框架和注解反射等东西有了一点简单的了解,之前的一篇文章简单的介绍了一下Java的反射机制,今天的文章,就完成一个简单的,基于IOC的小Demo,让大家慢慢的对IOC有一点简单的了解. 首先,什么是IOC呢? 控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来

为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架 由struts2迁移到springMVC,我突然有了一个新的疑问无法得到正确的解释,为什么我们现在做java的web开发,会选择struts2或 者springMVC这样的框架,而不是使用servlet加jsp这样的技术呢?特别是现在我们web的前端页面都是使用velocity这样的模板语 言进行开发,抛弃了jsp,这样的选择又会给我们java的web开发带