教你手写spring框架(一)

简介:    spring框架的原理其实主要是dom4j+反射+xml.原理就是将xml用dmo4j解析,然后取出xml中的元素赋值到实体类中,实体类用反射机制获取其中的属性。

   spring框架的原理其实主要是dom4j+反射+xml.原理就是将xml用dmo4j解析,然后取出xml中的元素赋值到实体类中,实体类用反射机制获取其中的属性。下面具体来说明一下。

首先创建一个UserEntity的实体类.


第一步:创建一个实体类


<?xml version="1.0" encoding="UTF-8"?>
<beans>
 <bean id="user1" class="entity.UserEntity">
  <property name="userId" value="0001"></property>
  <property name="userName" value="余胜军"></property>
 </bean>
 <bean id="user2" class="entity.UserEntity">
  <property name="userId" value="0002"></property>
  <property name="userName" value="张三"></property>
 </bean>
</beans>



第二步:手写一个简单的xml

<?xml version="1.0" encoding="UTF-8"?> 
<students> 
    <student1 id="001"> 
        <简书>@听风_与你</简书> 
        <学号>20140101</学号> 
        <地址>上海市浦东新区世纪大道</地址> 
        <座右铭>要么强大,要么听话</座右铭> 
    </student1> 
    <student2 id="002"> 
        <简书>@听风_与你</简书> 
        <学号>20140102</学号> 
        <地址>上海市浦东新区世纪大道</地址> 
        <座右铭>自信不自大,失败不气馁,倒了爬起来</座右铭> 
    </student2> 
</students>


第三步:创建一个解析xml并且反射将值赋值的类。

package classForm;

import java.lang.reflect.Field;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import entity.UserEntity;

public class ClassPathXmlApplicationContext {
 private String xmlPath;

 public ClassPathXmlApplicationContext(String xmlPath) {
  this.xmlPath = xmlPath;
 }

 public Object getBean(String beanId) throws Exception {
  // 解析xml器
  SAXReader saxReader = new SAXReader();
  Document read = null;
  try {
   // 从项目根目录路径下 读取
   read = saxReader.read(this.getClass().getClassLoader()
     .getResourceAsStream(xmlPath));
  } catch (Exception e) {
   e.printStackTrace();
  }
  if (read == null) {
   return null;
  }
  // 获取根节点资源
  Element root = read.getRootElement();
  List<Element> elements = root.elements();
  if (elements.size() <= 0) {
   return null;
  }
  Object oj = null;
  for (Element element : elements) {
   String id = element.attributeValue("id");
   if (StringUtils.isEmpty(id)) {
    return null;
   }
   if (!id.equals(beanId)) {
    continue;
    // throw new Exception("使用beanId:" + beanId + ",未找到该bean");
   }
   // 获取实体bean class地址
   String beanClass = element.attributeValue("class");
   // 使用反射实例化bean
   Class<?> forNameClass = Class.forName(beanClass);
   oj = forNameClass.newInstance();
   // 获取子类对象
   List<Element> attributes = element.elements();
   if (attributes.size() <= 0) {
    return null;
   }
   for (Element et : attributes) {
    // 使用反射技术为方法赋值
    String name = et.attributeValue("name");
    String value = et.attributeValue("value");
    Field field = forNameClass.getDeclaredField(name);
    field.setAccessible(true);
    field.set(oj, value);

   }

  }
  return oj;
  // 1.使用beanId查找配置文件中的bean。
  // 2.获取对应bean中的classpath配置
  // 3.使用java反射机制实体化对象Class
 }
 
 public static void main(String[] args) throws Exception {
  ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
    "applicationContext.xml");
  UserEntity bean = (UserEntity) applicationContext.getBean("user2");
  System.out.println("使用反射获取bean" + bean.getUserId() + "---" + bean.getUserName());

 }
}


当然这是最简单的手写spring.这是原理.希望各位有什么好建议提出来,虚心求教。

目录
相关文章
|
7天前
|
存储 安全 Java
事件的力量:探索Spring框架中的事件处理机制
事件的力量:探索Spring框架中的事件处理机制
23 0
|
17天前
|
缓存 Java Spring
Spring 框架中 Bean 的生命周期
Spring 框架中 Bean 的生命周期
29 1
|
1月前
|
开发框架 安全 Java
Spring 框架:企业级应用开发的强大工具
在当今数字化时代,企业级应用开发的需求日益增长。为了满足这一需求,开发者们需要一款功能强大、易于使用的开发框架。Spring 框架作为 Java 领域的领先者,为企业级应用开发提供了全面的解决方案。本文将深入探讨 Spring 框架的各个方面,包括其历史、核心模块、优势以及应用场景。
23 0
|
1月前
|
存储 Java 数据库
|
1月前
|
人工智能 JSON 前端开发
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
|
2月前
|
缓存 安全 Java
Shiro框架以及Spring Boot整合Shiro
Shiro框架以及Spring Boot整合Shiro
Shiro框架以及Spring Boot整合Shiro
|
1月前
|
Java 数据库连接 API
【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】
【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】
46 0
|
1月前
|
存储 安全 Java
全面探索Spring框架中的事件处理机制
在现代应用程序中,各个组件之间的通信是至关重要的。想象一下,你的应用程序中的各个模块像是一个巨大的交响乐团,每个模块都是一位音乐家,而Spring事件机制就像是指挥家,将所有音乐家协调得天衣无缝。这种松耦合的通信方式使你的应用程序更加灵活、可维护,而且能够轻松应对变化。现在,让我们进入这个令人兴奋的音乐厅,探索Spring事件的世界。
|
2月前
|
Java 数据库 数据安全/隐私保护
|
2月前
|
Java API 开发者
Spring框架在Java Web开发中的最佳实践
Spring框架在Java Web开发中的最佳实践