Facility Container - Parameter 实现细节

葛安和
2023-12-01
############################# Parameter 实现细节 2008-08-27 17:50:11#########################################

Parameter 参数类型 --- 包裹着参数的类型.
组件上下文的最小单元,用来描述某一对象所依赖的那些对象,这些对象将作为构造函数,setter方法以及method的参数.

参数在上下文中的类型被定义为一下几种.

1.基本类型
java基本类型(仅包含 short,int,long,float,double,boolean)以及引用类型.这里引用类型只的是非上下文中的对象如<component id = "demo" class = "java.lang.String"/>.
2.上下文引用类型
引用上下文中的组件作为参数如<ref>hello</ref>.
3.集合参数
可以包含其他的参数的参数-集合参数;提供了4中集合参数List,Set,Map,Array;这些集合参数的可以包含其他类型(目前仅仅支持<string><ref>).

~~~Paremter的实现方式~~~

1.类之间的关系.
Parameter 参数接口
AbstractParameter 骨架实现
BasicParameter 基本类型参数
CollectionParameter 集合参数的抽象
ListParameter List实现方式
SetParameter Set实现方式
MapParameter Map实现方式
ArrayParameter Array实现方式
SetterParameter 别名参数 使得参数有名字
RefParameter 上下文引用类型参数
CollectionParamterFactory 集合参数工厂<<abstract>>
DefaultCollectonParameterFactory 工厂的默认实现.

2.在那里使用到
SetterParameter
1.是装饰器类装饰了 getByName 方法是参数有名字,没有被装饰的参数将抛出 java.lang.UnsupportedOperationException ; 在 MapParameter 中元素的key.
2.对于setter方法而言就一个参数而且setter方法是根据参数名称命名的,所以就提供一个名称供寻找方法.

3.实现细节
在具体的实现细节之前先要讨论一下类型别提出2个概念.

public class Simple {
public Simple(A a) {
System.out.println("a");
}

public Simple(B a) {
System.out.println("b");
}

public Simple(C a) {
System.out.println("c");
}

public static void main(String[] args) {
new Simple(new D());
}
}

interface A {
// ...
}

interface B extends A {
// ...
}

interface C extends B {
// ...
}

class D implements A, B, C {
// ...
}

上面的代码将会打印出c,我想要表达的意思是程序会自动选择到指定的"血缘"最近的方法.
而Java反射机制没有提供这样的机制必须给定明确的类型来选择方法,由此引出了2个概念---预期类型和实体类型.
1..实体类型 在这里代表的就是D这个对象的类型.
2.预期类型 你想选择A这个构造函数预期类型就要是A,预期类型的作用就是选择方法.

------------------------------Parameter------------------------------------------------------------------------------------------

/**
* 返回参数实体.
*
* @param facilityContainer FacilityContainer 该参数实体有可能依赖容器的其他实体.
*
* @return Object 参数实体.
*/
public Object getParamEntity(FacilityContainer facilityContainer) throws ParameterException;

/**
* 返回预期类型.
* 用来更加精确的选择方法对象时刻使用.
* @return Class<?> 组件的预期类型.
*/
public Class<?> getExpectType(FacilityContainer facilityContainer);

/**
* 返回实体类型.
*
* @return Class<?> 组件的类型.
*/
public Class<?> getEntityType(FacilityContainer facilityContainer);

/**
* 返回参数的别名.
*
* @return String 参数的别名.
*/
public String getByName();

--------------------------------------------------------------------------------------------------------------------------------------

AbstractParameter
实现了 getByName, getEntityType, getExpectType方法.而返回参数实体的方法根据不同的参数类型分别去实现.
BasicParameter
基本类型参数对象,该类型就是将构造函数放进来的参数直接返回.
CollectionParameter
集合参数抽象,该类型使用到了 模板方法模式.
模板方法 getParamEntity 定义方法的执行顺序以及过程,并通过一些钩子 createParamEntity getElementCache getCheckElement 来创建实体获得元素缓存与验证元素类型.
SetterParameter与RefParameter
2个装饰类 前者是给参数提供有名字的功能,后者是根据"引用"来引用上下文中的其他组件作为参数.
 类似资料: