Ioc容器

  • IoC概述
  • 资源访问
  • BeanFactory和ApplicationContext
  • Bean的生命周期

IoC概述

IoC是Spring容器的内核,AOP、声明事物等功能在此基础上开花结果。
  1. IoC概念
    我的理解,多个类可以实现同一个接口,由配置来决定调用哪一个类来处理业务逻辑
    引用他人博客IoC概念

  2. IoC的类型
    IoC主要可以划分为三种类型:构造函数注入、属性注入和接口注入。SPring支持构造函数注入和属性注入

  3. 通过容器完成依赖关系注入
    通过new XmlBeanFactory(“xxx.xml”)等方式即可启动容器。Spring会根据配置文件的描述信息,自动实例化Bean并完成依赖关系的装配。


"http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:p="http://www.springframework.org/schema/p"   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">    
       id="actor" class="LiuDehua"/> 
       id="scenario" class="com.ioc.scenario" p:geli-ref="actor"/> 

资源访问

  1. 资源抽象接口

    Spring设计了一个Resource接口,它为应用提供了更强的底层资源访问能力。该接口拥有对应不同资源类型的实现类。资源加载时默认采用系统编码读取资源内容。

名称 功能
WritableResource 可写资源接口,是spring3.1 新加的接口有两个实现类FileSystemResource和PathResource其中Pathresource是spring4.0提供的实现类
ByteArrayResource 二进制数组表示的资源,二进制数组资源可以在内存中通过程序构建
ClassPathResource 类路径下的资源,以相对路径方式表示
FileResource 文件系统资源,通过系统路径的方式表示
InputStreamResource 以输入流返回表示的资源
ServletContextResource 访问web容器上下文中的资源而涉及的类
UrlResource 可以使用它访问文件系统的资源、Http资源、Ftp资源等
PathResource Spring4.0提供的读取资源文件的新类
如果资源文件采用特殊的编码格式,那么可以通过EncodedResource对资源进行编码,以保证资源内容操作的正确性。
Resource res = new ClassPathResource("conf/file1.txt");
EncodedResource encRes = new EncodedResource(res,"UTF-8");
String content = FileCopyUtils.copyToString(encRes.getReader());
System.out.println(content);  

2.资源加载

为了访问不同类型的资源,必须使用相应的Resource实现类,这是比较麻烦。Spring提供了一个强大的加载资源的机制,不但能够通过"classpaht:"、"file:"等资源地址前缀识别不同的资源类型,还支持Ant风格带通配符的资源地址。
  1. 资源地址表达式
    其中,和”classpath:”对应的还有一种比较难理解的”classpath*:”前缀。假设有多个jar包或文件系统类路径拥有一个相同的包名 (如com.test)”classpath:”只会在第一个加载的com.test包的类路径下查找,而”classpath*:”会扫描所有这些jar包及类路径下出现的com.test类路径。
地址前缀 示例 对应的资源类型
classpath: classpath:com/crm/test.xml 从类路径中加载资源classpath:和classpath:/是等价的,都是相对于类的根目录
file: file:/conf/com/crm/test.xml 使用UrlResource从文件系统目录中装载资源,可采用绝对或相对路径
http:// http://www.baidu.com/test.xml 使用UrlResource从Web服务器中装载资源
ftp:// ftp://www.baidu.com/test.xml 使用UrlResource从Ftp服务器中装载资源
没有前缀 com/crm/test.xml 根据ApplicationContext的具体实现类采用对应的Resource

2. Ant风格的资源地址支持三种匹配符

1. ?:匹配文件中的一个字符。
2. *:匹配文件中的任意字符。
3. **:匹配多层路径。

ps:用Resource操作文件时,如果资源配置文件在项目发布时会被打包到jar中,那么不能使用Resource#getFile()方法,否则会抛出FileNotFoundException。但可以使用Resource#getInputStream()方法读取。

BeanFactory和ApplicationContext

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

    1. BeanFactiry的类体系结构
      spring为BeanFactory提供了多种实现,最常用的是XMLBeanFactory,但在spring3.2中已被废弃,建议使用XMLBeanDefinitionReader、DefaultListableBeanFactory代替。
      下面对继承BeanFactory接口的接口进行说明
接口名称 功能说明
ListableBeanFactory 该接口定义了访问容器中Bean基本信息的若干方法,如Bean的个数、获取某一类型Bean的配置名、查看容器中是否包括某一Bean等
HierarchicalBeanFactory 父子级联IoC容器的接口,子容器可以通过接口方法访问父容器等
ConfigurableBeanFactory 这是一个重要的接口,增强了IoC容器的可定制性。他定义了设置类加载器、属性编辑器、容器初始化后置处理器等方法。
AutowireCapableBeanFactory 定义了将容器中的Bean按某种规则进行自动装配的方法。
SingletonBeanRegistry 定义了允许在运行期向容器注册单实例Bean的方法
BeanDefinitionRegistry Spring配置文件中每一个bean节点元素在spring容器里通过一个BeanDefinition对象表示,它描述了Bean的配置信息。而BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法。

2. 初始化BeanFactory

下面使用Spring配置文件为car提供配置信息,然后通过BeanFactory装载配置文件,启动SpringIoC容器


   "car1" class="com.smart.Car" init-method="myInit" destroy-method="myDestory"
         p:brand="红旗CA72"
         p:maxSpeed="200"/>
    @Test
    public void getBean() throws Throwable{
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource res = resolver.getResource("classPath:com/test/beans.xml");
        System.out.println(res.getURI());
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
        reader.loadBeanDefinitions(res);

        System.out.println("init BeanFactory");

        Car car = factory.getBean("car",Car.class);
        System.out.println("car bean is ready for user!");
        car.introduce();

    }
  1. ApplicationContext介绍

    ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。
    
     1. ApplicationContext类体系结构
     ApplicationContext的主要实现类是ClassPathXmlApplicationContext 和 FileSystemXmLApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件。
     和BeanFactory初始化相似,ApplicationContext的初始化也很简单。
     如果配置文件放置在类的路径下,则可以优先考虑使用ClassPathXmlApplicationContext实现类,对于ClassPathXmlApplicationContext来说"com/test/test.xml"等同于"classpath:com/test/test.xml"
    
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/test/test.xml");
如果配置文件在文件系统的路径下,则可以优先考虑使用FileSystemXmlApplicationContext实现类,对于FileSystemXmlApplicationContext来说"com/test/test.xml"等同于"file:com/test/test.xml"
ApplicationContext ctx = new FileSystemXmlApplicationContext("com/test/test.xml");

3.WebApplicationContext类体系结构

WebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化工作

     1. WebApplicationContext初始化
     通过Web容器监听器引导
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/test.xml,/WEB-INF/test1.xml
        </param-value>
    </context-param>
    <listener>
        <listener-   class>org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
通过自启动的servlet引导
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/test.xml,/WEB-INF/test1.xml
        </param-value>
    </context-param>
    <servlet>
        <servlet-name>springContextLoaderServlet</servlet-name>
        <servlet-calss>org.springframework.web.context.ContextLoaderServlet</servler-class>
        <load-in-startup>1</load-in-startup>
    </servlet>

Bean的生命周期

硬性知识不记录
引用他人博客

你可能感兴趣的:(java,spring)