package org.theonefx.wcframework.ioc; import java.lang.reflect.Field; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.theonefx.wcframework.core.ClassWrapper; import org.theonefx.wcframework.ioc.annotation.Inject; import org.theonefx.wcframework.utils.StringUtils; /** * @File : AnnoInjectPostProcess.java * @ClassName : AnnoInjectPostProcess * @Author : 陈曦 * @Date : 2012-2-10 下午01:51:59 * @Version : v1.0 * @Description : 注解注入属性的bean处理器,也就是@Inject注解 */ public class AnnoInjectPostProcess implements MergedBeanDefinitionPostProcessor { private final Log log = LogFactory.getLog(getClass()); @Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, ClassWrapper<?> classWrapper, String id) { Field[] fields = classWrapper.getFields(); for (Field field : fields) { Inject inject = field.getAnnotation(Inject.class); if (inject != null) { if (log.isDebugEnabled()) { log.debug("发现Inject于属性:" + field.getName() + "@Class:" + classWrapper.getWrapperedClass().getName()); } //只有在不包含propertyValue的情况下才注入,如果已经有了propertyValue那么就跳过了,这种情况会出现在使用了<bean>定义了一个bean,同时又使用了@Inject注解的情况 if (!beanDefinition.getPropertyValues().contains(field.getName())) { String valueTxt = inject.value(); Object value = null; if (StringUtils.isNotBlank(valueTxt)) { value = new RuntimeBeanReference(valueTxt); } else { value = new AutoFoundRuntimeBeanReference(field.getName(), field.getType()); } PropertyValue pv = new PropertyValue(field.getName(), value); beanDefinition.getPropertyValues().addPropertyValue(pv); } } } } }