浅析spring IOC操作

浅析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();
  }
 
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值