程序员

Spring IOC 容器

2018-04-21  本文已影响0人  小螺钉12138

1.概念

对于软件来说,调用类依赖于某一接口的实现类。但是现在将控制权从调用类移除,转而由第三方决定,即由Spring容器借由Bean配置来进行控制。

调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。

2.Java反射的基本知识

Java语言允许通过程序化的方式间接对Class进行操作。Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息,如构造函数、属性和方法等。Java允许用户借由这个与Class相关的元信息对象间接调用Class对象的功能。

反射的步骤

Java反射机制

3.资源访问利器

3.1资源访问接口

Spring设计了一个Resource接口,它能够提供更强的底层资源访问

访问类路径下的web应用的三种方式

public static void main(String[] args) throws IOException {
        String filePath = "I:/网络资源/Idea--space/SpringDemo/src/main/resources/test_input.txt";
        //使用系统文件路径方式加载文件
        WritableResource res1 = new PathResource(filePath);
        //使用类路径方式加载文件
        Resource res2 = new ClassPathResource("resources/test_input.txt");
        //使用WritableResurce接口写资源文件
        OutputStream stream1 = res1.getOutputStream();
        stream1.write("欢迎光临\n小春论坛".getBytes());
        stream1.close();
        //使用Resource接口读资源文件
        InputStream in1 = res1.getInputStream();
        //InputStream in2 = res2.getInputStream();
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        int i;
        while((i=in1.read())!=-1){
            baos.write(i);
        }
        System.out.println("res1"+res1.getFilename());
        System.out.println("res2"+res2.getFilename());


    }
    
public static void main(String[] args) throws IOException {
    //当系统加载时默认采用系统编码读取资源内容,如果资源采用特殊的编码格式可以通过EncodedResource对资源进行编码,以保证资源内容操作的正确性
    String filePath = "I:/网络资源/Idea--space/SpringDemo/src/main/resources/test_input.txt";
    //使用系统文件路径方式加载文件
    WritableResource res1 = new PathResource(filePath);
    //Resource res = new ClassPathResource("resources/test_input.txt");
    EncodedResource encRes=new EncodedResource(res1,"utf-8");
   String content= FileCopyUtils.copyToString(encRes.getReader());
    System.out.println(content);
}

3.2资源加载

Spring 提供了一个强大的加载资源的机制,不但可以通过"classpath:"、"file:"等资源前缀识别不同的资源类型,还支持带Ant风格带通配符的资源地址(可以在不显示使用Resource实现类的情况下,仅通过资源地址的特殊标识符就可以访问相应的资源)

地址前缀 对应的资源类型
classpath: 从类路径中加载资源,classpath:和classpath:/是等价的
file: 使用UrlResource从文件系统目录中装载资源,可采用绝对或相对路径
http: 使用UrlResource从Web服务器中装载资源
ftp: 使用UrlResource从FTP服务器中装载资源
没有前缀 根据ApplicationContext的具体实现采用对应类型的Resource

Ant风格的资源配置地址支持3种匹配符

4、BeanFactory和ApplicationContext

Spring 通过一个配置文件描述Bean和Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。Spring的IOC容器在完成这些底层工作的基础上,还提供了Bean实例缓存,声明周期管理,Bean实例代理,事件发布,资源装载等高级服务。我们一般称BeanFactory为IOC容器,而称ApplicationContext为应用上下文。

对于两者的用途,我们可以进行简单的划分:BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者,几乎所有的使用场合都可以直接使用ApplicationContext而非底层的BeanFactory

4.1.BeanFactory介绍

接口中最重要的方法getBean(String beanName),该方法从容器中返回特定名称的
bean

和BeanFactory有关的接口说明

4.2.ApplicationContext介绍

ApplicationContext类体系结构,ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从系统中中装载配置文件,扩展BeanFactory的功能的相关接口

ConfigurableApplicationContext扩展与ApplicationContext,它新增了两个主要的方法:refresh和close。在应用上下文关闭的情况下调用refresh可以启动应用上下文,在已经启动的状态下调用可以清楚缓存,并重新装载配置信息,调用close则可以关闭应用上下文。

4.3.WebApplicationContext类体系结构

WebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化工作,从WebApplicationContext中可以获得ServletContext的引用,整个Web应用的上下文对象将作为属性放置到ServletContext中,以便Web应用环境可以访问Spring上下文。Spring专门为此提供了一个工具类WebApplicationContextUtils,通过该类的getWebApplicationContext(ServletContext sc)方法,可以从Ser
vletContext中获取WebApplicationContext实例。

WebApplicationContext的初始化不同于BeanFactory和ApplicationContext,因为WebApplicationContext需要ServletContext实例,也就是说,它必须在拥有Web容器的前提下才能完成启动工作。

5、父子容器

Spring的IOC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器中的Bean。

5.1.Bean的生命周期

BeanFactory中Bean的生命周期,具体的调用过程如下

Bean的完整生命周期从实例化Bean开始,到销毁Bean,其中经过了许多关键点,这些关键点大致可以分为4类

上一篇下一篇

猜你喜欢

热点阅读