`
java1996
  • 浏览: 5244 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

剖析Spring管理Bean的原理(学习笔记)

阅读更多
/**
* 模拟spring的解析bean.xml的类
* @author river
*
*/
public class RiverClassPathXMLApplicationContext
{
private List<BeanDefinition> beanDefinitions = new ArrayList<BeanDefinition>();

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

public RiverClassPathXMLApplicationContext(String filename)
{
this.readXML(filename);
this.instanceBeans();
}

/**
* 完成实例化
*/
private void instanceBeans()
{
for (BeanDefinition beanDefinition : beanDefinitions)
{
if (beanDefinition.getClassName() != null
&& !"".equals(beanDefinition.getClassName().trim()))
{
try
{
sigletons.put(beanDefinition.getId(), Class.forName(
beanDefinition.getClassName()).newInstance());
} catch (Exception e)
{
e.printStackTrace();
}
}
}

}

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

/**
* 读取配置文件,filename为bean的配置文件
*
* @param filename
*/
private void readXML(String filename)
{
SAXReader saxReader = new SAXReader();
Document document = null;
try
{
URL xmlpath = this.getClass().getClassLoader()
.getResource(filename);
document = saxReader.read(xmlpath);
Map<String, String> nsMap = new HashMap<String, String>();
nsMap.put("ns", "http://www.springframework.org/schema/beans");// 假如命名空间
XPath xsub = document.createXPath("//ns:beans/ns:bean");// 创建beans/bean
xsub.setNamespaceURIs(nsMap);// 设置命名空间
List<Element> beans = xsub.selectNodes(document);// 获取文档下的bean
for (Element element : beans)
{
String id = element.attributeValue("id");// 获取id属性
String clazz = element.attributeValue("class");// 获取class属性
BeanDefinition beanDefine = new BeanDefinition(id, clazz);
beanDefinitions.add(beanDefine);
}
} catch (Exception e)
{
e.printStackTrace();
}
}
}

PersonService 类的一个实现类:

public class PersonServiceBean implements PersonService {

/* (non-Javadoc)
* @see com.river.spring.PwesionService#save()
*/
public void save()
{
System.out.println("save ()");
}
}

bean.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="personService" class="com.river.service.impl.PersonServiceBean"/>
</beans>

测试:

/**
* personService为bean中的id
*/
public void instanceSpring()
{
RiverClassPathXMLApplicationContext ctx = new RiverClassPathXMLApplicationContext("beans.xml");
PersonService ps = (PersonService) ctx.getBean("personService");
ps.save();
}

结果:save();

分享到:
评论

相关推荐

    Spring学习笔记(6)----编码剖析Spring依赖注入的原理

    本篇学习笔记将深入剖析Spring依赖注入的原理,通过源码分析帮助我们理解这一核心机制。 首先,依赖注入允许我们解耦组件之间的关系,使得各个组件可以独立地进行开发、测试和维护。在Spring中,DI主要通过两种方式...

    Spring学习笔记+学习源码.zip

    这份"Spring学习笔记+学习源码.zip"资源包含了深入学习Spring及其相关技术的知识点,以及实践代码,对提升Spring技能将大有裨益。 首先,我们来详细讨论Spring框架的主要组件和功能: 1. **依赖注入(Dependency ...

    spring5框架学习笔记

    Spring 5 框架学习笔记 本笔记主要介绍了 Spring 5 框架的相关知识点,包括 IoC 原理分析、基于 XML 的 IoC 实现、基于 XML 的 DI 使用、基于注解的 IoC 实现、Spring 纯注解实现方式、Spring 整合 Junit、Spring ...

    Spring高级源码学习笔记.zip

    源码学习是提升编程技能的重要途径,尤其是在理解复杂框架如Spring的工作原理时。本笔记旨在深入解析Spring的高级源码,帮助程序员从应用层面过渡到源码级的理解。 Spring的核心组件包括Bean容器、AOP代理、数据...

    Spring技术内幕 学习笔记

    标题中的“Spring技术内幕 学习笔记”表明这是一份关于深入理解Spring框架核心机制的资料集合,主要关注Spring框架的内部工作原理和高级用法。描述中的“NULL”没有提供额外信息,但我们可以通过标签“源码”和...

    Spring整合Mybatis与SpringBoot整合Mybatis原理分析

    5. **学习笔记要点** - **Spring的IoC和AOP**: 了解Spring如何通过依赖注入和面向切面编程实现组件间的解耦。 - **Mybatis的映射机制**: 明白Mapper接口和XML映射文件是如何协同工作的。 - **事务管理策略**: ...

    spring学习笔记(3.20)

    基于以上分析,我们可以期待这篇"spring学习笔记(3.20)"中包含以下知识点: 1. **Spring框架基础**:介绍Spring的基本概念、架构和核心组件,如IoC(Inversion of Control,控制反转)和DI(Dependency Injection,...

    Spring框架,学习笔记,很优秀的资料

    这份学习笔记将带你深入理解Spring的精髓,包括它的起源、设计理念以及实际应用中的关键功能。 1. **Spring框架简介** Spring最初由Rod Johnson创建,目的是为了解决企业应用开发的复杂性,提供一种轻量级的容器,...

    spring2.0学习笔记+spring定时任务

    标题 "spring2.0学习笔记+spring定时任务" 暗示了我们即将探讨的是关于Spring框架2.0版本的学习心得以及如何在Spring中配置和使用定时任务。在这个主题下,我们将深入理解Spring的核心概念,特别是它在企业级Java...

    spring5源码分析笔记

    Spring5源码分析笔记旨在深入理解Spring的工作原理,帮助开发者提升技能,优化代码,以及更好地利用其核心特性。以下是对Spring5源码的一些关键知识点的详细解释: 1. **依赖注入(Dependency Injection,DI)**:...

    Spring 学习笔记六

    在本篇"Spring 学习笔记六"中,我们将深入探讨Spring框架的核心概念和技术细节,同时结合源码分析,以提升对Spring的理解和应用能力。本文档主要关注Spring的依赖注入(Dependency Injection,DI)机制、AOP(面向切...

    Java企业级信息系统开发学习笔记

    第13篇 Java企业级开发学习笔记(4.2)Spring Boot项目单元测试、热部署与原理分析,介绍了如何使用Spring Boot来实现单元测试、热部署和原理分析,包括创建Spring Boot项目、配置Spring Boot等步骤。 第14篇 Java...

    Spring学习笔记系列之三

    本篇我们将聚焦于"Spring学习笔记系列之三"中的关键知识点——SpringMVC的源码分析,特别是父子容器的启动原理。这个主题是理解Spring MVC工作流程、定制化配置以及优化应用程序性能的关键。 首先,我们要明白...

    Spring学习笔记之一“why spring”

    标题中的"Spring学习笔记之一“why spring”"表明了这篇笔记主要探讨的是Spring框架的核心价值和使用背景。在IT行业中,Spring是一个广泛使用的Java企业级应用开发框架,它以其依赖注入(Dependency Injection,DI)...

    spring学习笔记(三)

    【标题】"Spring学习笔记(三)"主要涵盖了Spring框架的核心概念和使用,特别是关于Spring的依赖注入(Dependency Injection,简称DI)以及AOP(面向切面编程)的应用。这篇笔记可能详细介绍了如何通过XML配置或者Java...

    spring学习文档及源码笔记

    这个资源包含的"spring学习文档及源码笔记"是深入理解并掌握 Spring MVC 的宝贵资料。下面,我们将详细探讨 Spring MVC 的核心概念、工作原理以及如何利用它来构建 Web 应用。 1. **Spring MVC 架构** - **...

Global site tag (gtag.js) - Google Analytics