浅析spring IOC
首先 我们来谈谈IOC的实现
Spring IOC 实现需要的技术 xml解析,反射
一般Srping 的javaBean 都是配置在xml中 配置文件的格式一般如下:
<bean id="u" class="com.softeem.pojos.User"></bean>
<bean id="userAction" class="com.softeem.actions.UserAction">
<property name="user" ref="u"/>
<property name="userDao" ref="udao01"/>
</bean>
具体实现:
(1) 首先我们要解析这个xml 一般使用的技术是 dom4j包下面的 sax解析
(2) 其次需要获取 bean节点下的 class 后的路径,通过反射的原理来实例化对象,并将id做为key 实例化的对象做为value
(3)需要解析 bean节点下的 property 通过set方法类往对象里面赋值
具体操作看代码:
private void init(){
try {
String path=this.getClass().getClassLoader().getResource(configName).getPath();
SAXReader reader=new SAXReader();
Document doc=reader.read(new File(path));
//配置被加载,我们需要从配置文件中获取到每一个bean
// 然后创建被一个bean对应的对象obj,然后以bean的id为key,以创建的对象obj为value保存到map中
Element root=doc.getRootElement();
//通过根节点获取到所有的bean节点
List<Element> bs=root.elements("bean");
//遍历每一个bean 获取到 id属性和 class属性
for (int i = 0; i < bs.size(); i++) {
Element b=bs.get(i);
String bid= b.attributeValue("id");
String clazz=b.attributeValue("class");
//clazz 对应的类对象(通过反射)
Object obj=Class.forName(clazz).newInstance();
List<Element> pros=b.elements("property");
//取到bean标签中的property
for (int j = 0; j < pros.size(); j++) {
Element pro=pros.get(j);
String name=pro.attributeValue("name");
String ref=pro.attributeValue("ref");
Object refObj=map.get(ref);
String sn="set"+name.substring(0,1).toUpperCase()+name.substring(1);
Method method=null;
if(refObj.getClass().getInterfaces().length>0){
method=Class.forName(clazz).getMethod(sn, refObj.getClass().getInterfaces());
}else{
method=Class.forName(clazz).getMethod(sn, refObj.getClass());
}
//对象调用方法 refObj 是方法的参数类型
method.invoke(obj, refObj);
}
System.out.println(bid);
map.put(bid, obj);
}
System.out.println(bs.size());
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}