1.思路
加载配置文件;
通过反射实例化bean并初始化;
2.实现
定义applicationContext.xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<bean id="user" class="com.yalong.User">
<property name="uName" value = "yalong"></property>
<property name="age" value = "10"></property>
</bean>
</beans>
生命spring容器:
public class BeanFactory
{
private static Document document;
static {
try
{
SAXReader saxReader = new SAXReader();
document = saxReader.read("src/applicationContext.xml");
}catch (Exception e){
e.printStackTrace();
}
}
//根据id获取指定的bean对象
public Object getBean(String beanId)
{
Object bean = null;
String xpath = "//bean[@id='"+beanId+"']";
List<Element> list = document.selectNodes(xpath);
Element element = list.get(0);
String beanClazzName = element.attributeValue("class");
try
{
Class beanClazz = Class.forName(beanClazzName);
//1.创建bean的实例
bean = beanClazz.newInstance();
//2.初始化bean
initBean(bean,element);
}catch (Exception e){
e.printStackTrace();
}
return bean;
}
private void initBean(Object bean, Element element) throws Exception
{
//获取property子标签
List<Element> elements = element.elements("property");
if(elements == null || elements.size() == 0){
return;
}
for (Element property : elements){
String fieldName = property.attributeValue("name");
String value = property.attributeValue("value");
//获取指定fieldName对应的field对象
Field field = bean.getClass().getDeclaredField(fieldName);//private String uName;
//获取对应field对象的返回类型
String fieldTypeName = field.getType().getName();//String
field.setAccessible(true);
if("java.lang.String".equals(fieldTypeName)){
field.set(bean,value);
}else if("int".equals(fieldTypeName)){
field.set(bean,Integer.valueOf(value));
}
}
}
}
定义结构体类:
public class User
{
public String getuName()
{
return uName;
}
public void setuName(String uName)
{
this.uName = uName;
}
private String uName;
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
private int age;
@Override
public String toString()
{
return "user:"+"name="+uName+",age="+age;
}
}
主测试类:
public class Main
{
public static void main(String[] args)
{
BeanFactory beanFactory = new BeanFactory();
User user = (User) beanFactory.getBean("user");
System.out.println(user);
}
}
打印结果:
user:name=yalong,age=10