使用内部bean 但是 内部bean 不可一被其他bean 使用(不使用ref)
xml 文件配置如下:
<bean id="personService"
class="six.spring.service.impl.PersonServiceBean" lazy-init="true">
<property name="personDaoBean">
<bean id="pesonDaoId"
class="six.spring.service.impl.PersonDaoBean">
</bean>
</property>
</bean>
注入 基本类型
<bean id="personService"
class="six.spring.service.impl.PersonServiceBean" lazy-init="true">
<property name="personDaoBean">
<bean id="pesonDaoId"
class="six.spring.service.impl.PersonDaoBean">
</bean>
</property>
<property name="name" value="kao"/>
<property name="id" value="666"/>
首先 将配置文件的信息 反映到对类里去
第一个类:property 对应的类
public class PropertyBeanDefinition {
private String name;
private String href;
// 新增 value 属性
private String value;
// 修改 构造方法 只用name属性 再培植文件里
// 所有的 property 都存在 name属性
// value 和 ref 是 两者居其一
public PropertyBeanDefinition(String name) {
this.name = name;
}
省略set get 方法
第二个类Bean 对应的类不作改变
package six.spring.application.beandefinition;
import java.util.ArrayList;
import java.util.List;
public class BeanDefinition {
private String id;
private String className;
private List<PropertyBeanDefinition> propertys = new ArrayList<PropertyBeanDefinition>();
省略set get 构造方法
第三个类:PersonDaoBean
package six.spring.service.impl;
import org.apache.log4j.Logger;
import six.spring.service.PersonDao;
import six.spring.service.PersonService;
public class PersonServiceBean implements PersonService {
private PersonDao personDaoBean;
private static Logger myLogger = Logger.getLogger(PersonServiceBean.class);
// 新增name属性
private String name;
// 新增id 属性
private Integer id;
解析 xml时 拿到的 value 是 string
利用ConvertUtils.convert 方法 解决 基本类型注入 类型匹配
private void injectObject() {
for (BeanDefinition beanDefinition : beanDefinitions) {
// 将 已经实例化的对象 迭代
Object bean = objsMap.get(beanDefinition.getId());
// 要养成 对 对象判空的编码习惯
if (null != bean){
try {
//利用自反省机制获取成员变量, 继而获得对应的get set 方法
PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
for (PropertyBeanDefinition myPropertyBeanDefinition : beanDefinition.getPropertys()) {
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
if (propertyDescriptor.getName().equals(myPropertyBeanDefinition.getName()) ){
// 通过调用set方法 注入
Method method = propertyDescriptor.getWriteMethod();
if (null != method) {
Object value = null;
if(myPropertyBeanDefinition.getHref() != null &&"" != myPropertyBeanDefinition.getHref().trim()){
value = objsMap.get(myPropertyBeanDefinition.getHref());
} else{
value = ConvertUtils.convert(myPropertyBeanDefinition.getValue(),propertyDescriptor.getPropertyType());
}
// 要养成 对 对象判空的编码习惯
if (value != null) {
method.setAccessible(true);
method.invoke(bean, value);
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}