getComponent的作用是得到依赖的其他对象信息,下面分析一下它的调用流程:


1、得到组件对应的注解信息:


S4PropWrapper s4PropWrapper = getProperty(name, S4Component.class);

S4Component s4Component = (S4Component) s4PropWrapper.getAnnotation();

Class<? extends Configurable> expectedType = s4Component.type();


2、propValues保存了组件的所有属性信息,因此先从propValues获取:


Object propVal = propValues.get(name);


3、如果已经存在propValues中,并且propVal是Configurable类型,直接返回:


if (propVal != null && propVal instanceof Configurable) {

       return (Configurable) propVal;

}


4、如果propVal是String类型,则先得到组件的PropertySheet,然后调用PropertySheet的getOwner方法,进行反射来创建对象,同时保存到propVal中:


if (propVal != null && propVal instanceof String) {

           PropertySheet ps = cm.getPropertySheet(flattenProp(name));

           if (ps != null)

                   configurable = ps.getOwner();

           else

                   throw new InternalConfigurationException(getInstanceName(), name, "component '" + flattenProp(name)

                       + "' is missing");

 }


if (configurable != null) {

       propValues.put(name, configurable);

       return configurable;

}


5、如果 configurable为null,则通过注解来创建,并保存到propValues中:


configurable = getComponentFromAnnotation(name, s4Component);

propValues.put(name, configurable);