`

简单模拟spring的容器管理bean

 
阅读更多
package com.spring;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

import com.vo.BeanDefinition;

/** *//**
 * 简单模拟spring的ClassPathXmlApplicationContext spring容器管理bean
 * 
 * 
@author zdw
 * 
 
*/

@SuppressWarnings(
"unchecked")
public class MyApplicationContext
{
    
private List<BeanDefinition> list = new ArrayList<BeanDefinition>();
    
private Map<String, Object> sigletons = new HashMap<String, Object>();

    
public MyApplicationContext(String fileName)
    
{
        
this.readXML(fileName);
        
try
        
{
            instanceBeans();
        }

        
catch (Exception e)
        
{
            e.printStackTrace();
        }

    }


    
/** *//**
     * 实例化所有bean
     * 
     * 
@throws InstantiationException
     * 
@throws IllegalAccessException
     * 
@throws ClassNotFoundException
     
*/

    
private void instanceBeans() throws InstantiationException,
            IllegalAccessException, ClassNotFoundException
    
{
        
for (BeanDefinition bean : list)
        
{
            
if (null != bean.getClassName() && bean.getClassName().length() > 0)
                sigletons.put(bean.getId(), Class.forName(bean.getClassName())
                        .newInstance());
        }

    }


    
/** *//**
     * 读取xml配置
     * 
     * 
@param fileName
     
*/

    
public void readXML(String fileName)
    
{
        SAXBuilder builder 
= new SAXBuilder();
        URL url 
= this.getClass().getClassLoader().getResource(fileName);
        
try
        
{
            Document doc 
= builder.build(url);
            XPath xpath 
= XPath.newInstance("//ns:beans/ns:bean");
            xpath.addNamespace(
"ns",
                    
"http://www.springframework.org/schema/beans");
            List
<Element> beans = xpath.selectNodes(doc);
            
for (Element bean : beans)
            
{
                String id 
= bean.getAttributeValue("id");
                String className 
= bean.getAttributeValue("class");
                BeanDefinition beanDefinition 
= new BeanDefinition(id,
                        className);
                list.add(beanDefinition);
            }


        }

        
catch (JDOMException e)
        
{
            e.printStackTrace();
        }

        
catch (IOException e)
        
{
            e.printStackTrace();
        }

    }


    
/** *//**
     * 得到指定id的bean
     * 
     * 
@param id
     * 
@return
     
*/

    
public Object getBean(String id)
    
{
        
return sigletons.get(id);
    }

}

测试:
@Test
    
public void testMyUserService()
    
{
        MyApplicationContext ctx 
= new MyApplicationContext("beans.xml");
        UserService us 
= (UserService) ctx.getBean("userService");
        us.print();
    }
下载地址1
下载地址2
分享到:
评论

相关推荐

    Spring简单模拟Spring容器

    标题中的“Spring简单模拟Spring容器”意味着我们将探讨Spring框架的核心特性——IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),以及如何通过编程方式模拟Spring容器的工作原理。...

    简单Spring容器实现

    本主题将深入探讨“简单Spring容器实现”,基于提供的标签“源码”和“工具”,我们将聚焦于Spring容器的原理及其简易实现。下面,我们先来理解Spring容器的核心概念,然后逐步探索其内部机制,并通过一个名为...

    Spring容器的通俗理解及简单写法

    4. **管理生命周期**: Spring容器能够管理Bean的生命周期,包括初始化、销毁等。在简单的实现中,可以添加方法来模拟这些生命周期回调。 5. **依赖注入**: 最后,通过反射调用setter方法或构造函数,将依赖注入到...

    简单模拟springIoc容器

    在`YQIoc`这个压缩包中,可能包含了实现简单模拟Spring IoC容器的代码。通常,这个模拟会包含以下几个部分: 1. **Bean定义**:这是描述对象如何创建和配置的数据结构。在我们的例子中,bean定义可能是以XML形式...

    模拟实现Spring的IOC

    2、本工程,模拟实现Spring的IOC,将xml中配置的Bean读入到Spring容器中,并在测试用例中调用Spring容器中的bean。 3、开发环境eclipse,jdk1.6。使用第三方jar包有:jdom.jar(用于解析xml文件),junit-4.4.jar...

    自己动手模拟spring

    4. **Bean的生命周期管理**:Spring容器管理bean的完整生命周期,包括初始化、正常使用和销毁。在模拟中,我们需要实现类似的功能,如初始化方法调用、属性设置、销毁方法的执行等。 5. **IoC容器**:这是Spring的...

    模拟Spring的IoC容器实现注解自动装配

    现在,我们将深入探讨如何模拟Spring的IoC容器实现注解自动装配。 首先,我们需要理解IoC容器的基本工作原理。IoC容器是通过扫描应用程序上下文来发现所有需要管理的bean,并根据bean定义来创建和初始化这些bean。...

    模拟Spring的IOC

    通过以上步骤,我们可以构建一个简单的IOC容器,模拟Spring的核心功能。这不仅有助于理解Spring的工作原理,也为我们自定义轻量级框架提供了可能。在实际开发中,了解并掌握Spring的IOC机制能够帮助我们更好地设计和...

    java模拟spring ioc

    1. **创建Bean工厂**:首先,我们需要一个类来模拟Spring的Bean工厂,它负责创建和管理对象。这个工厂可以包含一个Map,用于存储对象及其对应的类。 2. **定义Bean接口**:为每个需要管理的对象定义一个接口,接口...

    以注解方式模拟Spring IoC AOP

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

    Java模拟spring实现

    通过XML配置文件,我们可以声明bean及其依赖关系,使得Spring容器可以在运行时自动创建和管理这些对象,从而降低组件之间的耦合度,提高代码的可测试性和可维护性。在实际的Spring应用中,这一过程可以通过更高级的...

    简单模拟Spring的beanFactory

    本文将通过模拟Spring的`BeanFactory`来深入理解其工作原理,帮助开发者更好地掌握Spring的核心概念。 `BeanFactory`是Spring框架中最基础的bean管理容器,它是所有更高级别的容器(如`ApplicationContext`)的基类...

    自定义注解得使用,模拟spring通过注解方式创建bean实例

    在Java开发中,Spring框架是广泛使用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)...通过创建自定义注解和相应的处理器,我们可以模拟Spring的行为,为应用程序提供高度定制化的bean管理策略。

    spring bean的生命周期测试代码

    在Spring框架中,Bean的生命周期管理是其核心特性之一,它允许开发者控制Bean从创建到销毁的整个过程...通过分析提供的测试代码,我们可以加深对Spring容器如何管理和控制Bean的理解,从而更有效地利用这一强大的功能。

    模拟Spring IoC

    在这个模拟Spring IoC的项目中,我们可以深入理解以下几个关键知识点: 1. **容器的概念**:Spring IoC容器是管理对象及其依赖关系的核心组件。在这个模拟项目中,会有一个类或接口扮演容器的角色,负责创建对象、...

    模拟spring ioc过程

    在实际运行时,Spring容器会读取这些配置,根据定义创建并管理bean,这就是IOC的过程。 在IOC的实现中,Spring提供了几种方式来声明bean。首先,我们可以使用XML配置文件,如`beans.xml`,其中包含了bean的ID、类名...

    模拟spring和工具jar包

    2. **Bean**:在Spring中,Bean是被容器管理的对象,它们的实例化、配置和管理都由容器负责。模拟实现可能定义了一些简单的类,这些类代表了实际应用中的业务对象。 3. **依赖注入**:这是Spring的核心。在模拟中,...

    模拟spring

    通过模拟Spring的实现,我们可以更深入地了解Spring框架的运作机制,包括IoC容器的初始化、bean的生命周期管理、AOP的实现原理等。同时,动手实践能帮助我们更好地掌握这些概念,并将其应用于实际项目中。 总的来说...

    使用反射和注解模拟Spring的依赖注入

    模拟Spring的依赖注入,我们可以创建一个简单的容器类,它使用反射来扫描带有特定注解的类,并根据这些注解管理bean。以下步骤概括了这个过程: 1. **定义注解**:创建自定义注解,如`@MyComponent`,用于标记需要...

    模拟Spring架构的简易实现

    "模拟Spring架构的简易实现"这个项目可能是为了理解和学习Spring框架的基本原理而创建的,它可能通过简单的代码来模拟Spring的一些核心功能。 首先,我们要理解Spring的核心概念。依赖注入是Spring最基础的设计模式...

Global site tag (gtag.js) - Google Analytics