文档章节

模拟Spring的属性装配

小峰1005419213
 小峰1005419213
发布于 2015/04/15 20:37
字数 512
阅读 12
收藏 0
尊重原创。。谢谢大家

思想:
  1:正常加载所有类。如果发现有prop引用,则去cache(map)中去查询这个bean是否存在如果不存在则再去读取xml中的配置实例化这个信息。
  2:可以使用递归实现。



package cn.core;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class MyApplication {
   private Map<String, Object> cache = new HashMap<String, Object>();
   public MyApplication(String config) {
   try {
   //得到真实路径
   URL url = MyApplication.class.getClassLoader().getResource(config);
   File file = new File(url.getPath());
   SAXReader sax = new SAXReader();
   Document dom = sax.read(file);
   parseXml(dom, "//bean");
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
 // 开发一个方法用于解析xml文件
 // 接收两个参数第一个参数,是dom,第二个参数是查询哪些元素
 public void parseXml(Document dom, String xpath) throws Exception {
  List<Element> list = dom.selectNodes(xpath);
  for (Element e : list) {
   String id = e.attributeValue("id");
   if (cache.containsKey(id)) {//如果在缓存中已经包含了这个id
    continue;
   }
   String cls = e.attributeValue("cls");
   Object obj = Class.forName(cls).newInstance();
   cache.put(id, obj);
   List<Element> props = e.elements();
   for (Element p : props) {
    String name = p.attributeValue("name");//
    Object val = p.attributeValue("value");// 1:先读取value这个属性
    if (val == null) {// 2:如果没有value这个属性,则就去读取ref这个属性
     val = p.attributeValue("ref");
     if (val != null) {
      if (!cache.containsKey(val)) {// 这个bean还没有实例化呢//
       // 直接根据id先去加载这个类
       String xpath2 = "//bean[@id='" + val + "']";
       parseXml(dom, xpath2);
      }
      val = cache.get(val);// 上面解析完成以后,在cache缓存中一定是存在这个id元素的
     }
    }
    PropertyDescriptor pd = new PropertyDescriptor(name,
      obj.getClass());
    if (pd.getPropertyType() == Integer.class
      || pd.getPropertyType() == int.class) {
     pd.getWriteMethod().invoke(obj, Integer.parseInt("" + val));
    } else {
     pd.getWriteMethod().invoke(obj, val);
    }
   }
  }
 }
 public <T> T getBean(String id, Class<T> class1) {
  Object obj = cache.get(id);// 根据id从map中获取值
  return (T) obj;
 }
}
实体类
package cn.demo;
import org.junit.Test;
import cn.core.MyApplication;
import cn.domain.Person;
public class Demo01 {
 @Test
 public void test1() {
  MyApplication app = new MyApplication("cn/demo/mybeans.xml");
  Person p1 = app.getBean("person",Person.class);
  System.err.println(p1);
 }
}
自定义配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
 <bean id="aa" cls="cn.domain.Address">
  <prop name="zip" value="10085" />
  <prop name="tel" value="198393843" />
 </bean>
 <bean id="person" cls="cn.domain.Person">
  <prop name="name" value="Jack" />
  <prop name="age" value="33" />
  <prop name="addr" ref="aa"/>
 </bean>
</beans>

© 著作权归作者所有

小峰1005419213
粉丝 0
博文 9
码字总数 3852
作品 0
达川
高级程序员
私信 提问
Spring中Beans的自动装配概述

以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-autowiring.html: 在之前的做法上会参照这样的顺序:1、使用元素声明bean,2、并使用XML配置文件中的和元素注入。但现在可...

easonjim
2017/05/22
0
0
Spring实战3-最小化Spring XML配置

显式装配 自动装配Bean属性 一共有四种自动装配类型(需要在Bean配置里添加autowire属性来指定用哪种类型) byName-把与Bean的属性具有相同名字或ID的其他Bean自动装配到Bean的对应属性中。如...

huntering
2015/08/10
93
0
Java程序员从笨鸟到菜鸟之(七十二)细谈Spring(四)利用注解实现spring基本配置详解

注:由于本人不大习惯注解方式,所以讲解完这里的注解实现基本配置之后,以后就不再单独把注解拿出来讲解了。 五:Spring注解 1.准备工作 (1)导入common-annotations.jar (2)导入schema文件 ...

长平狐
2012/11/12
178
0
【Spring】Autowiredd原理及与Resource注解区别

Autowired注解 Autowired顾名思义,表示自动注入,如下是Autowired注解的源代码: 从Autowired的实现可以看到,Autowired可以用于类的构造方法,类的字段,类的方法以及注解类型上,但是Aut...

weknow
2018/03/06
621
0
Spring组件注解和注入注解内部方式的区别

一、@Component、@Repository、@Service、@Controller区别 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。...

思悟修
2015/08/12
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
今天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部