由于bean里面的property可以由多个,所以应该建立一个类来封装property的信息,然后把所有的property对象存进集合里面,最后通过在bean对应的BeanDefintion类里面加入一个集合属性用来装载property信息,实现编码如下:
BeanDefintion代码:
public class BeanDefinition {
private String id;
private String clazz;
private List<PropertyDefinition> propertys = new ArrayList<PropertyDefinition>();
}
PropertyDefintion代码:
public class PropertyDefinition {
private String name;
private String ref;
}
ClassPathXMLApplicationContext中
readXML方法代码,在上面代码中多加了一个循环,获取bean标签下的property属性:
XPath propertysub = element.createXPath("ns:property");
propertysub.setNamespaceURIs(nsMap);
List<Element> propertys = propertysub.selectNodes(element);
for(Element property:propertys){
PropertyDefinition p = new PropertyDefinition(property.attributeValue("name"), property.attributeValue("ref"));
bean.getPropertys().add(p);
}
injectObject方法代码:
//为bean对象属性注入值
private void injectObject() {
PropertyDescriptor[] ps = null;
// 先循环获取所有的bean属性
for (BeanDefinition beanDefine : beanDefines) {
Object bean = singleton.get(beanDefine.getId());
// 判断是否获取到bean
if (bean != null) {
try {
// 首先获取bean信息
ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
} catch (IntrospectionException e) {
e.printStackTrace();
}
// 如果bean不等于空,则通过循环获取property属性
for (PropertyDefinition property : beanDefine.getPropertys()) {
// 判断property属性是否存在bean中
for (PropertyDescriptor propertydesc : ps) {
if (property.getName().equals(propertydesc.getName())) {
// 获取属性setter方法
Method setter = propertydesc.getWriteMethod();
if (setter != null) {
Object value = singleton.get(property.getRef());
setter.setAccessible(true); //允许访问私有方法
try {
setter.invoke(bean, value);// 把引用对象注入属性里面
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
break;
}
}
}
}
}
}
}
本文介绍了一种通过自定义BeanDefinition和PropertyDefinition类来管理Spring框架中Bean属性的方法。通过对bean配置文件的解析,将bean及其属性信息封装进自定义类,并利用反射机制完成依赖注入。
4221

被折叠的 条评论
为什么被折叠?



