Spring IoC容器

Posted by BY on July 20, 2018

接口

  • 用于沟通的中介物的抽象化
  • 实体把自己提供给外界的一种抽象化说明,用以由内部操作分离初外部的沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式
  • 对应Java接口即生命,声明了哪些方法是对外公开提供的
  • 在Java 8中,接口可以拥有方法体

面向接口编程

  • 结构设计中,分清层次及调用关系,每层只向外(上层)提供一组功能接口,各层间仅依赖接口而非实现类
  • 接口实现的变动不影响各层间的调用,这一点在公共服务中尤为重要
  • 面向接口编程中的接口是用于隐藏具体 实现和实现多态性的组件

什么是IoC

  • IoC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护
  • DI(依赖注入)是其一种实现方式
  • 目的:创建对象并且组装对象之间的关系

拓展理解

2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是哪些方面的空指被反转了呢?,经过详细地分析和论证后,他得出了答案:获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是他给反转控制去了一个更合适的名字叫做依赖注入(Dependency Injection)。它的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象中

Bean容器初始化

  • 基础:两个包

——org.springframework.beans

——org.springframework.context

——BeanFactory提供和配置结构和基本功能,加载并初始化Bean

——ApplicationContext保存了Bean对象并在Spring中被广泛使用

  • 方式,ApplicationContext

——本地文件 ——Classpath ——Web应用中依赖servlet或Listener

Spring注入

  • Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为
  • 常用的两种注入方式

——设值注入

——构造注入

Bean

Bean配置项

  • Id Bean的唯一标识
  • Class 具体实例化的类
  • Scope 范围,作用域
  • Constructor arguments 构造器参数
  • Properties 属性
  • Autowiring mode 自动装配模式
  • lazy-initialization mode 懒加载模式
  • Initialization/destruction mothod 创建和销毁方法

Bean的作用域

  • singleton:单例,指一个Bean容器中只存在一份
  • prototype:每次请求(每次使用)创建新的实例,destroy方式不生效
  • request:每次http请求创建一个实例且仅在当前request内有效
  • session:同上,每次http请求创建,当前session内有效
  • global session:基于portlet的web中有效(portlet定义了global session),如果是在web中,同session

Bean的生命周期

  • 生命周期

——定义

——初始化

(1)实现org.springframework.beans.factory.InitializingBean接口,覆盖afterPropertiesSet方法

(2)配置init-mothod

——使用

——销毁

(1)实现prg.springframework.beans.factory.DisposableBean接口,覆盖destory方法

(2)配置destroy-method

  • 配置全局默认初始化、销毁方法

标签中,配置

——default-init-method

——default-destroy-method

Bean的自动装配(Autowiring)

  • No:不做任何操作
  • byName:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
  • byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什事都不发生
  • Constructor:与byType方式类似,不同之处在于它应用与构造器参数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常

Bean装配之Resource

  • Resource 针对于资源文件的统一接口

——UrlResource:URL对应的资源,根据一个URL地址即可构建

——ClassPathResource:获取类路径下的资源文件

——FileSystemResource:获取文件系统里面的资源

——ServletContextResource:ServletContext封装的资源,用于访问ServletContext环境下的资源

——InputStreamResource:针对于输入流封装的资源

——ByteArrayResource:针对于字节数组封装的资源

  • ResourceLoader ——所有的application context都实现了ResourceLoader接口,并且因此所有的application context都可以被用来去获得资源实例(Resource instances)
public interface ResourceLoader {
    Resource getResource(String location);
}

Resource template = ctx.getResource("some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("file:/some/resource/path/myTemplate.txt");
Prefix Example Explanation
classpath: classpath:com/myapp/config.xml Loaded from the classpath
file: file:/data/config.xml Loaded as a URL, from the filesystem
http: http://myserver/logo.png Loaded as a URL
(none) /data/config.xml Depends on the underlying ApplicationContext