PicoContainer(Ioc容器)在测试用例中的应用(二)

本篇主要介绍PicoContainer的一些主要特性,很简单、很容易,但是很有效。喜欢英文的盆友也可以移步官方介绍,但是有些代码在新版本并不好使,还需要自己研究=.=!。

依赖注入

PicoContainer支持很多种注入方式,比如构造器注入、setter注入、annotation注入等等很多了。我们常用的annotation注入和构造器注入就可以了。

1、annotation注入方式

public class TestRandomWriteAndRead extends TestWriteAndRead {
  @Inject
  protected Writer writer;
  @Inject
  protected Reader reader;
  
  //...
}

  //...
  public void startTest(){
    PicoContainer pico = new DefaultPicoContainer();   
    pico.addComponent(RandomReader.class);
    pico.addComponent(RandomWriter.class);
    pico.addComponent(TestRandomWriteAndRead.class);
    
    TestWriteAndRead readAndWrite = pico.getComponent(TestWriteAndRead.class);
  }

2、构造器注入

 

public class TestRandomWriteAndRead extends TestWriteAndRead {
  protected Writer writer;
  protected Reader reader;
  
  public TestRandomWriteAndRead (Reader reader, Writer writer){
    this.writer = writer;
    this.reader = reader;
  }
  
  //...
}

//startTest方法同上

需要注意的是以上两种方式都是按照类型匹配注入的,如果pico容器中含有相同的两个类型对象就会报错。当然也可以按照名称来匹配注入。看下面的例子,pico会按照我们定义的名字,自动把reader和writer匹配到TestRandomWriteAndRead的构造函数中。

 

public class TestRandomWriteAndRead extends TestWriteAndRead {
  protected Writer writer;
  protected Reader reader;
  
  public TestRandomWriteAndRead (Reader reader, Writer writer){
    this.writer = writer;
    this.reader = reader;
  }
  
  //...
}

//...
public void startTest(){
  PicoContainer pico = new DefaultPicoContainer();   
  pico.addComponent("reader", RandomReader.class);
  pico.addComponent("writer", RandomWriter.class);
  pico.addComponent(TestWriteAndRead.class, TestRandomWriteAndRead.class,
      new ComponentParameter("reader"), new ComponentParameter("writer"));
  
  TestWriteAndRead readAndWrite = pico.getComponent(TestWriteAndRead.class);
}

单例模式

单例模式是我们常用的设计模式,在PicoContainer中用起来也非常简单,仅需要加入容器时标记一下即可,此时容器仅会初始化一个实例,并注入到需要他的地方。下面代码中RandomReader就使用了单例模式。

 

public void startTest(){
  PicoContainer pico = new DefaultPicoContainer();   
  pico.as(CACHE).addComponent(RandomReader.class);
  pico.addComponent(RandomWriter.class);
  pico.addComponent(TestWriteAndRead.class);
  
  TestWriteAndRead readAndWrite = pico.getComponent(TestWriteAndRead.class);
}

生命周期

PicoContainer有自己的生命周期管理,仅需要实现Startable接口即可,此接口提供了start和stop方法。当调用pico.start();时,容器就会调用start方法开始运行这些实现的start方法,stop同理。这个很有意思,前面讲我们可以像搭积木一样,在用例中加入各个操作模块,然后使用start()命令触发各个模块的运作,让整个系统run起来。

 

public class TestRandomWriteAndRead extends TestWriteAndRead implements Startable {
  //...
  
  @Override
  public void start() {
    //...
  }

  @Override
  public void stop() {
  }
}

其他功能

比如Scoped功能可以在一个容器下面建立子容器,各不同类型的Container(我们前面用的都是DefaultPicoContainer),各种高级功能。如果有兴趣可以共同研究探讨,我觉得既然使用轻量级的Ioc容器以上这些基本功能大体已经够了。Enjoy it!

来源:http://www.taobaotest.com/blogs/2161

时间: 2024-10-02 20:51:48

PicoContainer(Ioc容器)在测试用例中的应用(二)的相关文章

Castle IOC容器实践之Startable Facility(二)

主要内容 Startable Facility原理分析 -- 在Castle IOC容器实践之Startable Facility(一)中我们已经看到了如何去使用Startable Facility,本文将对它的原理做一些分析.先看一下接口IStartable,它的实现代码如下: public interface IStartable { void Start(); void Stop(); } 代码是相当的简单,只有两个方法,分别在组件创建的时候和销毁的时候执行,这就涉及到了组件的生命周期管理

