参考 比较详细
1、 注入依赖对象
a. 基本类型对象注入:
"serviceDao" class="ServiceDaoBean" >
"0" type="java.lang.String" /> // 构造器注入
"name" value="zhao" /> // 属性setter方法注入
b. 注入其他bean
方式1:
id="serviceDao" class="ServiceDaoBean" >
id="service" class="ServiceBean" >
<property name="serviceDao" ref="serviceDao" />
方式2:
id="service" class="ServiceBean" >
<property name="serviceDao" >
class="ServiceDaoBean" />
property>
c. 注入基本属性类型
id="service" class="ServiceBean" >
<property name="name" value="zhangsan" />
<property name="id" value="88" />
原理如下:
private void readXml(String filename) {
SAXReader reader = new SAXReader();
Document doc = null;
try {
URL xmlPath = this.getClass().getClassLoader().getResource(filename); // 可以获取bin目录下的资源文件
doc = reader.read(xmlPath);
Map nsMap = new HashMap();
// 加入命名空间
nsMap.put("ns", "http://www.springframework.org/schema/beans");
// 创建beans/bean查询路径
XPath xsub = document.createXPath("//ns:beans/ns:bean");
// 设置命名空间
xsub.setNamespaceURIs(nsMap);
// 获取文档下所有的bean
List beans = xsub.selectNodes(document);
for (Element element : beans) {
String id = element.attributeValue("id");
String clazz = element.attributeValue("class");
BeanDefinition d = new BeanDefinition(id, clazz);
XPath propertySub = element.createXPath("ns:property");
propertySub.setNamespaceURIs(nsMap);
List propertyBeans = propertySub.selectNodes(element);
for ( Element propE : propertyBeans ) {
String pName = propE.attributeValue("name");
String pRef = propE.attributeValue("ref");
String value = propE.attributeValue("value");
PropertyDefinition pd = new PropertyDefinition(pName, pRef, value);
bds.getProperties().add(pd);
}
bds.add(d);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void injuectObject() {
for ( BeanDefinition beanDefinition : beanDefinition ) {
Object bean = sigletons.get(beanDefinition.getId());
if ( bean != null ) {
try {
PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
for ( PropertyDefinition propertyDefinition : beanDefinition.getProperties() ) {
for ( PropertyDescriptor propertyDesc : ps ) {
if ( propertyDefinition.getName().equals(propertyDesc.getName())) {
// 获取属性的setter方法
Method setter = propertyDesc.getWriteMethod();
if ( setter != null ) {
Object value = null;
if ( propertyDefinition.getRef() != null && !"".equals(propertyDefinition.getRef().trim()) {
value = sigletons.get(propertyDefinition.getRef());
} else {
// 需要引入commons-beanutils-core.jar包
value = ConvertUtils.convert(propertyDefinition.getValue(), propertyDesc.getPropertyType());
}
setter.setAccessible(true); // 如果setter为private
setter.invoke(bean, value); //把引用注入到属性
}
}
}
}
} catch (Exception e ) {
// TODO
}
}
}
}
2、 注入集合类型的属性
public class PersonServiceBean {
private Set<String> sets = new HashSet<String>();
private List<String> lists = new ArrayList<String>();
private Properties properties = new Properties();
private Map<String, String> maps = new HashMap<String, String>();
// set和get方法必须有
}
applicationContext.xml
<bean id="personService" class="PersonServiceBean">
<property name="sets">
<set>
<value>第一个value>
<value>第二个value>
<value>第三个value>
set>
property>
<property name="lists">
<list>
<value>第一个value>
<value>第二个value>
<value>第三个value>
list>
property>
<property name="properties">
<props>
<prop key="key1">value1prop>
<prop key="key2">value2prop>
<prop key="key3">value3prop>
props>
property>
<property name="maps">
<map>
<entry key="key-1" value="value-1">第一个entry>
<entry key="key-2" value="value-2">第一个entry>
<entry key="key-3" value="value-3">第一个entry>
map>
property>
bean>