`
bcyy
  • 浏览: 1831054 次
文章分类
社区版块
存档分类
最新评论

[模拟Spring]java读取xml文件,并实例化

 
阅读更多

先写一个xml文件:beans.xml

<beans>
<bean id="u" class="com.msb.dao.UserDAOImpl" />
<bean id="userService" class="com.msb.service.UserService" >
<property name="userDAO" bean="u"/>
</bean>
</beans>

这段代码的意图就是先声明一个id为u的bean,再声明一个id为userService的bean,同时,打算把u注入到userService当中,并成为它的userDAO属性。

实现这一环节,就需要一个类来完成这项工作,我们用ClassPathXMLApplicationContext来做。

先写一个接口:

public interface BeanFactory {
public Object getBean(String name);
}

通过这个接口,拿到bean实例

public class ClassPathXMLApplicationContext implements BeanFactory {
private Map<String,Object> beans = new HashMap<String,Object>();
public ClassPathXMLApplicationContext(){ //在构造方法中
SAXBuilder sb=new SAXBuilder();
Document doc;
try {
doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
Element root=doc.getRootElement(); //获取根元素HD
List list=root.getChildren("bean");//找到标签为bean的节点
for(int i=0;i<list.size();i++){ //找到每一个bean
Element element=(Element)list.get(i);
String id=element.getAttributeValue("id"); //拿到它的id
String clazz=element.getAttributeValue("class"); //拿到它的class


Object o = Class.forName(clazz).newInstance(); //根据class生成实例
beans.put(id, o); //将id,以及生成实例,放在map当中

//拿到name之后,把第一个字母大写,前面加上set,来调用set方法,这样,就不用我们写
//userSerivce.setUserDAO(userDAO);这句话了


for(Element propertyElement : (List<Element>)element.getChildren("property")) {
String name = propertyElement.getAttributeValue("name"); //userDAO
String bean = propertyElement.getAttributeValue("bean"); //u
Object beanObject = beans.get(bean);//UserDAOImpl instance

String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
System.out.println("method name = " + methodName);

Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
m.invoke(o, beanObject); //调用setUserDAO方法
}

}
}catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Object getBean(String name) {
return beans.get(name);
}
}

最核心的内容就是这些,然后我们用Junit4来做测试:

@Test
public void testAdd(){

BeanFactory factory = new ClassPathXMLApplicationContext();
UserService userSerivce = (UserService)factory.getBean("userService");
//拿到userSerivce实例,在实例化该对象的同时,通过它的构造方法,把userDAO注入了
User u = new User();
userSerivce.add(u);

/*虽然我们写的是userSerivce.add(u)这是业务逻辑
实际的处理方式是调用userSerivce.userDAO.add,而userDAO就是我们通过读取配置文件而注入的*/

//控制反转:原来是类自己控制,自己调用自己的setUserDAO,而现在由容器来控制。由容器来生成这个属性。

}


Okay,就是这样了。。Spring乍一看很难理解,但是如果我们看了它的内部原理,其实并不难。






分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    DWR.xml配置文件说明书(含源码)

    spring Location* 任何以location开头的参数,每个参数都是指定一个spring的配置文件,在参数没有设置的情况下DWR会去读取spring的全局的配置文件. spring beanName 从配置文件中读取的bean的名称 “scope参数允许你...

    springmybatis

    5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis...

    Spring基础.pdf

    器,通过读取XML⽂件中的配置去实例化所有项⽬所需要的对象并放⼊IoC容器中去。这样做的 好处: 不需要在代码中通过new的⽅式去在逻辑运⾏中再去创建对象,可以直接从IoC容器中去获取 项⽬启动时已创建完成的实例...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现 4.3.1. UrlResource 4.3.2. Class...

    Spring.3.x企业应用开发实战(完整版).part2

    10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...

    Spring 2.0 开发参考手册

    3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现 4.3.1. UrlResource 4.3.2. ...

    springMongodb参考文档中文版

    实例化ReactiveMongoTemplate 10.3.2。WriteResultChecking策略 10.3.3。WriteConcern 10.3.4。WriteConcernResolver 10.4。保存,更新和删除文档 10.5。执行回调 11. MongoDB存储库 11.1。介绍 11.2。用法 11.3。...

    spring例子

    spring基础例子一个:通过启动阶段,读取xml文件,把所有xml中指定的对象类字符串,通过Class.forName().instance()实例化,放到map中,后面需要用到的时候,直接在map中通过key去取值。

    java开源包6

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包11

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包9

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包4

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包101

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包5

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

    java开源包8

    fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用...

Global site tag (gtag.js) - Google Analytics