Castle IOC容器构建配置详解(二)

主要内容 1.基本类型配置 2.Array类型配置 3.List类型配置 4.Dictionary类型配置 5.自定义类型转换 一.基本类型配置 在Castle IOC的配置文件中,大家可能都已经注意一个问题了,就是不管组 件接收的是什么基本数据类型,我们一律没有在配置文件中指定,也就是说,不 管组件接收的类型是int型或者是String类型,我们都可以这样去配置: <component id="MyComponent"> <parameters> <po

Castle IOC容器实践之TypedFactory Facility(二)

主要内容 TypedFactory Facility原理分析 -- 在TypedFactory Facility中,有一个FactoryEntry类,这个类与我们平时项目开发中的实体类有一些类似,它用来记录工厂的相关信息,包括工厂的ID,工厂的接口,创建方法和销毁方法.这个类实现如下: public class FactoryEntry { private String _id; private Type _factoryInterface; private String _creationMe

Spring源代码解析(二):IOC容器在web容器中的启动

以下引用自博客:http://jiwenke-spring.blogspot.com/ 上面我们分析了IOC容器本身的实现,下面我们看看在典型的web环境中,Spring IOC 容器是怎样被载入和起作用的. 简单的说,在web容器中,通过ServletContext为Spring的IOC容器提供宿主环境,对 应的建立起一个IOC容器的体系.其中,首先需要建立的是根上下文,这个上下文持有的 对象可以有业务对象,数据存取对象,资源,事物管理器等各种中间层对象.在这个上下 文的基础上,和web MV

《Spring技术内幕》——2.4节IoC容器的依赖注入

2.4 IoC容器的依赖注入 上面对IoC容器的初始化过程进行了详细的分析,这个初始化过程完成的主要工作是在IoC容器中建立BeanDefinition数据映射.在此过程中并没有看到IoC容器对Bean依赖关系进行注入,接下来分析一下IoC容器是怎样对Bean的依赖关系进行注入的. 假设当前IoC容器已经载入了用户定义的Bean信息,开始分析依赖注入的原理.首先,注意到依赖注入的过程是用户第一次向IoC容器索要Bean时触发的,当然也有例外,也就是我们可以在BeanDefinition信息中通过

《Spring技术内幕》——2.2节IoC容器系列的设计与实现:BeanFactory和ApplicationContext

2.2 IoC容器系列的设计与实现:BeanFactory和ApplicationContext在Spring IoC容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能:另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在.应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境作了许多适配.有了这两种基本的容器系列,基本上可以满足用户对IoC容器使用的大部分需求了.下面

PicoContainer(Ioc容器)在测试用例中的应用(一)

PicoContainer是一个轻量级Ioc(Inversion of Control)容器, 最重要的特征是它的尺寸,它没有拦截器.AOP 或相似类型的服务,但它具有完整的依赖注入容器. PicoContainer 支持 Java 配置技术,而不支持 XML 配置技术,也就是说容器内各组件的依赖规则都是通过java程序来配置的. 为什么要使用ioc容器 话说第一天我们要完成一个数据库的读测试,读的行为分别为顺序和随机.按照传统的做法我们会写两个case分别实现顺序读和随机读过程,很简单我们一会

《Spring攻略(第2版)》——1.2 配置Spring IoC容器中的Bean

1.2 配置Spring IoC容器中的Bean 1.2.1 问题 Spring提供了一个强大的IoC容器来管理组成应用的bean.为了利用容器服务,你必须配置运行于Spring IoC容器中的Bean. 1.2.2 解决方案 你可以通过XML文件.属性文件.注释甚至API来配置Spring IoC容器中的Bean. Spring允许你在一个或者多个bean配置文件中配置bean.对于简单的应用程序,可以在单个配置文件中集中配置bean.但是对于有许多bean的大型应用,你应该根据其功能(例如控

浅析Java的Spring框架中IOC容器容器的应用_java

Spring容器是Spring框架的核心.容器将创建对象,它们连接在一起,配置它们,并从创建到销毁管理他们的整个生命周期.在Spring容器使用依赖注入(DI)来管理组成应用程序的组件.这些对象被称为Spring Beans. 容器获得其上的哪些对象进行实例化,配置和组装通过阅读提供的配置元数据的说明.配置元数据可以通过XML,Java注释或Java代码来表示.下面的图是Spring如何工作的高层次图. Spring IoC容器是利用Java的POJO类和配置元数据的产生完全配置和可执行的系统或