`

实现简单spring的IOC

阅读更多
Spring的IOC让被调用者从调用者中实例化解脱出来。而是通过spring的容器去实现配置文件的解析,以及向容器的注入。
Spring的容器使用了工厂的模式,里面实际是用一个Map存放bean标签的id值和实例化的对象。
下面是一个简单的spring的IOC实例
首先定义model
package com.zhy.spring.framework.bean;

/**
* model
*
* @author Create date
*/
public class JavaBean {
private String name;

private String age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String age) {
this.age = age;
}
}
接下来定义配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="javaBean" class="com.zhy.spring.framework.bean.JavaBean">
       <property name="name">
           <value>James</value>
       </property>
       <property name="age">
           <value>12</value>
       </property>
    </bean>
</beans>
最后定义spring工厂,他完成配置文件的解析,以及IOC的注入
package com.zhy.spring.framework.factory;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.zhy.spring.framework.bean.JavaBean;

public class SpringFactory {

/**
* key表示映射文件中bean节点的ID
* value 表示bean对应的对象
*/
private Map<String,Object> factory = new HashMap<String,Object>();

/**
* 解析xml配置文件,ioc对象,最后放入factory中
* @param xmlPath 配置文件的路径
*/
public void init(String xmlPath){
try{
//使用SaxReader进行xml配置文件的读取。
SAXReader saxReader = new SAXReader();
//saxReader的read方法才会返回xml对应的Document,所以需要创建reader对应的InputStream参数

//通过classLoader的getResourceAsStream可以获取对应的InputStream,所以要获取classLoader
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

InputStream in = classLoader.getResourceAsStream(xmlPath);
Document document = saxReader.read(in);
Element root = document.getRootElement();

//遍历root元素下的bean节点,使用element.elementIterator方法
for(Iterator it = root.elementIterator("bean");it.hasNext();){
Element beanEle = (Element)it.next();
//获取ID和class属性
Attribute idAttr = beanEle.attribute("id");
Attribute classAttr = beanEle.attribute("class");

/*
*利用java反射获取class对象
*attribute.getText()后去属性节点对应的值
*beanClass主要的作用就是获取该Class对应的对象的
*/
Class beanClass = Class.forName(classAttr.getText());

//获取beanInfo,beanInfo可以获取该类所具有的属性和方法的相关信息
BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
//获取属性描述
PropertyDescriptor[] pd = beanInfo.getPropertyDescriptors();
//获取实例话对象
Object obj = beanClass.newInstance();

//对bean下的property节点进行遍历
for(Iterator proIte = beanEle.elementIterator("property");proIte.hasNext();){
Element proEle = (Element)proIte.next();
Attribute nameAttri = proEle.attribute("name");

String value=null;
//对property下的value节点进行遍历
for(Iterator valueIte = proEle.elementIterator("value");valueIte.hasNext();){
Element valueEle = (Element)valueIte.next();
value = valueEle.getText();
break;
}
/*
* 将获取的值注入到bean中,利用反射
*  遍历pd数组,找到和name属性节点文本的值相同的项
*  然后将value值注入到对象当中,最后将id和对象存储于map中
*/
for(int i = 0 ; i < pd.length;i++){
PropertyDescriptor descriptor = pd[i];
if(descriptor.getName().equals(nameAttri.getText())){
Method writeMethod = descriptor.getWriteMethod();
writeMethod.invoke(obj,value);
}
}

//将对象放入map中
factory.put(idAttr.getText(),obj);

}
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}

/**
* 根据xml的bean ID获取对应的class实例
* @param beanName
* @return 实例对象
*/
public Object getBean(String beanName){
return factory.get(beanName);
}

public static void main(String[] args) {
//URL url = SpringFactory.class.getResource("/");
String xmlPath = "config.xml";
//System.out.println(xmlPath);

SpringFactory factory = new SpringFactory();
factory.init(xmlPath);
JavaBean  bean = (JavaBean)factory.getBean("javaBean");
//System.out.println(bean.getName());
//System.out.println(bean.getAge());
}
}
分享到:
评论

相关推荐

    用反射和内省技术实现简单SpringIOC

    本篇文章将深入探讨如何利用反射和内省技术来实现一个简单的Spring IOC。首先,我们来理解什么是反射和内省。 反射是Java提供的一种强大的动态类型机制,它允许程序在运行时检查类的信息,如类名、属性、方法等,并...

    SpringIoC的简单实现

    我们从一个简单的容器开始,一步步的重构,最后实现一个基本的Spring框架的雏形,为了帮助我们更加深入的理解Spring的IoC的原理和源码。 详细内容见博文: 【SSH进阶之路】一步步重构容器实现Spring的IoC——从一个...

    基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)

    基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...

    一个简单的模仿spring的ioc实现

    这个“一个简单的模仿spring的ioc实现”项目旨在帮助开发者理解Spring Ioc的核心概念,并通过自己的代码实现来加深对这一机制的理解。 首先,Spring Ioc的主要目标是解耦应用程序组件。它通过管理对象的生命周期和...

    Springioc注入Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器来负责,从而实现了依赖倒置,增强了代码的可测试性和可维护性。DI(Dependency Injection,依赖注入)...

    Spring IOC.pdf

    在Spring框架中,IOC具体体现在对依赖关系的管理上,使得对象的创建、依赖关系的绑定等过程不再由应用程序自身完成,而是转移到一个外部容器(IoC容器)中进行管理,这样就实现了控制权的反转。 首先,Spring IoC...

    Spring IoC依赖包

    - **测试支持**: Spring提供了一系列的测试工具和API,如`@RunWith(SpringJUnit4ClassRunner.class)`,使得基于IoC的单元测试和集成测试变得简单。 以上就是关于"Spring IoC开发最小依赖包"的主要内容,它们共同...

    spring ioc+mvc代码

    本文将通过分析并实现一个简化版的Spring IOC+MVC框架,帮助读者深入理解这两个核心概念以及Spring的工作原理。 一、Spring IOC(Inversion of Control)——控制反转 控制反转,简称IOC,是Spring框架的核心特性...

    手写spring ioc(三) 资源org.zip

    在本资源"手写spring ioc(三) 资源org.zip"中,我们主要关注的是如何实现一个简易版的Spring IOC(Inversion of Control)容器,它涵盖了ioc的基本功能,包括解决循环依赖、使用构造器注入以及自动注入等核心特性。...

    spring IOC 简易实现

    NULL 博文链接:https://zhengshuo.iteye.com/blog/573192

    Spring Ioc 注解 依赖注入

    而Spring通过其IoC容器实现了对对象的创建、配置和管理过程的解耦,使得开发人员可以更加关注业务逻辑的实现。 - **控制反转**:控制反转是指将原本由程序控制的部分(如对象创建)交给外部容器(在这里是Spring...

    以注解方式模拟Spring IoC AOP

    模拟Spring的IoC,我们可以创建一个简单的容器类,其中包含一个Map来存储bean。然后使用注解处理器扫描带有特定注解(如`@Component`)的类,并将它们注册到容器中。当需要注入依赖时,容器可以解析注解并自动装配。...

    SpringIOC示例源代码

    在这个示例源代码中,我们可以看到多个Java类和一个bean.xml配置文件,这些都是实现Spring IOC的关键组成部分。 首先,让我们了解一下什么是控制反转(IOC)。在传统的程序设计中,对象通常自行创建其依赖项,但在...

    基于java简单模拟实现spring_ioc

    在这个项目中,“基于java简单模拟实现spring_ioc”显然是为了帮助开发者理解Spring的IoC容器是如何工作的,以及如何通过Java代码来模拟这个过程。 首先,让我们了解什么是Spring的IoC。IoC是一种设计模式,它将...

    模拟spring ioc过程

    在IOC的实现中,Spring提供了几种方式来声明bean。首先,我们可以使用XML配置文件,如`beans.xml`,其中包含了bean的ID、类名以及依赖关系。例如: ```xml ``` 这里,`exampleBean`依赖于`dependencyBean`。...

    Spring IOC AOP MVC 简单例子

    例如,`SpringIOC`目录中的配置文件(如`applicationContext.xml`)用于定义bean的定义和它们之间的依赖关系。通过XML或注解方式声明bean,Spring可以自动管理bean的实例化、初始化和销毁,从而简化了代码并提高了可...

    模拟Spring的IOC

    要模拟Spring的IOC容器,我们需要实现以下几个核心功能: - **Bean定义(Bean Definition)**:存储对象的创建信息,如类名、属性值、依赖关系等。 - **Bean工厂(Bean Factory)**:负责读取Bean定义,并根据定义...

    Spring IOC 控制反转

    接下来,我们通过一个简单的示例代码来进一步理解Spring IOC控制反转的实现过程: ```java // 定义一个DAO层接口 public interface UserDao { void save(); } // DAO层接口的实现类 public class UserDaoImpl ...

    Spring IoC容器实现的结构分析

    Spring IoC容器是Spring框架的核心,它...无论是简单的应用还是复杂的分布式系统,Spring IoC容器都能有效地支撑其运行。随着Spring版本的演进,虽然具体实现可能有所变化,但其核心设计思想和组件架构依然保持稳定。

    Spring ioc源码解读

    Spring框架的核心功能之一便是依赖注入(Dependency Injection, DI),而这一功能主要通过IoC容器来实现。在Spring框架中,IoC容器负责管理应用对象的生命周期、配置和装配。简单来说,IoC容器就是一个工厂,它可以...

Global site tag (gtag.js) - Google Analytics