Jmin IOC中文资料
作者:older 日期:2008-05-07 18:16:29
| JmIoc.zip(1.9 MB) | |
| demo.zip(4.5 K) | |
Jmin IOC 是一个基于IOC技术的快速应用开发框架
1: 什么是IOC
IoC就是Inversion of Control,控制反转。在开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转,我们很容易把IOC容器看作是一个稍微大一点的工厂对象,它可以帮助我们实现:创建和维护Bean实例,管理bean生命周期,实施依赖注入,bean关系维护等。我们称这些受管的Bean为POJO(Plain Old Java Objects),主要区别于企业Bean
2: 元素
由于POJO实例的多样性,容器是依据什么来管理和控制它们呢?针对某个已存在的POJO,在容器内部是应该存在一些具有描述性的东西,来影响容器在当前POJO的行为。一个POJO可以从多个角度描述它。如:构造方式,属性描述,方法调用描述等。从统一的观点来说,它们都可以看作是POJO的描述对象,在我们的framework中,这些描述性的对象被称为POJO描述元素。那么这些元素对象是怎么进入了容器中?一般的IOC容器都提供一些方式将它们导入,例如:注册。在框架中,定义了一个基本的元素接口:BeanElement,其他描述元素都是从此扩展而来,为了方便操作,框架提供一个辅助类:BeanElementFactory去帮助开发者创建这些描述性元素.
1 | /*
*Copyright (c) jmin Organization. All rights reserved.
*/
package org.jmin.j2ee.ioc;
import java.io.Serializable;
/**
* A super interface to describe one part in a bean,which need be
* registered in IOC container as a bean element.Container action on
* beans depend on description elements of beans.
*
* @author Chris Liao
* @version 1.0
*/
public interface BeanElement extends Serializable{
}
|
下面简单介绍一些POJO描述元素
Singleton: 被描述的POJO实例是否为单实例,可以取值:true 或 false
InitializationMethod:初始化方法的描述元素,当容器完成构造后,将调用初始化方法
DestroyMethod: 销毁方法,当应用结束时,容器自动调用POJO的销毁方法
Construction: POJO的构造方式描述元素。目前支持三种构造方式:
1:普通反射构造,容器将直接在类的构造器上构造实例.
2:工厂方法构造,通过类的Static方法构造实例
3:工厂Bean构造,容器通过调用另一个POJO的实例的指定方法来构造
Property: POJO的属性描述对象,会携带参数。关联属性注入
Invocation: POJO的方法调用描述对象,会携带参数。关联方法调用注入
Interception: POJO方法调用拦截描述对象,属于Around类别
3:参数
容器有一个很好的优点:依赖注入。当容器在构造一个POJO实例时,可以对它实施注入:将一些有用的参数值放进对象内部,以完成对象准备动作,使其一旦被外部获取即可使用。那么这参数值是从哪里来的呢?很容易让人想到注册,没错,它们是从外部导入容器内部的。当使用容器注册POJO描述元素时,并不是简单的动作,某些元素是可以携带一些有用的参数值,从而可以被容器用到。由于IOC环境因素,导致这些参数值是有别于普通方法参数。如何表达这些参数值,且能让容器理解呢?描述在该容器中发挥积极重要的作用,其实对象性语言本身就是利用描述的特性。在该framework中,定义了一个用来被容器所能理解的参数值对象:IocValue,它是一个接口,在容器下已经存在一些实现子类,很多情况下它们可以作为参数而存在的,由于值的类别不同,导致参数也是不一样的。同样为了方便, 框架提供一个辅类:ParameterFactory, 被用来创建拥有不同类别值的参数对象。
1 | /*
*Copyright (c) jmin Organization. All rights reserved.
*/
package org.jmin.j2ee.ioc;
import java.io.Serializable;
/**
* IOC value type object.
*
* @author Chris Liao
* @version 1.0
*/
public interface IocValue extends Serializable {
/**
* Return description object for ioc value
*/
public Object getDescription();
/**
* Return object value for this ioc value.
*/
public Object toObjectValue();
}
|
下面简单介绍一些参数值类别。
1 | BooleanValue ByteValue CharValue ShortValue IntValue LongValue FloatValue DoubleValue ClassValue ReferenceValue InstanceValue |
4: API介绍
容器方法API
元素工厂API
参数工厂API
拦截器
5:元素详解
在直接使用方式下,开发者需要亲自创建容器和注册元素,如属性,构造等,当然准备好这些基本动作后,并不意味开发的完成.在获取对象的实例前,应该需要将对POJO描述的相关元素注册到容器中,相关的元素已经在前面所讲述,为了更好理解该框架下的描述元素,下面逐一讲述它们.
5.1 对象构造
在前面已经提到构造描述元素(Construction),它将引导容器如何去创建一个POJO实例。在该框架中提供了三种方式:普通构造;工厂方法构造;工厂Bean构造,下面分别讲述它们。
A: 普通构造
容器将直接使用Class来构造一个对象实例,通常在工程应用时候,我们可以使用这样的代码去创建我们期盼的实例:Object instance = Class.newInstance(); 当然容器构造一个Class的对象时,不是一个如此简单的动作。很多时候我们在编写一个新的Class时候,会编写Class的构造方法,它们被用来在构造对象时候携带一些有用的参数信息。携带参数值的构造方式是比比皆是。在该Framework中,只要合理描述这些参数既可,容器将在构造的时候,它们被自动注入对象实例。那么如果注册这种构造方式呢? 框架是允许显式与隐式两种方式去注册构造方式。
1:通过构造描述对象
1 | Construction construction = BeanElementFactory.createConstruction(new Parameter[]{parameter1,parameter2......});
//再通过如下类似的方式注册
IocContainer.register(Class beanClass, Construction constructor);
|
2:直接调用容器方法注册构造参数
1 | IocContainer.register(Class beanClass, Parameter[] constructParameters); |
B: 工厂方法构造
在该种构造方式下,容器将调用当前POJO Class的自身一个静态方法去完成对象的构造,当然这个方法可以是带有参数的,而这些参数同上被称为构造参数。在描述方法参数时,请注意参数的类别,构造的参数值应该与之相匹配。创建该方式的构造元素时,可使用如下类似代码进行该元素对象的创建
1 | Construction construction = BeanElementFactory.createConstruction(String factoryMethodName,Parameter[] parameters); //注册如普通构造 ........... |
C: 工厂Bean
在该构造方式下,容器将调用另一个已经存在的POJO的方法来完成构造动作,这个被容器调用的POJO被称为工厂Bean.既然是方法调用,那么是有可能使用一些参数值。使用如下代码去构造该方式下的元素。
1 | Construction construction = BeanElementFactory.createConstruction(String factoryBeanRefID,String factoryMethodName,Parameter[] parameters); //注册如普通构造 ........... |
5.2 对象单态
在一些应用的时候,针对某个Class,可能只需要它的一个实例,又某些情况下却只需要多个不同的实例,框架提供了一个是否为单态描述元素:Singleton
1 | Singleton singleton = BeanElementFactory.CreateSingleton(boolean singleton); |
5.3初始化方法
传统的开发时,当完成一个对象的创建后,还有可能在该对象上执行一些初始化动作,同样该容器框架可以帮我们完成对实例的初始化
1 | InitializationMethod method = BeanElementFactory.createInitMethodName(String methodname); |
5.4销毁方法
当我们不在使用某个对象时,希望存在某种自动机制来完成某些结束动作,比如进行资源回收
1 | DestroyMethodmethod = BeanElementFactory.createDestroyMethodName(String methodname); |
5.5对象属性
从静态角度描述一个对象,我们通常可以会使用类似语句:它有某某特性等,在对象语言中,我们可以称这些某某特性为对象属性(个人理解:对象语言本身就是利用抽象原理对对象进行描述,我们框架也是如此哦^-^)。为了对象描述的完整性,在IOC环境下,属性的描述同样是允许的,只不过该描述方式与直接的对象属性描述是有差异的。为了容器的理解性,框架中定义了应用于IOC下的属性对象:Property. 在对象世界里,通常会使用属性值来描述属性。为了描述统一性,在框架中,我们称这个属性值为参数值,事实上参数不只是应用在属性上,后面将会陆续谈到。如果要构造一个属性元素,那么同时也应该构造一个合理的参数,如例:
1 | //通过调用框架的工厂方法创建一个参数对象
Parameter ageParmeter = ParameterFactory.createIntType(28);
//通过调用框架的工厂方法创建一个属性描述对象
Property ageProperty = BeanElementFactory.createProperty("age", ageParmeter);
|
5.6对象方法
上面的讲述,我们从静态角度使用了属性描述对象。既然有静态,那么相对就有动态描述。我们通常会这样描述我们自己的对象:这个对象可以做某某事情,这个”做”体现了对象”动”的一面及类的职责。在对象中,使用了方法来反映动态一面,当调用一个对象方法时,可能使用一些有意义的参数值,这个参数就是上面已经提到的那个参数。该容器框架中,定义了一个方法调用描述元素.下面例子可参考!
1 | //通过调用框架的工厂方法创建一个参数对象
Parameter nameParmeter = ParameterFactory.createStringType("China");
//通过调用框架的工厂方法创建一个方法调用描述元素对象
Invocation invocation =
BeanElementFactory.createInvocation( "sayHello",new Parameter[] { nameParmeter });
|
5.7方法拦截
该框架提供了方法调用级拦截,同样它作为一个元素对象被工厂方法所创建
1 | Interception methodInterception = BeanElementFactory.createInterception(String methodName,String[] parameterTypes); |
以上代码替我们创建了一个方法拦截元素对象,很明显我们创建拦截元素,自然要提到拦截器,与该描述元素有什么关系呢?我们可以调用该元素下的一些方法来添加方法拦截器。
1 | //添加一个拦截器实例 public void addInterceptorByInstance(Interceptor interceptor) ; //添加一个拦截器实现类 public void addInterceptorByClass(Class interceptorClass); //添加一个拦截器实现类名 public void addInterceptorByClassName(String interceptorClassName); //添加一个拦截器引用 public void addInterceptorByReference(Object reference) ; |
5.8元素注册
通过前面基本讲述,我们知道元素对象是需要注册到容器中,才能发挥作用IOC容器提供了一些有用的元素注册方法,该容器允许多步添加所需要的元素,因此才容器具有一定的动态性,下面公开该容器的API
1 | /*
* Copyright (c) jmin Organization. All rights reserved.
*/
package org.jmin.j2ee.ioc;
import java.util.Map;
import org.jmin.j2ee.ioc.element.Autowire;
import org.jmin.j2ee.ioc.element.BeanElement;
import org.jmin.j2ee.ioc.element.Construction;
import org.jmin.j2ee.ioc.element.DestroyMethod;
import org.jmin.j2ee.ioc.element.InitializationMethod;
import org.jmin.j2ee.ioc.element.Interception;
import org.jmin.j2ee.ioc.element.Invocation;
import org.jmin.j2ee.ioc.element.PoolSize;
import org.jmin.j2ee.ioc.element.Property;
import org.jmin.j2ee.ioc.element.ProxyInterfaces;
import org.jmin.j2ee.ioc.element.Singleton;
/**
* A micro-container registeres object part definition,and which is called as elements,
* the container will control object instances lifecycle by their elements definition.
* After elements registeration,object instances can be gotten with registered keys from
* the container.Some registeration methods are supplied to import elements to container.
*
* @author Chris Liao
* @version 1.0
*/
public interface IocContainer {
/**
* contains beanID
*/
public boolean containsBeanID(Object beanID);
/**
* Find a bean instance from container by a beanID.
* If not found, then return null.
*/
public Object getBean(Object beanID);
/**
* Find a bean instance with a class. If not found, then return null.
*/
public Object getBeanByClass(Class cls);
/**
* Find all bean instance map
*/
public Map getBeansByClass(Class cls);
/**
* register a object instance in container
*/
public void registerInstance(Object instance);
/**
* register a object instance with a beanID
*/
public void registerInstance(Object beanID, Object instance);
/**
* register a classes
*/
public void registerClass(Class beanClass);
/**
* register a classes
*/
public void registerClass(Class beanClass, Property[] properties);
/**
* register a classes
*/
public void registerClass(Class beanClass, Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Class beanClass, Property[] properties,Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Class beanClass, Parameter[] constructParameters);
/**
* register a classes
*/
public void registerClass(Class beanClass, Parameter[] constructParameters,Property[] properties);
/**
* register a classes
*/
public void registerClass(Class beanClass, Parameter[] constructParameters,Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Class beanClass, Parameter[] constructParametersr,Property[] properties, Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Class beanClass, Construction constructor);
/**
* register a classes
*/
public void registerClass(Class beanClass, Construction constructor,Property[] properties);
/**
* register a classes
*/
public void registerClass(Class beanClass, Construction constructor,Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Class beanClass, Construction constructor,Property[] properties, Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Class beanClass, BeanElement[] registerElements);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Property[] properties);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Property[] properties,Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Parameter[] constructParameters);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Parameter[] constructParameters, Property[] properties);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Parameter[] constructParameters, Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Parameter[] constructParameters, Property[] properties,Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Construction constructor);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Construction constructor,Property[] properties);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Construction constructor,Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,Construction constructor,Property[] properties, Invocation[] invocation);
/**
* register a classes
*/
public void registerClass(Object beanID, Class beanClass,BeanElement[] registerElements);
/**Some set methods to change managed bean defination in micro-container*/
/**
* set singleton for bean
*/
public void setSingleton(Object beanID, boolean singleton);
/**
* set singleton for bean
*/
public void setSingleton(Object beanID, Singleton singleton);
/**
* set autowire for bean
*/
public void setAutowire(Object beanID, boolean autowire);
/**
* set autowire for bean
*/
public void setAutowire(Object beanID, Autowire autowire);
/**
* set destroy method
*/
public void setDestroyMethodName(Object beanID, String destroyMethodName);
/**
* set destroy method
*/
public void setDestroyMethodName(Object beanID, DestroyMethod destroyMethod);
/**
* set init method
*/
public void setInitMethodName(Object beanID, String initMethodName);
/**
* set init method
*/
public void setInitMethodName(Object beanID, InitializationMethod initMethodName);
/**
* set pooled size for some bean instance
*/
public void setPoolSize(Object beanID, int size);
/**
* set pooled size for some bean instance
*/
public void setPoolSize(Object beanID, PoolSize poolSize);
/**
* add a property
*/
public void addProperty(Object beanID,Property property);
/**
* remove a property
*/
public void removeProperty(Object beanID,Property property);
/**
* add a method invocation
*/
public void addInvocation(Object beanID,Invocation invocation);
/**
* remove a method invocation
*/
public void removeInvocation(Object beanID,Invocation invocation);
/**
* add a interception
*/
public void addInterception(Object beanID, Interception interceptions);
/**
* remove a interception
*/
public void removeInterception(Object beanID, Interception interceptions);
/**
* Set proxy interfaces on a object for
*/
public void setProxyInterfaces(Object beanID,Class[] proxyInterfaces);
/**
* Set proxy interfaces on a object for
*/
public void setProxyInterfaces(Object beanID,ProxyInterfaces proxyInterfaces);
/**
* deregister a bean by beanID
*/
public void deregister(Object beanID);
/**
* Destroy operation in ioc container
*/
public void destroy();
}
|
6:开发应用
IOC容器可以帮助我们去创建我们所需要的对象实例,我们唯一要做的就是把相关信息告诉容器,这些描述信息将引导容器在POJO实例的控制行为,目前该框架提供了两种开发方式:直接使用方式和XML配置方式,开发者可以在二者之间自由选择。
6.1:直接应用容器
直接通过注册来使用该框架,需要开发人员亲自创建容器,元素,参数等,然后注册它们,最后获取POJO实例,如
1 | IocContainer container = new DefaultIocContainer(); Ojbect key = container.register(String.class); String value = (String) container.getBean(key); |
一个直接使用容器的例子
6.2:XML配置应用
该框架支持XML应用配置方式,将对Bean的元素描述成XML格式,开发时只要遵循描述规则进行元素定义配置,最终获得XML格式的配置文件,利用框架中的工具应用这些XML文件即可。该方式使开发方式更为便利。
1:服务组件
在继续XML配置讲解之前,先了解一些组件知识. 组件通常被用来描述对象的构成,能够帮助它的主体完成某些功能的对象。如果以整体-部分观点看问题,我们可以把一个软件系统看作一个有机体,那么它应该是由若干部分组成,每部分都可以发挥其应有的功能与作用。我们都知道java将一切事物描述为对象,那么一个系统也应该是一个对象吧(对吗?),而它的构成部分就可以称为组件了(是吗?). 从整体出发,那么模块可是系统的组件;继续整体观察模块,一个模块可以提供若干服务,那么这些服务又可以称之为模块的组件,这样的例子是可以举出很多。组件是一种整体与部分的观点,其体积可大可小。通常可从服务或领域角度定义组件,由于服务与领域的不定性与多样性,使得相应组件也具有其特点,因此组件定义变得困难。在Jmin平台下采用统一组件描述方式定义组件,如下XML样式。
1 | <component id ="" type=""> ............ </component> |
在以上组件基本描述框架中,需要提供组件ID及组件类别,其省略部分则为服务自定义组件主体描述部分,该描述框架可适应组件的不定性与多样性。
2:POJO组件
该IOC工具作为Jmin平台核心部分而存在,并应用了该平台的组件统一描述思想,把受管的的POJO看作最简单形式的组件,只不过组件类别为bean,相应的XML描述如下。
1 | <component id ="" type="bean"> ............ </component> |
3:元素定义
回顾POJO组件描述样式,很容易让人想到那些描述组件主体的省略号. 对于POJO组件而言,我们在此定义POJO描述元素,下面就具体讲述这些元素的配置。
类的定义
在POJO描述主体中可以使用如下XML样式定义POJO类名
1 | <class>xx.xx.xx.xx</class> |
构造方式
定义构造实例时需要的参数,可以配置三种类别的参数。它对应构造注入。
1 | <constructor>
<constructor-arg value="123"/>
<constructor-arg class="xx.xx.xx.xx"/>
<constructor-arg ref="ref1"/>
</constructor>
|
工厂方法
容器将调用该方法创建POJO实例
1 | <factory-method>xxxx</factory-method> |
工厂Bean
容器将调用另一个Bean的方法去创建当前POJO实例,但是工厂Bean与工厂方法是一起是使用的,在配置工厂Bean时,请工厂方法也配置。以下样板中xxx为工厂Bean的ID号。
1 | <factory-bean>xxxx</factory-bean> |
属性
POJO属性描述元素配置,需要指定属性名和属性值,还有POJO的Class中必须存在属性的set方法。容器在实例化后POJO,将会实施属性注入。
1 | <property name="" value=""/> <property name="" class=""/> <property name="" ref=""/> |
调用
POJO方法调用注入。容器将自动调用该描述方法实施参数注入。在配置时,需要指定调用方法名和一些参数值。
1 | <invocation>
<method-name>xxx</method-name>
<method-param-values>
<method-param-value value="">
<method-param-value class="">
<method-param-value ref="">
</method-param-values>
</invocation>
|
单态
描述当前POJO是否为单实例,可选择true或false
1 | <singleton>true</singleton> |
初始化方法
配置该元素时,可指定POJO实例的初始化方法,
1 | <initialization-method>xxx</initialization-method> |
销毁方法
当应用结束时,容器自动该销毁方法实行资源清理。
1 | <destroy-method>xxx</destroy-method> |
自动装配
指定POJO属性是否需要自动装配,可选择true或false
1 | <autowire>true</autowire> |
拦截
指定方法调用的拦截,需要配置方法名及参数类别和拦截实例
1 | <interception>
<method-name>sayHello</method-name>
<method-param-types>
<method-param-type>java.lang.String</method-param-type>
</method-param-types>
<interceptor class="xxxxxx"/>
<interceptor ref="xxxx"/>
</interception>
|
4:应用
目前在该Framework中存在三个应用于XML的三个context.
FilePathAppContext
ClassPathAppContext
URLAppContext
5:XML例子
如定义一个XML文件(POJO.xml)
1 | <?xml version="1.0"?>
<service id="POJO">
<components>
<component id="bean1" type="bean">
<class>java.lang.String</class>
</component>
</components>
</service>
|
编写获取POJO的代码
1 | URL fileURL = (Test.class).getResource("POJO.xml");
URLAppContext context = new URLAppContext(fileURL);
System.out.println("bean: " + context.getBean("bean1"));
|
当然也可以使用其他两种context去应用这个XML
一个XML例子
下载该框架工具
欢迎使用该Framework,我们将提供免费的服务.有任何问题请联系: jmin520@21cn.com
平均得分
(0 次评分)
评论: 41 | 查看次数: 4155
发表评论
订阅
上一篇
|

