对spring框架的学习我是从模拟它的简单实现开始,这样也易于领悟到它的整个框架结构,以下是简单实现的代码:

配置文件:spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="beanId" class="pojo.Unit">
        <property name="name" value="cxhappyday"/>
        <property name="value" value="hello world!"/>
    </bean>
</beans>

 

程序入口:myspring.java

public class myspring {
    public static void main(String[] args) throws Exception{ 
        Unit unit = (Unit)(BeanFactory.getBean("D:\\……\mytest\\src\\test\\sprint.xml", "beanId"));
        System.out.print("unit is "+unit.toString()+",name:"+unit.getName()+",value:"+unit.getValue());
    }
}

 

实例:Unit.java

public class Unit {
    private String name; // 注意这里的name与以上xml文件的name是对用关系(必须相同)
    private String value; // 同上
    public Unit(){
        System.out.print("create Unit object\n");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

 

对象实例化的实现类:BeanFactory.java

package test;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class BeanFactory {

    // 获取实例化后的对象
    static public Object getBean(String path,String nodeName) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, InvocationTargetException{
        Document document = loadXml(path);
        Element nodeElement = getNodeElement(document,nodeName);
        Object obj = reflectObject(nodeElement);
        setObjectAttr(obj,nodeElement);
        return obj;
    }

    // 加载xml文件
    static public Document loadXml(String path) throws DocumentException {
        SAXReader read = new SAXReader();
        return read.read(new File(path));
    }

    // 根据以上xml文件中配置的类全路径(pojo.Unit)使用反射得到实例
    static public Object reflectObject(Element node) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
        return Class.forName(node.attributeValue("class")).newInstance();
    }

    
    static public Element getNodeElement(Document doc,String name){
        String nodeName = "//bean[@id='"+name+"']";
        return (Element)doc.selectSingleNode(nodeName);
    }

    // 根据spring.xml中的配置设置Unit对象的属性值即name和value的值
    static public void setObjectAttr(Object obj,Element element) throws IllegalAccessException, InvocationTargetException{
        List<Element> list = element.elements("property");
        for (Element node:list){
            String name = node.attributeValue("name");
            String value = node.attributeValue("value");

            // 这里关注下 BeanUtils工具类的使用
            BeanUtils.setProperty(obj, name, value);
        }
    }
}

最后说下运行该程序需要的几个Jar包:

1、commons-beanutils-1.8.0.jar:BeanUtils类在该Jar中负责给对象属性赋值;

2、commons-logging.jar:commons-beanutils-1.8.0.jar对它依赖;

3、dom4j-1.6.1.jar:负责解析XML文件;

4、jaxen-1.1-beta-6.jar:dom4j-1.6.1.jar依赖它;

Spring笔记之(一)初探的更多相关文章

  1. Spring笔记02_注解_IOC

    目录 Spring笔记02 1. Spring整合连接池 1.1 Spring整合C3P0 1.2 Spring整合DBCP 1.3 最终版 2. 基于注解的IOC配置 2.1 导包 2.2 配置文件 ...

  2. Spring笔记01_下载_概述_监听器

    目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...

  3. Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)

    Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...

  4. Spring笔记:事务管理

    Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...

  5. Spring笔记:AOP基础

    Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...

  6. Spring:笔记整理(1)——HelloWorld

    Spring:笔记整理(1)——HelloWorld 导入JAR包: 核心Jar包 Jar包解释 Spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件 ...

  7. Spring笔记:IOC基础

    Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...

  8. Spring笔记(6) - Spring的BeanFactoryPostProcessor探究

    一.背景 在说BeanFactoryPostProcessor之前,先来说下BeanPostProcessor,在前文Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析中讲解了Be ...

  9. spring揭秘 读书笔记 一 IoC初探

    本文是王福强所著<<spring揭秘>>一书的读书笔记 ioc的基本概念 一个例子 我们看下面这个类,getAndPersistNews方法干了四件事 1 通过newsList ...

随机推荐

  1. 【ElasticSearch】

    ElasticSearch是基于Lucene开发的分布式搜索框架,包含如下特性: 分布式索引.搜索 索引自动分片.负载均衡 自动发现机器.组建集群 支持Restful 风格接口 配置简单等.

  2. JAVA程序性能分析及调优浅析

    1.性能分析本质 寻找系统的性能瓶颈(木桶理论/短板效应),并处理系统的性能瓶颈 2.性能分析主要指标负载.响应和服务器CPU\MEM等的使用率 3.性能分析主要工具 LoadRunner Visua ...

  3. python 内置函数 getattr

    class Getattr_Test(): var_a = 'abc' def methodA(self): var_b = 'xyz' return var_b t = Getattr_Test() ...

  4. C++编写操作系统(1):基于 EFI 的 Bootloader

    很久以前就对操作系统很好奇,用了这么多年Windows,对他的运作机理也不是很清楚,所以一直想自己动手写一个,研究一下操作系统究竟是怎么实现的.后来在网上也找到过一些教程(比如:<自己动手写操作 ...

  5. 关于\t

    tail -n 10000 sample_dbl.txt | python sitemap.py | sort -k 1 -t $'\t' | python sitecombiner.py > ...

  6. java连接数据库时出现如下错误:

    java.lang.ClassNotFoundException: com.mysql.jdbc.driver at org.apache.catalina.loader.WebappClassLoa ...

  7. linux下监控jvm 使用的方法

    之前一直用jconsole监控jvm,图形界面简单易用,最近因为需要在纯linux下进行操作,所以总结了一下 linux下监控jvm的例子,这次主要用到了jstat工具, 各个参数意义: jstat ...

  8. java super 隐式参数

    第41集 所有构造器里,第一句话就是super()           (隐式的,系统自动执行) 鸟构造器调用动物构造器,动物构造器调用object构造器. (系统默认的) tostring() 方法 ...

  9. live555

    相关资料: Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现 了对多种音视频编码格式的音 ...

  10. MyBatis 学习入门

    mybatis 第一天 mybatis的基础知识 持久层的框架,对jdbc的封装 课程安排 第一天:基础知识(重点,内容量多) 最简单的jdbc程序 public class JdbcTest{ pu ...