我把这个放在设计模式这一栏,是因为我们可以使用这种简单的相当于spring的IOC原理的一种设计方式,对产生任何bean 带来了方便了.对我自己的理解,它更像是一种dao工厂的实现.而在前面,我贴了一篇文章,名字叫:很好用的工厂模式的实现方式,和这个是差不多的,只不过那种是读取properties文件,而这种是在使用了一个工具:commons-digester.jar,它是一个专门用于读取xml文件的一个工具,我们可以在xml文件中,配置好我们的bean,然后使用一个digesterFactory,来对bean进行生产.
一、先设计一个xml文件
config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="user" type="com.hejianjiao.entity.User"></bean>
<bean id="message" type="com.hejianjiao.entity.Message"></bean>
</beans>
这里的标签,我们可以自己定义。只不过现在没有使用DTD来对xml文件进行验证。然后我们就要设计两个对象了:Beans \ Bean
Beans.java
package com.hejianjiao.digester;
import java.util.HashMap;
import java.util.Iterator;
public class Beans {
private HashMap<String, Bean> beans = new HashMap<String, Bean>();
public Iterator<String> getBeans() {
return beans.keySet().iterator();
}
public Bean getBean(String id) {
return (Bean) beans.get(id);
}
public void addBean(Bean bean) {
beans.put(String.valueOf(bean.getId()), bean);
}
}
Bean.java
package com.hejianjiao.digester;
public class Bean {
private String id;
private String type;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
这个就是对xml文件的属性进行一个对象的标明。
三、就是一个DigesterFactory产生bean的工厂:
package com.hejianjiao.digester;
import java.io.File;
import java.io.IOException;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
public class DigesterFactory {
private static File input = new File(
"src/com/hejianjiao/digester/config.xml");
private static Digester digester = new Digester();
private static DigesterFactory factory = null;
private static Beans doDigester() {
// 设置对XML文档资料是否进行DTD验证
digester.setValidating(false);
// 当遇到beans时,就产生一个Beans对象
digester.addObjectCreate("beans", Beans.class);
digester.addSetProperties("beans");
// 当遇到 beans下边的bean时,就生产一个Bean对象
digester.addObjectCreate("beans/bean", Bean.class);
digester.addSetProperties("beans/bean");
// 当再一次遇到bean对象时,就调用Beans中的addBean()方法
digester.addSetNext("beans/bean", "addBean",
"com.hejianjiao.digester.Bean");
Beans beans = null;
try {
beans = (Beans) digester.parse(input);
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
return beans;
}
@SuppressWarnings("static-access")
public static Object getObject(String id) {
Object obj = null;
// 保证工厂的单一性
if (factory == null) {
factory = new DigesterFactory();
}
Bean bean = factory.doDigester().getBean(id);
if (bean != null) {
String className = bean.getType();
try {
obj = Class.forName(className).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("Not found class named : " + className);
e.printStackTrace();
}
}
return obj;
}
}
这里面的写法,与规则,还有方法,可以参照以下去进行学习,这都是对于commons-digester.jar这个包进行的文档:
http://commons.apache.org/digester/
四、然后再看看测试类:
package com.hejianjiao.test;
import com.hejianjiao.digester.DigesterFactory;
import com.hejianjiao.entity.User;
public class Test {
public static void main(String[] args) {
User user = (User) DigesterFactory.getObject("user");
System.out.println(user);
}
}
可以看到,我们可以像工厂模式一样,对想要的bean进行生产。
分享到:
相关推荐
**IOC容器简单实现** IOC(Inversion of Control)容器是软件设计模式中的一种,它将对象的创建和管理权从代码本身转移到一个外部容器,即IOC容器。这种反转控制使得程序更加灵活,降低了组件之间的耦合性,提高了...
本压缩包"ioc_java_源码"提供了一个基于Java反射的简易Ioc实现。我们可以从以下几个关键点来理解这个实现: 1. **Bean定义**:在Ioc容器中,每个对象被称为一个Bean。你需要定义Bean的元信息,包括类名、初始化参数...
NULL 博文链接:https://zhengshuo.iteye.com/blog/573192
这个“一个简单的模仿spring的ioc实现”项目旨在帮助开发者理解Spring Ioc的核心概念,并通过自己的代码实现来加深对这一机制的理解。 首先,Spring Ioc的主要目标是解耦应用程序组件。它通过管理对象的生命周期和...
### Spring.NET学习笔记-实现一个简易的IoC框架 #### 一、背景介绍与理论基础 在.NET领域中,Spring.NET框架是一个非常重要的轻量级框架,它支持依赖注入(Dependency Injection, DI)和面向切面编程(Aspect ...
在这个简易版的Java IOC容器实现中,我们将探讨如何通过自定义注解和反射机制来构建一个基础的IoC容器。 首先,我们有两个自定义注解:`@MyComponent` 和 `@MyAutowired`。 1. `@MyComponent` 是一个类型注解,...
3. **接口**:在IOC框架中,提倡使用接口而非具体的实现类,因为接口可以更好地隐藏实现细节,提高组件之间的解耦。通过定义接口,不同的实现可以在运行时动态切换,这在多环境或多版本兼容时非常有用。 4. **配置*...
在这个类Spring的IOC实现中,可能包含了类似Bean工厂的功能,用于创建和管理对象,以及注入它们所需的依赖。这通常涉及到接口定义、bean配置和容器的初始化过程。 **面向切面编程(Aspect-Oriented Programming,...
在压缩包子文件"my-spring-ioc-master"中,可能包含了一个完整的示例项目,该项目演示了如何手动构建一个简易的Spring IOC容器。项目中可能包括以下部分: - **BeanDefinition**: 表示Bean定义的类,存储Bean的信息...
本项目"自主实现的简易Spring框架"显然是对Spring核心功能的一种简化版实现,旨在帮助开发者深入理解Spring的核心机制。 首先,我们来讨论一下Spring的核心组件——IoC(Inversion of Control)容器。IoC也被称为...
标题 "动手写框架,模拟简易的Spring IOC" 暗示了这个压缩包包含了一个教程或实践项目,目的是帮助我们理解Spring框架的核心组件——控制反转(Inversion of Control,简称IOC)。Spring框架是Java开发中广泛使用的...
在这个“手写简单实现ioc、aop事务demo”中,我们将探讨如何通过工厂模式和动态代理来实现这些概念。 首先,让我们了解IOC的核心思想。在传统的编程中,对象创建和管理的控制权在程序员手中,而IOC则是将这种控制权...
在本资源"手写spring ioc(三) 资源org.zip"中,我们主要关注的是如何实现一个简易版的Spring IOC(Inversion of Control)容器,它涵盖了ioc的基本功能,包括解决循环依赖、使用构造器注入以及自动注入等核心特性。...
标题中提到的“C#实现IOC代码”通常指的是开发者为了理解和掌握DI原理,自己编写了一个简易的IOC容器。这有助于深入理解DI的工作机制,并为实际项目中的应用打下基础。 **什么是IOC(控制反转)?** 控制反转是指将...
从【压缩包子文件的文件名称列表】"ShouXieMVC"来看,这可能是作者实现的一个简易的Model-View-Controller(MVC)架构。MVC是一种设计模式,常用于Web应用,它将业务逻辑(Model)、用户界面(View)和控制逻辑...
在这个名为"spring-simple-master"的压缩包中,包含了一个简易版的IOC(Inversion of Control,控制反转)小框架,其灵感来源于Spring的核心机制。这个项目特别关注如何使用三级缓存来解决属性注入过程中的循环依赖...
在本文中,我们将创建一个简易的IOC容器,以理解其工作原理,并在实际项目中实现类似Spring Boot的自动装配功能。 首先,我们定义测试项目结构。项目包含以下几个关键组件: 1. **SampleApplication**:这是项目的...
在模拟实现中,可能会创建一个类似IoC(Inversion of Control)容器的类,用于管理对象的生命周期和装配它们之间的依赖。 面向切面编程则是Spring的另一个关键特性,它允许开发者将关注点分离,比如日志、事务管理...
在本系列的第一篇中,我们将深入探讨Spring框架的核心特性——依赖注入(Dependency Injection,简称DI),并通过手动实现一个简易的IOC容器来理解其工作原理。Spring框架是Java开发中的基石,它提供了许多功能,如...