1.动手写简版spring之IOC初创篇

0、目标

xml配置类的id和class
自己写一个ClassPathXmlApplicationContext 类,作为容器,能够读取、解析、创建、获取对象。

1、核心原理

ClassPathXmlApplicationContext 是主要实现类,它持有 类的定义登记册、以及 类初始化后对象的Map。

    private List<BeanDefinition> beanDefinitions = new ArrayList<>();
    private Map<String,Object> singletons = new HashMap<>();

当需要获取对象时,从Map中获取即可

    public Object getBean(String beanName){
        return singletons.get(beanName);
    }

其中,BeanDefiniton是类的配置,核心为id和className。实际上就是对xml配置文件的封装。

public class BeanDefinition {
    private String id,className;

    public BeanDefinition(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;
    }
}

2、实现步骤

创建xml文件,描述类名和路径

<?xml version="1.0" encoding="UTF-8" ?>
<beans>
    <bean id = "superman" class = "com.geek.minis.ioc01.Geek"></bean>
</beans>

解析xml

    public void readXml(String fileName){
        SAXReader saxReader = new SAXReader();
        URL resource = this.getClass().getClassLoader().getResource(fileName);
        Document document = null;
        try {
            document = saxReader.read(resource);
            Element rootElement = document.getRootElement();
            List<Element> elements = rootElement.elements();
            for (Element element:elements){
                String id = element.attributeValue("id");
                String aClass = element.attributeValue("class");
                BeanDefinition definition = new BeanDefinition(id,aClass);
                beanDefinitions.add(definition);
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

根据解析去创建对象

private void initBeans(){
        for(BeanDefinition beanDefinition: beanDefinitions){
            try{
                singletons.put(beanDefinition.getId(),Class.forName(beanDefinition.getClassName()).newInstance());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

组装!初始化时就干完所有的事。


    public ClassPathXmlApplicationContext(String xmlFileName) {
        this.readXml(xmlFileName);
        this.initBeans();
    }

3、测试代码

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("beans.xml");
        SuperMan man = (SuperMan) classPathXmlApplicationContext.getBean("superman");
        man.bang();
    }
}

测试结果
在这里插入图片描述

结语

本专栏做一个简版的spring ,通过动手实践进一步理解ioc、aop、mvc、jdbcTemplate登。
项目代码分享在 https://github.com/forestnlp/minispring

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring框架是一个非常庞大的框架,涵盖了很多的功能和模块。如果要手一个简单版的Spring框架,我们可以从以下几个方面入手: 1. IOC容器 Spring框架的核心就是IOC容器。我们可以实现一个简单的IOC容器,通过注解或配置文件的方式来管理Bean。首先,我们需要定义一个Bean类,它包含了类名、类路径、是否单例等信息。然后,我们需要解析注解或配置文件,将所有的Bean信息存储到一个Map中。最后,在需要使用Bean的地方,我们可以通过Bean的名称从Map中获取Bean实例。 2. AOP Spring框架的另一个核心是AOP。AOP可以帮助我们实现各种各样的切面功能,例如事务管理、日志记录等。我们可以通过定义切点和切面来实现AOP。切点定义了哪些方法需要被代理,切面定义了具体的代理逻辑。我们可以使用JDK动态代理或者CGLIB动态代理来实现代理逻辑。 3. MVC Spring框架还提供了一个MVC模块来帮助我们实现Web应用程序。我们可以实现一个简单的DispatcherServlet来接收HTTP请求,并且根据请求路径和请求方法来调用相应的Controller方法。Controller方法可以返回一个ModelAndView对象,其中包含了响应页面的路径和数据模型。最后,我们可以使用模板引擎来渲染响应页面。 以上是实现一个简单版Spring框架的基本思路。当然,这只是一个简单的示例,实际上Spring框架还包括了很多其他的功能和模块,例如JDBC、ORM等。如果想要更深入地了解Spring框架,可以参考Spring官方文档或者相关书籍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值