当前位置: 首页 > article >正文

手写Spring第三篇,原来Spring容器是使用反射来初始化对象的

上次是不是你小子和大家说你拿来做登记的样品被我收了,然后取豆子的时候就是这个样品的?
今天我来辟一下谣,真的是这样的。这小子的样品确实被我收了,不过这小子没给真东西给我,只给了一个指针,害我宝贝得存起来了。结果真东西在我干爹JVM那里。

image.png

这不,今天趁着辟谣。我给大家公布一个好消息,我家工厂马上有生产线了,大家可以多来走走。上次我家工厂被吐槽主要有3个点:

  1. 登记的时候那个死鬼登记员说没样品不行
  2. 登记和取豆子在一个窗口,根本排不过来(虽然没人用)
  3. 没有生产线

今天咱们来一次性解决掉,首先是登记要样品问题,我一个 ctrl-c 一个 ctrl-v 就把这问题解决了。用这个就不用拿样品来了,直接和我说要什么豆子,下次来取我直接给你一个好的豆子。完美!

public class BeanDefinition {  
    private final Class beanClass;  
      
    public BeanDefinition(Class beanClass) {  
        this.beanClass = beanClass;  
    }  
  
    public Class getBeanClass() {  
        return this.beanClass;  
    }  
}

然后是第二个问题,登记和取豆子在一个窗口,根本排不过来。虽然这个问题是我臆想的,但是确实是客观存在的(我到底在说什么?我自己都看不懂了,怎么局里局气的)

image.png

这次取豆子一个窗口,登记一个窗口,再弄一个存豆子的窗口给办事员用。这下你没话说了吧?
我这窗口比豆子都多了。

// 取豆子的窗口
public interface BeanFactory {  
    Object getBean(String name);  
}

// 登记窗口
public interface BeanDefinitionRegistry {  
    void register(String beanName, BeanDefinition beanDefinition);  
}

// 单例豆子窗口,只选优良品种。例如歪瓜和裂枣
public interface SingletonBeanRegistry {
    Object getSingletonBean(String beanName);  
}

再招3个办事员来管3个窗口就O了。

// 单例豆子窗口办事员,这种事情要心腹才行,不然选不到歪瓜裂枣
public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {  
  
    Map<String, Object> singletonBeanMap = new HashMap<>();  
  
    @Override  
    public Object getSingletonBean(String beanName) {  
        return singletonBeanMap.get(beanName);  
    }  
  
    protected void register(String beanName, Object bean){  
        singletonBeanMap.put(beanName, bean);  
    }  
}

本来还想再招两个人的,但有个被卷怕的奋斗b来应该说他带一个团队,但只收一个人的工资来干活。我一听这种人肯定有问题,为了试验他,我决定把生产豆子和登记的窗口交给他。毕竟一个团队只给一份工资,打靶老板都是抵挡不住这种诱惑的。

这个奋斗B我叫他模板哥,模板哥以前曾因为老板不让他用模板方法模式愤而离职,后来找不到工作才成了奋斗B,当打靶老板的舔狗。专门带着一个团队干活但只收一份钱。

他说模板这一套他门清,不止写程序要用模板,连带团队抢活干也需要模板,第一步是抢别人工作,第二步是入职还要带团队加班,第三步是让人骂,第四步是让人砍。

image.png

他说这个程序是他见过最契合模板模式的,有人来取豆子的时候执行这几步就行了:

  1. 查一下以前生产过一样的豆子吗?有就直接把豆子给出去
  2. 没有就查一下登记记录,把对应的登记信息拿出来
  3. 拿登记信息去生产豆子,然后把豆子给出去
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {  
    @Override  
    public Object getBean(String name) {  
        Object singletonBean = super.getSingletonBean(name);  
        if (Objects.nonNull(singletonBean)) {  
            return singletonBean;  
        }  
  
        BeanDefinition beanDefinition = getBeanDefinition(name);  
        return createBean(name, beanDefinition);  
    }  
  
    protected abstract BeanDefinition getBeanDefinition(String beanName) throws BeanException;  
  
    protected abstract Object createBean(String beanName, BeanDefinition beanDefinition) throws BeanException;  
}

image.png

