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);
}
}
}
}
}