文章来自:
标签: 





干洗连锁
干洗设备
干洗
美国ucc国际洗衣连锁
美国ucc干洗
干洗店
干洗机
水洗设备
洗鞋设备
洗涤价格
干洗机价格
par wow dans GameSavor, vous obtiendrez une grande surprise!
chez GameSavor, 20% de bonus wow gold sont waitting pour vous!
お見合いパーティー 東京
和光市 不動産
我孫子市 不動産
足立区 不動産
蕨市 不動産
埼玉県 一戸建て
海水魚販売
東横線 不動産
賃貸オフィス
エアコン 取り外し
ヴィトン バッグ
インテリア 家具
離婚
株式 投資顧問
J-Payment
カップリング
アヴァンス
マウイ島
オフィスレイアウト
ホームヘルパー
バイク買取
映像制作会社
任意整理 無料相談
スライドショー
注目株
オメガ 修理
USB
折込
老人ホーム 川崎
恵比寿 アパート
整体カイロプラクティック
業務用 厨房機器
当日配達
賃貸川西市
ECサイト ASP
楽器レンタル
教員採用
司法書士 債務整理
浦和 不動産
小さいサイズ
コーヒー焙煎
先物
福生市 不動産
募金
世田谷 マンション
ピアノ教室
RMT
リロケーション 賃貸
過払い
フランチャイズ 起業
婚活 相談
フランチャイズ 開業
園芸用品
飲食 転職
通販 ファッション
ダイビング スクール
港区 不動産
生理不順 漢方
クロエ 財布
店舗設計
皮膚科 立川
ニキビ跡 治療
簿記 通信講座
朝霞 一戸建て
子宮がん
乳がん
賃貸オフィス
英会話 横浜
toeic
jianyang
TCM
Diabeat
jimpness beauty
furunbao
星座
TCM
Diabeat
变易
TCM
Diabeat
仓储货架
货架
仓储笼
仓储笼
钢托盘
google推广
仓储笼
仓储笼
仓储笼
仓储笼
货架
仓储笼
塑料托盘
仓储货架
中度货架
仓储设备
货架
护栏网
护栏网
南京笔记本维修
google排名
仓储笼
折叠式仓储笼
南京仓储笼
仓储笼报价
仓储笼图片
仓储笼
仓储笼
仓储笼
仓储笼
折叠式仓储笼
南京仓储笼
仓储笼
仓储笼
仓储笼
仓储笼
仓储笼
仓储笼
仓储笼
仓储笼
手推车
静音手推车
静音手推车
铁板手推车
钢托盘
塑料托盘
钢托盘
仓储笼
登高车
手推车
钢制料箱
护栏网
塑料托盘
托盘
仓储笼
手推车
仓储笼
钢托盘
木托盘
仓储笼
钢托盘
塑料托盘
轻型货架
中量A型货架
中量B型货架
货位货架
阁楼式货架
悬臂式货架
抽屉式货架
滚轮式货架
贯通货架
中型货架
重型货架
贯通货架
阁楼货架
货架
悬臂货架
模具货架
滚轮货架
轻型货架
中型货架
中型货架
重型货架
悬臂货架
模具货架
阁楼货架
贯通货架
仓储笼
无锡仓储笼
天津仓储笼
上海仓储笼
北京仓储笼
苏州仓储笼
无锡仓储笼
天津仓储笼
上海仓储笼
北京仓储笼
苏州仓储笼
南京仓储笼
折叠式仓储笼
仓储笼
货架
仓储货架
重型货架
仓储笼
角钢货架
托盘搬运车
轻型货架
中型货架
中量型货架
抽屉货架
汽配库货架
悬臂货架
贯通货架
滚轮货架
重型货架
中量B型货架
中量A型货架
轻型货架
角钢货架
中型货架
货位货架
滚轮货架
贯通式货架
悬臂式货架
汽配库货架
抽屉货架
阁楼货架
上海仓储笼
北京仓储笼
广州仓储笼
深圳仓储笼
杭州仓储笼
青岛仓储笼
武汉仓储笼
苏州仓储笼
宁波仓储笼
天津仓储笼
合肥仓储笼
大连仓储笼
厦门仓储笼
成都仓储笼
南京仓储笼
扬州仓储笼
南宁仓储笼
威海仓储笼
温州仓储笼
东营仓储笼
汕头仓储笼
南昌仓储笼
九江仓储笼
衡阳仓储笼
贵阳仓储笼
昆明仓储笼
佛山仓储笼
邯郸仓储笼
济南仓储笼
重庆仓储笼
沈阳仓储笼
上海仓储笼
宁波仓储笼
杭州仓储笼
苏州仓储笼
北京仓储笼
南京仓储笼
仓储笼
折叠式仓储笼
折叠仓储笼
求购仓储笼
仓储笼图片
供应仓储笼
唐山仓储笼
保定仓储笼
石家庄仓储笼
邯郸仓储笼
太原仓储笼
大同仓储笼
长冶仓储笼
河北仓储笼
辽宁仓储笼
鞍山仓储笼
锦州仓储笼
营口仓储笼
吉林仓储笼
长春仓储笼
无锡仓储笼
江阴仓储笼
镇江仓储笼
南通仓储笼
盐城仓储笼
淮阴仓储笼
淮安仓储笼
常州仓储笼
武进仓储笼
江都仓储笼
浙江仓储笼
昆山仓储笼
湖州仓储笼
嘉兴仓储笼
绍兴仓储笼
温州仓储笼
丽水仓储笼
金华仓储笼
芜湖仓储笼
淮南仓储笼
马鞍山仓储笼
福州仓储笼
莆田仓储笼
泉州仓储笼
石狮仓储笼
江西仓储笼
南昌仓储笼
山东仓储笼
菏泽仓储笼
烟台仓储笼
潍坊仓储笼
河南仓储笼
郑州仓储笼
新乡仓储笼
内蒙古仓储笼
包头仓储笼
哈尔滨仓储笼
齐齐哈尔仓储笼
佳木斯仓储笼
湖北仓储笼
襄樊仓储笼
黄石仓储笼
呼和浩特仓储笼
宜昌仓储笼
十堰仓储笼
湖南仓储笼
长沙仓储笼
常熟仓储笼
株洲仓储笼
岳阳仓储笼
广东仓储笼
江门仓储笼
韶关仓储笼
惠州仓储笼
汕头仓储笼
深圳仓储笼
珠海仓储笼
佛山仓储笼
广州仓储笼
湛江仓储笼
南宁仓储笼
广西仓储笼
柳州仓储笼
海口仓储笼
四川仓储笼
攀枝花仓储笼
绵阳仓储笼
宜宾仓储笼
乐山仓储笼
贵州仓储笼
贵阳仓储笼
昆明仓储笼
玉溪仓储笼
拉萨仓储笼
西安仓储笼
宝鸡仓储笼
甘肃仓储笼
兰州仓储笼
酒泉仓储笼
青海仓储笼
西宁仓储笼
银川仓储笼
新疆仓储笼
阿克苏仓储笼
乌鲁木齐仓储笼
仓储笼
折叠式仓储笼
折叠仓储笼
仓库笼
储物笼
萧山仓储笼
绍兴仓储笼
嘉兴仓储笼
台州仓储笼
宁波仓储笼
杭州仓储笼
浙江仓储笼
常州仓储笼
盐城仓储笼
南通仓储笼
上海仓储笼
常熟仓储笼
苏州仓储笼
无锡仓储笼
镇江仓储笼
南京仓储笼
安庆仓储笼
合肥仓储笼
蚌埠仓储笼
徐州仓储笼
潍坊仓储笼
诸城仓储笼
山东仓储笼
青岛仓储笼
大连仓储笼
天津仓储笼
北京仓储笼
北京仓储笼
中度货架
货架厂
南京货架
无锡货架
南通货架
常州货架
镇江货架
徐州货架
扬州货架
淮安货架
泰州货架
盐城货架
连云港货架
宿迁货架
张家港货架
常熟货架
昆山货架
杭州货架
温州货架
宁波货架
嘉兴货架
绍兴货架
衢州货架
金华货架
台州货架
舟山货架
丽水货架
江阴货架
太仓货架
吴江货架
宜兴货架
诸暨货架
慈溪货架
余姚货架
大连货架
北京货架
鞍山货架
重庆货架
青岛货架
深圳货架
广州货架
苏州货架
货架公司
重庆货架
佛山货架
成都货架
东莞货架
武汉货架
沈阳货架
烟台货架
唐山货架
济南货架
郑州货架
石家庄货架
长春货架
临沂货架
威海货架
厦门货架
德州货架
潍坊货架
中山货架
合肥货架
商丘货架
晋城货架
乌海货架
九江货架
绵阳货架
新余货架
攀枝花货架
茂名货架
惠州货架
惠州货架
焦作货架
咸阳货架
遵义货架
丹阳货架
廊坊货架
牡丹江货架
仪征货架
景德镇货架
张家界货架
宝鸡货架
吉安货架
怀化货架
鹤山货架
恩平货架
宜宾货架
德阳货架
阜新货架
巩义货架
武夷山货架
肇庆货架
营口货架
宣城货架
宿州货架
抚顺货架
上饶货架
铜川货架
六盘水货架
莱西货架
漯河货架
驻马店货架
永州货架
白银货架
青岛货架
台湾货架
西藏货架
三亚货架
海口货架
詹州货架
海南货架
西宁货架
青海货架
安庆货架
商洛货架
渭南货架
巢湖货架
六安货架
铜陵货架
淮北货架
黄山货架
阜阳货架
安庆货架
马鞍山货架
淮南货架
芜湖货架
蚌埠货架
滁州货架
安徽货架
宁德货架
莆田货架
晋江货架
泉州货架
漳州货架
龙岩货架
三明货架
梅山货架
汕头货架
珠海货架
河源货架
清远货架
顺德货架
云浮货架
阳江货架
河北货架
山西货架
内蒙古货架
辽宁货架
吉林货架
黑龙江货架
上海货架
江苏货架
浙江货架
福建货架
江西货架
山东货架
湖北货架
湖南货架
湖南货架
广东货架
广西货架
四川货架
东方股票网
东方股票网东方股票网东方股票网东方股票网财经财经股票入门股票入门
祛眼袋
北京去眼袋
北京祛眼袋
信用卡提现
信用卡套现
北京信用卡提现
莎凯仙
莎凯仙
莎凯仙
莎凯仙
莎凯仙
莎凯仙
莎凯仙
莎凯仙
莎凯仙
莎凯仙
莎凯仙
莎凯仙
喜来健
喜来健
喜来健
喜来健
手机窃听器
窃听器
手机监听器
监听器
手机窃听器
窃听器
手机监听器
监听器
手机窃听器
窃听器
手机窃听器
窃听器
手机监听器
监听器
手机窃听器
手机窃听器
手机窃听器
手机窃听器
手机窃听器
手机窃听器
手机窃听器
手机窃听器
手机窃听器
手机窃听器
手机窃听器
手机窃听器
手机窃听器
窃听器
仓储货架
货架
仓储笼
仓储笼
仓储笼
仓储笼
货架
仓储笼
塑料托盘
仓储货架
中度货架
仓储设备
货架
护栏网
护栏网
仓储笼
仓储笼
手推车
静音手推车
静音手推车
铁板手推车
钢托盘
塑料托盘
钢托盘
仓储笼
登高车
手推车
钢制料箱
护栏网
塑料托盘
托盘
仓储笼
手推车
仓储笼
钢托盘
木托盘
仓储笼
钢托盘
塑料托盘
轻型货架
中量A型货架
中量B型货架
货位货架
阁楼式货架
悬臂式货架
抽屉式货架
滚轮式货架
贯通货架
3D mobile & cell phone games at Game Mobile. Free Java Games for Mobile & Cell Phone.
We provide cheap wow gold and wow power levelingto each loyal and reliable customer, each of them is able to buy wow gold here.
Multiplayer mobile & cell phone games at Game Mobile. Free Java Games for Mobile & phone games gow9ge hyyqqgo.
You can find large collection of Alcatel mobile Games at Game Mobile. All Alcatel phones are listed below. Select your cell phone model to check the Alcatel games available.