参考:http://blog.csdn.net/lyq8479/article/category/1366622
参考:http://neversky.iteye.com/blog/1956018
参考:http://www.cnblogs.com/txw1958/
参考:http://justsee.iteye.com/blog/1298861
参考:http://xiaoye4188.iteye.com/blog/846822
参考:http://josephmok.iteye.com/blog/763653
参考:http://lgd-java2eye.iteye.com/blog/756599
参考:http://byd1200479.iteye.com/blog/1599365
参考:http://jim8757.iteye.com/blog/2059999
参考:http://chenzehe.iteye.com/blog/1488781
参考:http://dyygusi.iteye.com/blog/1997231
参考:http://lgd-java2eye.iteye.com/blog/759878
参考:http://ewf-momo.iteye.com/blog/1693723
Bean元素封装
package spring.mock; import java.util.ArrayList; import java.util.List; /** * Xml文件中<bean/>元素的对象 */ public class BeanDefinition { private String id; private String clazz; private List<PropertyDefinition> propertyDefinition = new ArrayList<PropertyDefinition>(); public BeanDefinition(String id, String clazz) { super(); this.id = id; this.clazz = clazz; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getClazz() { return clazz; } public void setClazz(String clazz) { this.clazz = clazz; } public List<PropertyDefinition> getPropertyDefinition() { return propertyDefinition; } public void setPropertyDefinition(List<PropertyDefinition> propertyDefinition) { this.propertyDefinition = propertyDefinition; } }
Bean中的Property元素封装
package spring.mock; /** * Xml元素中<bean>元素中的property元素 */ public class PropertyDefinition { private String name; private String ref; private String value; public PropertyDefinition(String name, String ref, String value) { super(); this.name = name; this.ref = ref; this.value = value; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRef() { return ref; } public void setRef(String ref) { this.ref = ref; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
ApplicationContext模拟
package spring.mock; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.beanutils.ConvertUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.XPath; import org.dom4j.io.SAXReader; public class MockSpringXmlApplicationContext { private List<BeanDefinition> beanDefinitions = new ArrayList<BeanDefinition>(); private Map<String, Object> singletons = new HashMap<String, Object>(); public MockSpringXmlApplicationContext(String fileName){ try{ this.readXML(fileName); this.instanceBean(); this.injectObject(); }catch(Exception e){ e.printStackTrace(); } } private void readXML(String fileName) throws DocumentException { SAXReader saxReader = new SAXReader(); Document document = null; URL xmlPath = this.getClass().getClassLoader().getResource(fileName); document = saxReader.read(xmlPath); XPath beanPath = document.createXPath("//ns:beans/ns:bean"); Map<String, String> nsMap = new HashMap<String, String>(); nsMap.put("ns", "http://www.springframework.org/schema/beans"); beanPath.setNamespaceURIs(nsMap); List<Element> beans = beanPath.selectNodes(document); for (Element element : beans) { String id = element.attributeValue("id"); String clazz = element.attributeValue("class"); BeanDefinition beanDefinition = new BeanDefinition(id, clazz); XPath propertyPath = element.createXPath("ns:property"); propertyPath.setNamespaceURIs(nsMap); List<Element> properties = propertyPath.selectNodes(element); for (Element propElement : properties) { String name = propElement.attributeValue("name"); String ref = propElement.attributeValue("ref"); String value = propElement.attributeValue("value"); PropertyDefinition propertyDefinition = new PropertyDefinition(name, ref, value); beanDefinition.getPropertyDefinition().add(propertyDefinition); } beanDefinitions.add(beanDefinition); } } private void instanceBean() throws InstantiationException, IllegalAccessException, ClassNotFoundException { for (BeanDefinition beanDefinition : beanDefinitions) { if (beanDefinition.getClass() != null && !"".equals(beanDefinition.getClass())) { singletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClazz()).newInstance()); } } } private void injectObject() throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { for (BeanDefinition beanDefinition : beanDefinitions) { Object bean = singletons.get(beanDefinition.getId()); if (bean != null) { PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors(); for (PropertyDefinition propertyDefinition : beanDefinition.getPropertyDefinition()) { for(PropertyDescriptor propertyDescriptor:ps){ if(propertyDefinition.getName().equals(propertyDescriptor.getName())){ Method setterMethod = propertyDescriptor.getWriteMethod(); if(setterMethod!=null){ Object temp = null; if(propertyDefinition.getRef()!=null&&!"".equals(propertyDefinition.getRef().trim())){ temp = singletons.get(propertyDefinition.getRef()); }else if(propertyDefinition.getValue()!=null&&!"".equals(propertyDefinition.getValue().trim())){ temp = ConvertUtils.convert(propertyDefinition.getValue(), propertyDescriptor.getPropertyType()); } setterMethod.setAccessible(true); setterMethod.invoke(bean, temp); } break; } } } } } } public Object getBean(String beanName){ return this.singletons.get(beanName); } }
测试DAO
package spring.mock; public class UserDAO { private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public String toString() { return "UserDAO [id=" + id + "]"; } }
测试Service
package spring.mock; public class UserService { private String id; private String name; private int age; private UserDAO userDAO; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } @Override public String toString() { return "UserService [id=" + id + ", name=" + name + ", age=" + age + ", userDAO=" + userDAO + "]"; } }
beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="userDAO" class="spring.mock.UserDAO"> <property name="id" value="userDAO_id_001" /> </bean> <bean id="userService" class="spring.mock.UserService"> <property name="id" value="userService_id_001" /> <property name="name" value="userName_test" /> <property name="age" value="23" /> <property name="userDAO" ref="userDAO" /> </bean> </beans>
测试类
package spring.mock; public class Test { public static void main(String[] args) { MockSpringXmlApplicationContext context = new MockSpringXmlApplicationContext("beans.xml"); UserService userService = (UserService)context.getBean("userService"); System.out.println(userService.toString()); } }
相关推荐
模拟Spring的IoC,我们可以创建一个简单的容器类,其中包含一个Map来存储bean。然后使用注解处理器扫描带有特定注解(如`@Component`)的类,并将它们注册到容器中。当需要注入依赖时,容器可以解析注解并自动装配。...
**模拟Spring的IOC** 在Java世界中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)能力,成为企业级应用开发的首选框架之一。理解并模拟Spring的IOC...
《尚学堂_Spring_0100_模拟Spring》 在深入探讨Spring框架之前,我们需要先理解Spring的核心理念。Spring是一个开源的Java平台,它主要为构建企业级应用提供了全面的编程和配置模型。它的核心特性是依赖注入...
这个"模拟spring ioc过程"的学习例子是基于Java语言的,旨在帮助理解Spring框架中的这两个核心概念。在Java工程中,我们通常会通过配置文件(如XML或Java配置类)来定义bean的定义和它们之间的依赖关系。在实际运行...
模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object> beans = new HashMap, Object>...
在这个项目中,“基于java简单模拟实现spring_ioc”显然是为了帮助开发者理解Spring的IoC容器是如何工作的,以及如何通过Java代码来模拟这个过程。 首先,让我们了解什么是Spring的IoC。IoC是一种设计模式,它将...
这篇博客“java模拟spring ioc”很可能是探讨如何在没有Spring框架的情况下,使用纯Java代码来实现类似Spring的IOC功能。以下将详细介绍Spring的IOC和DI概念以及如何模拟这些概念。 **依赖注入(Dependency ...
下面我们将深入探讨这个"模拟spring IOC非常好的事例"所涵盖的知识点。 首先,我们需要理解什么是IOC。IOC是一种设计模式,它的主要思想是将对象的创建和管理权交给一个外部容器,而不是由对象自身来负责。这样可以...
本文将通过注解方式来模拟Spring的IoC和AOP,帮助你深入理解这两个概念的实现原理。 **一、依赖注入(IoC)** 依赖注入是Spring框架的核心特性,它使得对象之间的依赖关系由容器管理,而不是由对象自身管理。在...
在这个模拟Spring IoC的项目中,我们可以深入理解以下几个关键知识点: 1. **容器的概念**:Spring IoC容器是管理对象及其依赖关系的核心组件。在这个模拟项目中,会有一个类或接口扮演容器的角色,负责创建对象、...
1. **配置文件解析**:在`springIOC_0602`项目中,我们有一个XML配置文件,它定义了bean的声明和它们的依赖。JDOM库被用来读取这个文件,解析bean的定义,包括bean的类名、属性、依赖等。 2. **Bean的创建**:解析...
本篇文章将详细解析“模拟Spring IOC技术”的核心概念,并通过一个小Demo帮助你深入理解IOC的工作原理。 首先,我们来解释一下什么是IOC和DI。控制反转(IOC)是编程中的一个设计原则,它改变了对象获取依赖的方式...
这个练习分为三个主要部分,旨在帮助我们掌握XML配置文件的读取,模拟Spring的IoC机制,以及对Struts框架的简单模拟。下面将逐一解析这些知识点。 **1. XML读取** XML(Extensible Markup Language)是一种通用的...
本教程将深入探讨如何模拟Spring框架的IOC(Inversion of Control,控制反转)功能,特别关注XML配置文件的解析。 首先,我们需要理解什么是IOC。控制反转是一种设计原则,它将对象的创建和管理从对象本身剥离出来...
在`YQIoc`这个压缩包中,可能包含了实现简单模拟Spring IoC容器的代码。通常,这个模拟会包含以下几个部分: 1. **Bean定义**:这是描述对象如何创建和配置的数据结构。在我们的例子中,bean定义可能是以XML形式...
Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...
现在,我们将深入探讨如何模拟Spring的IoC容器实现注解自动装配。 首先,我们需要理解IoC容器的基本工作原理。IoC容器是通过扫描应用程序上下文来发现所有需要管理的bean,并根据bean定义来创建和初始化这些bean。...
Spring框架是Java开发中不可或缺的一部分,它通过提供控制反转(IOC)和面向切面编程(AOP)等核心特性,极大地简化了企业级应用的构建。让我们深入探讨这两个概念及其在Spring中的实现机制。 首先,Spring的控制...
在这个场景下,我们将讨论如何通过工厂模式来模拟Spring的IOC(Inversion of Control,控制反转)机制,从而更好地理解这两者之间的关系。 首先,让我们深入了解一下工厂模式。工厂模式是一种设计模式,它提供了一...
例如,`SpringIOC`目录中的配置文件(如`applicationContext.xml`)用于定义bean的定义和它们之间的依赖关系。通过XML或注解方式声明bean,Spring可以自动管理bean的实例化、初始化和销毁,从而简化了代码并提高了可...