团队的二把手我叫他二表弟,不是我的二表弟是模板哥的二表弟。二表弟平时在团队里有表格罩着,经常是干一些别人能看见但又不难的活。这次他就负责生产豆子,然后把豆子放到单例豆子窗口去就完事了。

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory {  
    @Override  
    protected Object createBean(String beanName, BeanDefinition beanDefinition) {  
        Object instance;  
        try {  
            instance = beanDefinition.getBeanClass().newInstance();  
        } catch (Exception e) {  
            throw new BeanException("Cannot instantiation a bean: " + beanDefinition.getBeanClass().getName());  
        }  
        super.register(beanName, instance);  
        return instance;  
    }  
}

image.png

团队干活的是大杂烩,他啥都想插一手,啥都想露脸,是模板哥的得力助手。模板哥和大表弟会的他全都会,都是一个团队的,继承一下很正常吧。大杂烩因为能说回道,基本上工厂的事情交给他准没错。

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {  
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();  
  
    @Override  
    protected BeanDefinition getBeanDefinition(String beanName) {  
        BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);  
        if (Objects.isNull(beanDefinition)) {  
            throw new BeanException("Cannot found this bean name: " + beanName); 
        }  
        return beanDefinition;  
    }  
  
    @Override  
    public void register(String beanName, BeanDefinition beanDefinition) {  
        beanDefinitionMap.put(beanName, beanDefinition);  
    }  
}

image.png

团队最后还有一个背锅侠,他平时不干活,出事了就找他。他的口头禅就是:那有什么办法呢?我丢

public class BeanException extends RuntimeException {  
    public BeanException(String message) {  
        super(message);  
    }  
}

我们工厂现在人丁兴旺,得整个关系图才行啊。我怕你们来我工厂的时候认不清人,不知道找谁你就找大杂烩。

image.png

现在来我家工厂就是这样的流程了

public class BeanFactoryTest {  
    @Test  
    public void test() {  
        // 大杂烩把工厂准备好  
        DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();  
  
        // 登记  
        BeanDefinition beanDefinition = new BeanDefinition(SuperMungBean.class);  
        defaultListableBeanFactory.register("superMungBean", beanDefinition);  
  
        // 取豆子  
        SuperMungBean service = (SuperMungBean) defaultListableBeanFactory.getBean("superMungBean");  
  
        // 测试看看豆子好不好吃  
        service.test();  
    }  
}

public class SuperMungBean {  
    public SuperMungBean() {  
    }  
  
    public void test() {  
        System.out.println("超级绿豆那必须好吃啊");  
    }  
}

超级绿豆那必须好吃啊


http://www.kler.cn/a/317939.html

相关文章:

  • 深度学习之pytorch常见的学习率绘制
  • Spring Boot实现文件上传与OSS集成:从基础到应用
  • Zotero 6.0 安装包及安装教程
  • 卓胜微嵌入式面试题及参考答案(2万字长文)
  • ubuntu中apt-get的默认安装路径。安装、卸载以及查看的方法总结
  • DNS面临的4大类共计11小类安全风险及防御措施
  • 考前须知:Oracle OCP考试流程和准备
  • 从零开始,Docker进阶之路(三):Docker镜像与命令
  • cmaklist流程控制——调试及发布
  • 深度学习(5):torch.nn.Module
  • 实战OpenCV之几何变换
  • 【学习笔记】exkmp(Z函数)
  • 关于C++的备忘录
  • Qt-QComboBox输入类控件(31)
  • 说一说Zookeeper的应用场景及其原理
  • pandas中数据的合并
  • 200Kg大载重多旋翼无人机应用前景详解
  • Solidity——抽象合约和接口详解
  • 【路径规划】 通过使用前向动态规划算法在地形上找到最优路径
  • 运维工程师面试整理-沟通能力
  • Spring Security 详解:保护Java应用的强大盾牌
  • linux下不同库出现符号冲突的解决方式
  • LLM - 理解 多模态大语言模型(MLLM) 的 幻觉(Hallucination) 与相关技术 (七)
  • Jenkins基于tag的构建
  • Redis: 特色,业务场景举例,底层原理,持续进阶等问题梳理
  • 基于C#+SQL Server(CS界面)学生选课及成绩查询管理系统