zoukankan      html  css  js  c++  java
  • 二、IOC容器基本原理

    IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需在代码中new相关的对象,应用程序由IOC容器进行组装。

    spring IOC管理的对象,我们称为bean。bean就是spring容器初始化,装配,及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别。那IOC如何实例化bean、管理bean之间的依赖关系?这些就需要配置元数据。

    写个hello world(我用的是maven)

    pxm.xml

    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
        <dependency>
        <groupId>jdom</groupId>
        <artifactId>jdom</artifactId>
        <version>1.1</version>
    </dependency>

    helloInter.java

    public interface helloInter {
               public void sayHello();  
    }

    helloImpl.java

    public class helloImpl implements helloInter{
    
        public void sayHello() {
            // TODO Auto-generated method stub
            System.out.println("Hello World!!!");
        }
    
    }

    hello.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
        http://www.springframework.org/schema/context                http://www.springframework.org/schema/context/spring-context-4.0.xsd">
        <!-- id 表示你这个组件的名字,class表示组件类 -->
        <bean id="hello" class="com.lj.testspring.chapter.helloImpl"></bean>
    </beans>  

    helloTest.java

    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    
    public class helloTest {
               @Test
               public void testHelloWorld() {  
                     //1、读取配置文件实例化一个IoC容器  
                     ApplicationContext context = new ClassPathXmlApplicationContext("hello.xml");  
                     //2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”  
                     helloInter helloApi = context.getBean("hello", helloInter.class);  
                      //3、执行业务逻辑  
                      helloApi.sayHello();  
               }  
    
    }

    运行,可以看出输出一个hello World。

    在spring IOC容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IOC容器最基本功能,而org.springframework.context包下的ApplicationContext接口扩展了BeanFactory,还提供了与Spring AOP集成,国际化处理,事件传播及提供不同层次的context实现。简单说,BeanFactory提供了IOC容器最基本功能,而ApplicationContext则增加了更多支持企业级功能支持。ApplicationContext完全继承BeanFactory,因而BeanFactory所具有的语义也适用于ApplicationContext。

    容器实现一览:

    XmlBeanFactory:BeanFactory实现,提供基本的IoC容器功能,可以从classpath或文件系统等获取资源;
    (1) File file = new File("fileSystemConfig.xml");
    Resource resource = new FileSystemResource(file);
    BeanFactory beanFactory = new XmlBeanFactory(resource);
    (2)
    Resource resource = new ClassPathResource("classpath.xml");
    BeanFactory beanFactory = new XmlBeanFactory(resource);

    ClassPathXmlApplicationContext:ApplicationContext实现,从classpath获取配置文件;
    BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath.xml");

    FileSystemXmlApplicationContext:ApplicationContext实现,从文件系统获取配置文件。
    BeanFactory beanFactory = new FileSystemXmlApplicationContext("fileSystemConfig.xml");

    ApplicationContext接口获取Bean方法简介:
    • Object getBean(String name) 根据名称返回一个Bean,客户端需要自己进行类型转换;
    • T getBean(String name, Class<T> requiredType) 根据名称和指定的类型返回一个Bean,客户端无需自己进行类型转换,如果类型转换失败,容器抛出异常;

    • T getBean(Class<T> requiredType) 根据指定的类型返回一个Bean,客户端无需自己进行类型转换,如果没有或有
    多于一个Bean存在容器将抛出异常;
    • Map<String, T> getBeansOfType(Class<T> type) 根据指定的类型返回一个键值为名字和值为Bean对象的 Map,
    如果没有Bean对象存在则返回空的Map。

    让我们来看下IoC容器到底是如何工作。在此我们以xml配置方式来分析一下:

    一、准备配置文件:就像前边Hello World配置文件一样,在配置文件中声明Bean定义也就是为Bean配置元数据。

    二、由IoC容器进行解析元数据: IoC容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,IoC容器根据BeanDefinition进行实例化、配置及组装Bean。

    三、实例化IoC容器:由客户端实例化容器,获取需要的Bean。

    转自:http://jinnianshilongnian.iteye.com/blog/1413851

  • 相关阅读:
    mem系函数总结
    shell----删除文件中的^M
    为tcp的connect设置超时时间
    ue-edit设置显示函数列表
    bep-10翻译
    mysql--慢查询,卡死等处理
    mongodb---js脚本操作速记
    佛主保佑,永无bug
    【php】中【event】之实现方式
    BI任务列表
  • 原文地址:https://www.cnblogs.com/gudulijia/p/6402661.html
Copyright © 2011-2022 走看看