手写Spring

手写Spring配置文件开发

思路:
1、通过解析配置文件获取类的全限定类名
2、通过反射来创建对象,避免使用new关键字

xml文件:

<-- 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.xsd">

    <bean id="userMapperImpl" class="com.hjj.mapper.impl.UserMapperImpl"></bean>
    <bean id="userServiceImpl" class="com.hjj.service.impl.UserServiceImpl">
        <property name="userMapper" ref="userMapperImpl"></property>
    </bean>
    <bean id="userController" class="com.hjj.controller.UserController">
        <property name="userService" ref="userServiceImpl"></property>
    </bean>

</beans>

代码:

import com.hjj.controller.UserController;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class Resole_XML {
    private static Map<String,String> map;
    private static Map<String, Map<String,String>> pros;
//    private static Map<String,Object> object = new HashMap<>();

    public static void main(String[] args) throws Exception{
        //获取输出流
        InputStream in = Resole_XML.class.getClassLoader().getResourceAsStream("My_Spring_Config.xml");
        init(in);
       UserController userController =  (UserController)getObject("userController");
        userController.login();
    }

    //从工厂获取对象
    public static Object getObject(String id) throws Exception{
        return factory(id,null);
    }

    //工厂方法生产对象
    public static Object factory(String id,Object obj) throws Exception{
        for(Map.Entry<String,String> entry : map.entrySet()){
            String key = entry.getKey();
            if(id.equals(key)){
                String className = entry.getValue();
                Class cls = Class.forName(className);

                if(obj == null){
                    //如果是第一次传入
                    obj = cls.newInstance();
                }

                if(pros.get(id).size() < 1){
                    return obj;
                }

                for(Map.Entry<String,String> entry2 : pros.get(id).entrySet()){
                    String filedName = entry2.getKey();
                    String className2 = entry2.getValue();
                    String methonName = "set"+filedName.substring(0,1).toUpperCase()+filedName.substring(1);
                    Field field = cls.getDeclaredField(filedName);
                    Method method = cls.getDeclaredMethod(methonName,field.getType());
                    Object value = Class.forName(className2).newInstance();
                    method.invoke(obj,value);

                    //自己调自己,递归
                    factory(filedName+"Impl",value);
                }
            }
        }

        return obj;
    }

    //通过Jsoup获取配置文件信息,并存储信息到map集合
    public static void init(InputStream in) throws Exception{
        map = new HashMap<>();
        pros = new HashMap<>();

        //解析xml配置文件
        Document parse = Jsoup.parse(in, "utf-8", "http://www.google.de");
        //获取bean标签
        Elements beans = parse.select("bean");

        for (Element bean : beans) {
            String id = bean.attr("id");
            String cls = bean.attr("class");
            map.put(id,cls);

            Map<String,String> m = new HashMap<>();
            Elements property = bean.select("property");
            for (Element prop : property) {
                String filedName = prop.attr("name").replace("Impl","");
                String ref = property.attr("ref");
                for (Element bean2 : beans) {
                    if (bean2.attr("id").equals(ref)){
                        cls = bean2.attr("class");
                    }
                }
                m.put(filedName,cls);
            }
            pros.put(id,m);
        }
    }
}
### 回答1: Spring Framework是一个开源的Java平台,它提供了一组全面的工具来支持Java应用程序开发。它主要包括IoC容器、AOP框架、事务管理、MVC框架、DAO框架、连接池等。它可以帮助程序员更好地组织代码,减少重复性工作,提高代码质量。手写Spring框架需要对Java编程和设计模式有较深的了解,并对Spring框架的源码有着深入的研究。 ### 回答2: Spring框架是一个开源的Java平台,用于构建企业级应用程序。它提供了一种全面的编程和配置模型,用于开发基于Java的应用程序和服务。手写Spring框架意味着从头开始实现Spring的核心功能。 手写Spring框架的基本步骤包括: 1. 创建一个核心容器类,用于管理应用程序中的Bean对象。这个容器类需要提供注册、获取和销毁Bean的功能。 2. 定义一个Bean注解,用于标识哪些类应该被容器所管理。 3. 创建一个Bean定义类,用于存储每个Bean的元数据信息,包括类名、作用域和依赖关系等。 4. 实现依赖注入功能,通过读取Bean定义中的依赖关系,将相关的Bean对象注入到目标Bean中。 5. 提供AOP(面向切面编程)功能,允许开发者在应用程序的特定点进行横切关注点的处理。 6. 实现声明式事务管理功能,使用注解或XML配置方式来处理数据库事务。 7. 提供对不同数据访问技术(如JDBC、ORM框架、NoSQL等)的支持,通过集成相应的库来简化数据访问代码。 8. 增加对Web开发的支持,如处理请求、渲染视图等。 手写Spring框架需要具备对Java语言的深入了解,熟悉反射、代理、设计模式等概念和技术。还需要对依赖注入、AOP、事务管理、Web开发等方面有一定的理解。实现一个完整的Spring框架是一个庞大而复杂的任务,需要经过反复的设计、开发和测试。通过手写Spring框架,可以更深入地理解Spring的原理和内部机制,提高对框架的使用和调试能力。 ### 回答3: 手写Spring框架是一个相当复杂的任务,但我可以简要介绍手写Spring框架的一些关键步骤和组成部分。 1. 依赖注入:Spring框架的核心概念之一是依赖注入。我们需要编写一个容器,负责管理和维护各个对象之间的依赖关系。可以使用反射机制来实现依赖注入。 2. 控制反转:Spring框架通过控制反转(IoC)来管理对象的创建和生命周期。我们需要编写一个BeanFactory,负责加载和实例化对象,并将依赖注入到相应的对象中。 3. 配置文件:手写Spring框架也需要一个配置文件,用于定义对象的依赖关系和属性。我们可以使用XML、注解或者JavaConfig等方式来定义配置文件。 4. AOP支持:Spring框架提供了面向切面编程(AOP)的支持,可以通过编写切面和通知来实现横切关注点的统一处理。我们需要实现一个AOP框架,用于拦截和处理切面逻辑。 5. MVC模式:Spring框架也提供了一个MVC框架,用于处理Web应用程序的请求和响应。我们需要编写一个DispatcherServlet,负责将请求分发给相应的控制器,并处理模型和视图的交互。 6. 整合其他技术:Spring框架还可以与其他技术进行整合,例如数据库访问、事务管理、安全性控制等。我们需要编写相应的模块,将这些技术与Spring框架集成起来。 虽然这只是一个简要的介绍,手写Spring框架是一个非常庞大的工程,需要深入理解Spring的原理和设计思想,并具备扎实的Java编程能力。但通过手写Spring框架,我们可以更好地掌握Spring的核心概念和原理,并加深对框架的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值