`
freewxy
  • 浏览: 342656 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring管理bean的原理自定义实现

阅读更多

1、Spring通过BeanDefinition管理基于Spring的应用中的各种对象以及他们之间的相互依赖关系。BeanDefinition抽象了我们对Bean的定义,是让容器起作用的主要数据类型。 IoC容器是用来管理对象依赖关系的,对IoC容器来说,BeanDefinition就是对依赖反转模式中管理的对象依赖关系的数据抽象,也是容器实现依赖反转功能的核心数据结构,依赖反转功能都是围绕对这个BeanDefinition的处理上完成的。

   定义BeanDefinition: 

 

package com.wxy.bean;

public class beanDefinition {

 

    private String id;

    private String className;

 

    public beanDefinition(String id, String className) {

        this.id = id;

        this.className = className;

    }

 

    /**

     * @return the id

     */

    public String getId() {

        return id;

    }

 

    /**

     * @param id the id to set

     */

    public void setId(String id) {

        this.id = id;

    }

 

    /**

     * @return the className

     */

    public String getClassName() {

        return className;

    }

 

    /**

     * @param className the className to set

     */

    public void setClassName(String className) {

        this.className = className;

    }

 

}

 

2、自定义IoC容器WxyClassPathXMLApplicationContext ,该容器实现三个功能:

 (1 BeanDefinitionresource定位:readXML();

 (2 BeanDefinition的载入和解析 :readXML();

 (3 BeanDefinitionIoC容器中的注册 instanceBeans();

package com.wxy.content;

 

import java.net.URL;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.XPath;

import org.dom4j.io.SAXReader;

 

import com.wxy.bean.BeanDefinition;

 

/**

*  自定义IoC容器 

*  BeanDefinition的resource定位:readXML();

*  BeanDefinition的载入和解析 :readXML();

*  BeanDefinition在IoC容器中的注册 instanceBeans();

*   @create-time     2011-8-10   上午09:19:17   

*   @revision          $Id

*/

public class WxyClassPathXMLApplicationContext {

 

    //存放BeanDefinition的列表,在beans.xml中定义的bean可能不止一个

    private final List<BeanDefinition> beanDefinitions = new ArrayList<BeanDefinition>();

    //将类名作为索引,将创建的Bean对象存入到Map中

    private final Map<String, Object>  sigletons       = new HashMap<String, Object>();

 

    public WxyClassPathXMLApplicationContext(String fileName) {

        //读取xml配置文件

        this.readXML(fileName);

        //实例化bean

        this.instanceBeans();

    }

 

    /**

     * 读取XML配置文件,获取BeanDefinition内容,存入到beanDefinition列表中

     * @param fileName xml配置文件名称

     */

 

    private void readXML(String fileName) {

        SAXReader saxReader = new SAXReader();

        Document document = null;

        try {

            //通过类加载器获取Resource资源路径,实现BeanDefinition的resource定位

            URL xmlPath = this.getClass().getClassLoader().getResource(fileName);

            //将xml读入到document中

            document = saxReader.read(xmlPath);

            Map<String, String> nsMap = new HashMap<String, String>();

            //加入命名空间

            nsMap.put("ns", "http://www.springframework.org/schema/beans");

            //创建beans/bean查询路径,注意:路径前要注明命名空间,便于解析

            XPath xsub = document.createXPath("//ns:beans/ns:bean");

            //设置命名空间

            xsub.setNamespaceURIs(nsMap);

            //获取文档下的所有Bean节点

            List<Element> beans = xsub.selectNodes(document);

            for (Element element : beans) {

                //获取id属性值

                String id = element.attributeValue("id");

                //获取class属性值

                String clazz = element.attributeValue("class");

                BeanDefinition beanDefinition = new BeanDefinition(id, clazz);

                //将新创建的BeanDefinition赌侠ing放入到BeanDeifnitions中

                beanDefinitions.add(beanDefinition);

            }

        } catch (Exception e) {

            System.out.println(e.toString());

        }

    }

 

    /**

     * 实例化bean,存入到sigletons中

     */

    private void instanceBeans() {

        for (BeanDefinition beanDefinition : beanDefinitions) {

            try {

                if (beanDefinition.getClassName() != null

                    && !(beanDefinition.getClassName().isEmpty())) {

                    //利用java反射机制,生成BeanDefinition实例,并将其注册到sigletons中

                    sigletons.put(beanDefinition.getId(), Class.forName(

                        beanDefinition.getClassName()).newInstance());

                }

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

 

    }

 

    /**

     * 根据ID名获取实例bean

     * return 返回一个Object对象,用户使用时,需要对获取的结果进行转换类型

     */

    public Object getBean(String beanName) {

        return this.sigletons.get(beanName);

    }

}

 

 

 

 

3、在测试类中使用自定义的IoC容器:

public class Test {

 

    public static void main(String[] args) {

        //IOC容器实例化

        WxyClassPathXMLApplicationContext ctx = new WxyClassPathXMLApplicationContext("beans.xml");

        //获取业务bean

        PeopleServiceBean peopleService = (PeopleServiceBean) ctx.getBean("peopleService");

        peopleService.save();

    }

 

}

 

测试结果:

-----------------------------------------

--> the method is called save()!

-----------------------------------------

分享到:
评论

相关推荐

    spring自定义标签例子

    此外,理解自定义标签的工作原理还能帮助我们在遇到Spring的其他高级特性,如AOP、事物管理等时,更好地利用XML配置或Java配置来组织代码。自定义标签可以作为扩展Spring功能的一种方式,使我们能够按照自己的需求...

    利用Spring Context上下文创建自定义对象

    本篇文章将深入探讨如何利用Spring Context上下文来创建自定义对象,并理解控制反转的原理。 首先,让我们了解什么是Spring Context。Spring Context是Spring框架的应用上下文,它充当了全局容器,存储了应用的所有...

    spring中注解的实现原理

    总结来说,Spring中注解的实现原理涉及到元注解的定义、注解处理器的运行、BeanDefinition的生成以及AOP和事务管理的注解处理。这些机制使得Spring能够在不依赖XML的情况下,提供灵活、高效且易于维护的框架功能。...

    Spring的bean生命周期

    Bean生命周期的理解对于优化应用性能和理解Spring内部工作原理至关重要。这里我们将深入探讨Spring的Bean生命周期、容器周期以及工厂周期。 首先,让我们从Bean生命周期开始。在Spring中,Bean的生命周期包括以下几...

    Quartz注入Spring的Bean

    5. **实现SpringBeanJobFactory**:自定义一个JobFactory,覆盖`createJobInstance()`方法,让Spring来创建Job实例。 6. **注入其他Bean**:在Job类中,使用@Autowired注解来注入需要的Spring Bean。 **注意事项**...

    Spring Bean 加载顺序 .

    在Spring框架中,Bean的加载顺序是理解Spring IoC(Inversion of Control,控制反转)容器工作原理的关键部分。这个过程涉及到Bean定义的解析、实例化、初始化等多个步骤。让我们详细探讨Spring Bean加载顺序的各个...

    spring依赖注入的实现原理

    Spring通过AOP代理来实现对Bean的增强,提供事务管理、日志记录等服务。有JDK动态代理和CGLIB代理两种方式,前者适用于接口,后者适用于非接口类。 8. **生命周期管理** Spring管理Bean的完整生命周期,包括初始...

    SpringIOC原理实现

    在这个例子中,我们将通过导入Excel数据来深入理解Spring IOC的工作原理,并探讨如何自定义实现。 1. **控制反转**:在传统的编程模式中,我们经常手动创建和管理对象,但在Spring中,对象的创建、初始化、依赖关系...

    Spring在应用中获得Bean的方法

    在开发中,Spring提供的各种工具如`BeanPostProcessor`、`InstantiationAwareBeanPostProcessor`等接口,允许我们自定义Bean的创建和初始化过程,进一步扩展Spring的功能。 总结来说,Spring提供多种方式让我们在...

    spring bean的生命周期测试代码

    4. **容器回调**:在Bean初始化之后,Spring容器可能会调用自己的回调方法,如`BeanPostProcessor`接口实现的`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法,允许自定义逻辑进一步...

    这一次搞懂Spring自定义标签以及注解解析原理说明

    总结起来,Spring的自定义标签解析是通过`NamespaceHandler`机制实现的,而注解解析则依赖于类路径扫描和`BeanDefinition`的创建。这两者都是Spring实现声明式编程和依赖注入的重要组成部分,极大地简化了Spring应用...

    spring ioc和aop原理流程图(详细)

    5. **Bean的生命周期**:Spring容器对Bean的生命周期进行管理,包括初始化、正常使用、销毁等阶段,开发者可以自定义生命周期回调方法以进行特定操作。 ### Spring AOP **面向切面编程(AOP)** 是Spring的另一个...

    spring 自定义xml标签

    本文将深入探讨如何在Spring中自定义XML标签,以及其背后的原理和实现过程。 首先,我们需要理解Spring XML配置的核心——Bean定义。Spring通过解析XML文件中的`&lt;bean&gt;`标签来创建和管理对象,但有时候,`&lt;bean&gt;`...

    深度剖析Spring Boot自动装配机制实现原理(csdn)————程序.pdf

    自动装配的目标是减少手动配置bean,让Spring框架能够根据项目依赖自动识别并管理bean。这个过程主要由`@EnableAutoConfiguration`注解驱动,它的工作原理值得深入探讨。 `@EnableAutoConfiguration`注解引入了`...

    spring mvc freemarker 自定义标签

    在`WebMvcConfigurer`的实现中,添加`freemarkerConfiguration` bean,并使用`freemarkerConfigurer`的`setCustomTags`方法添加自定义标签: ```java @Configuration public class WebConfig implements ...

    spring boot微服务自定义starter原理详解

    Spring Boot 微服务自定义 Starter 是指在 Spring Boot 应用程序中,通过自定义 Starter 来实现微服务架构的自动配置和 Bean 的依赖注入。在本文中,我们将详细介绍 Spring Boot 微服务自定义 Starter 的原理,并...

    【Spring】总结Spring整合Mybatis的底层原理实现步骤

    本文主要探讨Spring整合Mybatis的底层原理和实现步骤,结合鲁班学院公开课笔记,深入理解这一过程。 首先,Dao层是数据访问层,它提供了Service层调用的接口,有时甚至可以作为一个独立的项目。在Spring整合Mybatis...

    自定义Spring框架+Struts框架(内有详细注释)

    本资源"自定义Spring框架+Struts框架(内有详细注释)"显然是为了帮助开发者深入理解这两个框架的工作原理,并可能提供了对它们进行定制的方法。下面将详细探讨这两个框架的关键知识点。 首先,Spring框架以其依赖...

    这一次搞懂Spring自定义标签以及注解解析原理说明.docx

    开发者需要创建一个自定义的`NamespaceHandler`,并实现`parse`方法来解析自定义标签,将解析结果转化为`BeanDefinition`对象并注册到Spring的IoC容器中。为了使Spring知道如何找到对应的`NamespaceHandler`,还需要...

Global site tag (gtag.js) - Google Analytics