`
huchunyong1987
  • 浏览: 20200 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

简单模拟spring框架原理

阅读更多
首先定义一个接口:
     public interface Action {
    String excute(String msg);
}

然后定义一个类,来实现这个接口:
  
public class UppperCaseAction implements Action{
    private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String excute(String msg) {

return (message+" "+msg).toUpperCase();
}

}


然后就是配置文件了:applicationContext.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.0.xsd">
    <bean name="uppercase" class="com.hcy.Spring.UppperCaseAction">
       <property name="message">
         <value>hello</value>
       </property>
    </bean>
</beans>

通过反射获取bean实例的类:
   package com.hcy.model;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;

import com.hcy.opxml.Mapping;
import com.hcy.opxml.ParseXml;

public class ApplicationContext {
private static HashMap<String,Mapping> map=null;
static{
map=ParseXml.ParseApplicationContext();
}
    public Object getBean(String id){ 
    Object obj=null;
    Method[] methods=null;
    try {
    System.out.println(map.get(id).getClassName());
Class clz=Class.forName(map.get(id).getClassName());
obj=clz.newInstance();
methods=clz.getMethods();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(Method m:methods){
if(m.getName().equalsIgnoreCase(("set"+map.get(id).getProperty()))){
try {
m.invoke(obj, new Object[]{map.get(id).getValue()});
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println(obj.toString());
    return obj;
    }
}


解析xml的类:
   package com.hcy.opxml;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class ParseXml {
    private static HashMap<String ,Mapping> map=new HashMap<String ,Mapping>();
public  static HashMap<String,Mapping> ParseApplicationContext(){
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder builder=null;
    try {
builder=factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Document doc=null;
try {
doc = builder.parse(new File("src/applicationContext.xml"));
} catch (SAXException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
NodeList nodes=doc.getElementsByTagName("bean");
for(int i=0;i<nodes.getLength();i++){
Element e=(Element)nodes.item(i);
String id=e.getAttribute("name");
String className=e.getAttribute("class");
nodes=e.getElementsByTagName("property");
for(int j=0;j<nodes.getLength();j++){
e=(Element)nodes.item(j);
String property=e.getAttribute("name");
String value=e.getElementsByTagName("value").item(0).getFirstChild().getNodeValue();
Mapping mapping=new Mapping();
mapping.setClassName(className);
mapping.setId(id);
mapping.setProperty(property);
mapping.setValue(value);
System.out.println(id+" "+className+" "+property+" "+value);
map.put(mapping.getId(), mapping);
}
}
    return map;
     }
public static void main(String[] args){
ParseXml px=new ParseXml();
px.ParseApplicationContext();
}

}

通过xml当中的配置,与对应的类对应起来,准确地得到bean的实例:
      package com.hcy.opxml;

public class Mapping {
       private String id;
       private String className;
       private String property;
       private String value;
      
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
      
}




接下来就是测试类:
public static void main(String[] args) {
ApplicationContext ac=new FileSystemXmlApplicationContext("src/applicationContext.xml");
        //通过反射机制得到bean的实例
        Action act=(Action)ac.getBean("uppercase");
        System.out.println(act.excute("yes"));
}

最后附上整个工程:
分享到:
评论

相关推荐

    SpringBoot学习代码模拟SpringBoot框架底层原理源代码

    SpringBoot学习代码模拟SpringBoot框架底层原理源代码

    spring3工作原理

    Spring3_模拟Spring框架工作原理 用户模型类User.java package com.bebig.model; public class User { private String username; private String password; public String getPassword() { return password; ...

    深入理解Dubbo框架:从基本原理到模拟实践的全面解析

    本文主要介绍了Dubbo框架的基本原理和使用方法,以及如何手动模拟Dubbo。首先,我们解释了什么是RPC(远程过程调用),它是一种允许一个程序调用另一个程序的计算机通信协议。然后,我们详细介绍了Dubbo,这是阿里...

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...

    Java 架构师教程.txt

    │ 2.2 手写模拟Spring底层原理.mp4 │ 2.3 Spring之底层架构核心概念解析.mp4 │ 2.4 Spring之Bean生命周期源码解析(上).mp4 │ 2.5 Spring之Bean生命周期源码解析(下).mp4 │ 2.6 Spring之依赖注入源码解析...

    spring:这是Spring框架研究

    七、模拟spring(AOP, IOC, DI, BeanPostProcessor及许多常用注解) 八、使用spring FactoryBean技术模拟mybatis MapperScan注解 https://github.com/AvengerEug/spring/tree/develop/implement-mapperscan 九、...

    Spring MVC 3.0实战指南.ppt

    1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7、其它 目录: Spring MVC 3.0新特性 Spring MVC框架结构 Spring MVC框架结构 框架...

    xmljava系统源码-ioc:Thejavaiocframework(从零开始手写模拟springIoc框架)

    spring-boot,spring-cloud 都是建立在这个地基之上。 当别人问你 spring 的时候,希望你可以谈谈自己对于 spring ioc 自己更深层的见解,而不是网上人云亦云的几句话。 什么是 IOC 控制反转(Inversion of Control...

    Spring3MVC注解教程.ppt

    1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7、其它 目录: Spring MVC 3.0新特性 Spring MVC框架结构 Spring MVC...

    Spring.3.x企业应用开发实战(完整版).part2

    经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...

    Java框架篇?spring AOP 实现原理

    OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也是说,OOP允许你定义从上到下的关系,但并不适合定义从左...

    Spring3.x企业应用开发实战(完整版) part1

    经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...

    研究各种Java技术(Springboot+Redis+Dubbo+Rocketmq)

    whatsmars-spring spring原理、集成及新特性 whatsmars-tomcat 模拟tomcat实现 whatsmars-dbrouter 分库分表实现 whatsmars-worker 多实例任务调度 whatsmars-dubbo Dubbo demo whatsmars-mq rocketmq,activemq ...

    研究各种Java技术(Springboot+Redis+Dubbo+Rocketmq) 京东技术 www.toutiao.im

    whatsmars-spring spring原理、集成及新特性 whatsmars-tomcat 模拟tomcat实现 whatsmars-dbrouter 分库分表实现 whatsmars-worker 多实例任务调度 whatsmars-dubbo Dubbo demo whatsmars-mq rocketmq,activemq ...

    基于Java的智能客服系统设计与实现

    本系统主要是做基于 Java 的一个智能客服系统,使用 Spring 框架,MySQL 数据库、ActiveMq 消息中间件、Redis 缓存、Elasticsearch 全文搜索等服务,一个智能客服系统包含的开发任务有:主要包括前端的页面开发,...

    【分布式事务----LCN】LCN原理及使用方式.docx

    LCN的补偿事务原理是模拟上次失败事务的请求,然后传递给TxClient模块然后再次执行该次请求事务。 模拟场景演示 若存在事务发起方、参与方A、参与方B。调用关系图如下 那么他们正常执行业务的时序图为: ...

    java抓取技术源码-spring-test:弹簧测试

    2.全程案例实战驱动讲解和动手演练,每个知识点都会通过实际的代码样例来演示其原理和特性,以模拟真实的案例来驱动讲解各种技术点,帮助同学们在业务背景中理解和掌握复杂的技术。 3.测试驱动开发,整个课程全部...

    JAVA上百实例源码以及开源项目源代码

    Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个...

    JAVA上百实例源码以及开源项目

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码...

Global site tag (gtag.js) - Google Analytics