`

剖析spring管理bean

阅读更多

Spring容器默认情况下,当服务启动时,解析配置文件,实例化文件中的所有类。

 

我们直接使用spring时,获取spring注入的bean是这样的,        

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");

              MyService myService1 = (MyService) ctx.getBean("myService");

 

那下面我们模拟spring管理bean这个的过程,代码如下

 

1.         第一步,创建java project,引入spring.jar

2.         创建spring.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">

 

</beans>

3.         创建接口MyService,只需要一个测试方法save

4.         创建实现类MyServiceImpl,控制台输出一句话

5.         创建一个自己的解析类MyClassPathXmlApplicationContext

 

主要是构造方法中的两步

 

       // 装载实例化bean

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

       // 装载配置文件的属性和值

       private List<MyBeans> beanlist = new ArrayList<MyBeans>();

      

       public MyClassPathXmlApplicationContext(String filename) {

              //第一步,解析spring配置文件

              readXml(filename);

              //第二步,通过反射,实例化所有注入bean

              initBeans();

       }

 

       /**

        * 通过反射机制,初始化配置文件中的bean

        */

       private void initBeans() {

              for (MyBeans bean : beanlist) {

                     try {

                            if (bean.getClassName() != null && !"".equals(bean.getClassName())) {

                                   beanMap.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());

                            }

                     } catch (Exception e) {

                            e.printStackTrace();

                     }

              }

       }

 

       /**

        * 解析配置文件,把解析后的bean设置到实体中,并保持到list

        *

        * @param filename

        */

       private void readXml(String filename) {

              SAXReader reader = new SAXReader();

 

              Document doc = null;

              URL xmlpath = this.getClass().getClassLoader().getResource(filename);

              try {

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

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

                     doc = reader.read(xmlpath);

                     XPath xpath = doc.createXPath("//ns:beans//ns:bean");// 创建//ns:beans//ns:bean查询路径

                     xpath.setNamespaceURIs(nsMap);// 设置命名空间

                     List<Element> eles = xpath.selectNodes(doc);// 取得文档下所有节点

                     for (Element element : eles) {

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

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

                            //自定义实体bean,保存配置文件中id和class

                            MyBeans beans = new MyBeans(id, cn);

                            beanlist.add(beans);

                     }

              } catch (Exception e) {

                     e.printStackTrace();

              }

 

       }

 

       public Object getBean(String beanId) {

              return beanMap.get(beanId);

       }

 

6.         实体类

 

package com.mooing.service;

 

public class MyBeans {

       private String id;

       private String className;

 

       public MyBeans(String id, String className) {

              this.id = id;

              this.className = className;

       }

 

       public String getId() {

              return id;

       }

 

       public void setId(String id) {

              this.id = id;

       }

 

       public String getClassName() {

              return className;

       }

 

       public void setClassName(String className) {

              this.className = className;

       }

}

 

7.         测试

 

      MyClassPathXmlApplicationContext ctx = new MyClassPathXmlApplicationContext("spring.xml");

              MyService myService = (MyService) ctx.getBean("myService");

               myService.save();

 

总结:

自定义代码同样可以得到使用spring容器实例化的效果,也就是说,实际spring实例化管理bean时,也是经过两大步:第一,服务启动解析配置文件,并保存配置文件中的元素;第二,实例化所有元素,并提供获取实例方法。

分享到:
评论

相关推荐

    Spring2.5视频教程_编码剖析Spring管理Bean的原理

    总的来说,《Spring2.5视频教程:编码剖析Spring管理Bean的原理》是一份详尽的指南,涵盖了Spring框架中Bean管理的核心知识,无论是对初学者还是有经验的开发者,都能从中受益。通过观看黎活明讲师的讲解,你将能够...

    搭建与测试Spring的开发环境和编码剖析Spring 管理Bean的原理

    这个是搭建与测试Spring的开发环境和编码剖析Spring 管理Bean的原理的代码,适合刚接触spring的人学习,如何搭建spring开发环境,以及了解spring是如何管理bean的。这个是由传智播客的老师讲的。

    深入剖析Spring Web源码(含一二版)带目录

    《深入剖析Spring Web源码(含一二版)》是一本深度解析Spring Web框架核心机制的书籍,涵盖了Spring MVC和Spring Web的重要源码分析。这本书旨在帮助开发者深入理解Spring Web的工作原理,提升对Spring框架的使用和...

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

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

    深入剖析Spring Web源码

    ### 深入剖析Spring Web源码 #### 一、Spring Web MVC介绍 **1.1 MVC体系结构** MVC(Model-View-Controller)是一种软件架构设计模式,被广泛应用于构建用户界面丰富的应用程序中。它将应用程序逻辑分为三个核心...

    spring源码剖析

    《Spring源码剖析:深入理解对象管理机制》 在软件开发领域,Spring框架以其强大的功能和灵活的设计,成为了Java企业级应用的事实标准。其核心特性之一就是依赖注入(Dependency Injection,DI),它使得应用程序的...

    编码剖析Spring装配基本属性的原理

    比如,`@Component`家族注解标识一个类作为Spring管理的bean,`@Autowired`自动装配依赖,`@Value`注入值,`@PostConstruct`和`@PreDestroy`分别标记初始化和销毁方法。 3. 配置源: Spring的配置源可以是XML文件...

    深入剖析Spring_Web源码.pdf

    ### 深入剖析Spring Web源码 #### 1. 前言 Spring作为一款卓越的轻量级企业级应用开发框架,在Java开发领域占据了举足轻重的地位。Spring框架以其灵活的依赖注入(Dependency Injection,DI)机制、强大的面向切面...

    Struts2+Hibernate+Spring整合开发深入剖析与范例应用03

    3. 配置Struts2:设置Struts2的配置文件,定义Action类,这些Action类通常是Spring管理的Bean,这样可以利用Spring的依赖注入功能。 4. 配置Struts2-Spring插件:这个插件允许Struts2的动作类直接在Spring容器中...

    编码剖析Spring依赖注入的原理

    此外,`@Primary`注解可以标记一个bean为默认候选者,当没有指定`@Qualifier`时,Spring会优先选择带有`@Primary`的bean。 依赖注入的原理主要涉及Spring容器的初始化过程。容器读取配置信息,创建bean实例,并通过...

    spring运行机制源码剖析

    其中,核心容器包括Bean工厂(BeanFactory)和应用上下文(ApplicationContext),它们负责创建和管理Bean对象,这是Spring的核心。 Bean工厂是Spring的基础,它使用XML配置文件或者基于注解的配置来定义Bean的实例...

    spring3.2 源码

    《深入剖析Spring 3.2.0源码》 Spring框架是Java开发中不可或缺的一部分,其设计理念和实现机制对理解企业级应用开发有着深远影响。本文将围绕Spring 3.2.0版本的源码进行深入探讨,揭示其内部的工作原理,帮助...

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

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

    深入解析SPRING架构与设计原理(第2版) 带标签 高清版,深入剖析spring运行机制

    它通过XML或注解配置来创建和管理bean。 4. **数据访问**:Spring提供了对各种数据存储技术的支持,包括JDBC、ORM框架如Hibernate和MyBatis,以及NoSQL数据库的集成。 5. **MVC框架**:Spring MVC是Spring提供的...

    Spring IoC源码深度剖析开源架构源码2021.pdf

    文档可能将深入探讨Spring IoC容器初始化、Bean生命周期管理、依赖注入等关键概念,并以2021年的开源版本为背景进行分析。 从提供的部分文档内容来看,我们可以提炼出以下几个知识点: 1. **BeanFactory与...

    spring原理技术详细解析 深入剖析

    《Spring技术内幕:深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心机制的书籍。Spring作为Java领域最广泛使用的轻量级框架之一,它的设计理念、核心组件以及工作原理对于任何一位Java开发者来说,都是...

    互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析 .rar

    在源码层面,Spring通过BeanFactory和ApplicationContext管理Bean的生命周期,使用反射和代理技术实现DI和AOP。 其次,Spring MVC是Spring框架的一部分,专为构建Web应用程序而设计。它采用模型-视图-控制器(Model...

    Struts2+Hibernate+Spring整合开发深入剖析与范例应用04

    Spring作为基础架构,可以管理Struts2和Hibernate中的bean,实现依赖注入,使得各组件间的关系更加清晰。Struts2处理用户的请求,通过Action调用Spring管理的业务逻辑,而Hibernate则负责与数据库的交互。 在"04"这...

    马士兵Spring源码剖析文档

    这份文档专注于Java开发者在理解和使用Spring时所遇到的关键概念和技术,包括IoC(Inversion of Control)容器、Bean对象的管理、AOP(Aspect-Oriented Programming)以及SpringMVC和Mybatis的源码分析。下面将对...

    Struts2+Hibernate+Spring整合开发深入剖析与范例应用02

    Spring提供了HibernateTemplate或者SessionFactoryBean,帮助我们更加便捷地操作Hibernate,包括 session的创建、事务的管理以及异常的处理。此外,Spring的JdbcTemplate或NamedParameterJdbcTemplate也可以与...

Global site tag (gtag.js) - Google Analytics