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

手写一个mini版Spring:如何让容器能注册和获取单例 Bean

如今,我们每天都在面向 AI 工作,对着 AI 描述需求、审查代码、验收结果。效率确实提高了,但是我们的思考却越来越少了,好像也很少有同学再去研究一个框架,去认真看一段源码了。大部分人都会产生一个疑问,Claude、codex 这么厉害还有必要研究源码吗?还有必要懂底层吗?

其实,虽然 AI 的时代让“编码”贬值了,但让“工程能力”更值钱了。只有懂架构、懂设计、懂底层的人,才能理解复杂系统并拆解问题、才能读得懂 AI 写的代码、才能快速对 AI 纠错、才能让 AI 持续迭代。

所以,未来需要的不是会使用 AI 的人。未来真正稀缺的是能驾驭 AI,并对生成结果负责的人。

言归正传

要像spring一样向容器中注册和获取Bean,首先我们要定义几个核心的类并且知道它的流程。

我们的目的就是,把原来在代码里new对象—>对象由容器统一创建和管理

核心流程大概就是(如图)

核心类如下:

BeanDefinition(class):bean的定义,用来存放类对象

public class BeanDefinition { private Class<?> beanClass; public BeanDefinition(Class<?> beanClass) { this.beanClass = beanClass; } public Class<?> getBeanClass() { return beanClass; } public void setBeanClass(Class<?> beanClass) { this.beanClass = beanClass; } }

BeanDefinitionRegistry(interface):注册bean定义、获取bean定义的接口

public interface BeanDefinitionRegistry { /** * 注册bean定义 * @param beanName bean的名称 * @param beanDefinition bean的定义 */ void registerBeanDefinition(String beanName, BeanDefinition beanDefinition); /** * 获取bean定义 * @param beanName bean的名称 * @return BeanDefinition */ BeanDefinition getBeanDefinition(String beanName); /** * 判断是否存在bean定义 * @param beanName bean的名称 * @return boolean */ boolean containsBeanDefinition(String beanName); }

BeanFactory(interface):获取单例bean的接口

public interface BeanFactory { Object getBean(String beanName); <T> T getBean(String beanName, Class<T> requiredType); }

SingletonBeanRegistry(interface):管理单例bean的缓存接口,用于获取缓存池中的对象和向池子中注册对象

public interface SingletonBeanRegistry { Object getSingleton(String beanName); void registerSingleton(String beanName, Object singletonObject); }

DefaultSingletonBeanRegistry(class):单例bean的缓存接口实现类,定义singletonObjects缓存池,实现注册和获取单例

public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry{ /** * 单例缓存池 * 根据 BeanDefinition 创建对象后才会放入单例池 */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(); @Override public Object getSingleton(String beanName) { return singletonObjects.get(beanName); } @Override public void registerSingleton(String beanName, Object singletonObject) { singletonObjects.put(beanName, singletonObject); } }

SimpleBeanFactory(class):比较重要的一个类,用于组装bean的定义、注册bean的定义、管理单例缓存池等,他继承自 DefaultSingletonBeanRegistry (默认的单例缓存实现),实现了 BeanFactory 和 BeanDefinitionRegistry 接口。

public class SimpleBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory, BeanDefinitionRegistry { /** * 存放bean的定义(这里要和单例池区分开 不是一回事) */ private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(); @Override public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) { beanDefinitionMap.put(beanName, beanDefinition); } @Override public BeanDefinition getBeanDefinition(String beanName) { BeanDefinition beanDefinition = beanDefinitionMap.get(beanName); if (beanDefinition == null) { throw new RuntimeException("No bean named '" + beanName + "' is defined"); } return beanDefinition; } @Override public boolean containsBeanDefinition(String beanName) { return beanDefinitionMap.containsKey(beanName); } @Override public Object getBean(String beanName) { // 1. 先存缓存池中获取单例 Object singleton = getSingleton(beanName); if (singleton != null) { return singleton; } // 2. 如果bean还没有被创建 创建bean BeanDefinition beanDefinition = getBeanDefinition(beanName); return createBean(beanName, beanDefinition); } @Override public <T> T getBean(String beanName, Class<T> requiredType) { Object bean = getBean(beanName); return requiredType.cast(bean); } private Object createBean(String beanName, BeanDefinition beanDefinition) { try { // 1. 创建bean实例 Class<?> beanClass = beanDefinition.getBeanClass(); Constructor<?> constructor = beanClass.getDeclaredConstructor(); constructor.setAccessible(true); Object bean = constructor.newInstance(); // 2. 将bean实例注册到单例池中 registerSingleton(beanName, bean); return bean; } catch (Exception e) { throw new RuntimeException(e); } } }

其实到这里我们的工作就完成了,捋清楚流程之后就特点简单了,然后我们写个测试类来测试一下。

public class SimpleBeanTest { public static void main(String[] args) { // 1. 获取容器工厂 SimpleBeanFactory simpleBeanFactory = new SimpleBeanFactory(); // 2. 注册bean定义 simpleBeanFactory.registerBeanDefinition("userService", new BeanDefinition(UserService.class)); // 3. 比较两个bean是否是同一个实例 UserService userService1 = simpleBeanFactory.getBean("userService", UserService.class); UserService userService2 = simpleBeanFactory.getBean("userService", UserService.class); userService1.test(); if (userService1 == userService2) { System.out.println("两个bean是同一个实例, UserService 是单例的"); } } }

结果符合预期:

下一节我们要实现的是:如何实现自动注册+自动依赖注入,@Component、@Autowired 注解等。

One more thing

不要永远活在过去,未来可期。要及时放下执念,和过去说再见。

http://www.jsqmd.com/news/862847/

相关文章:

  • 2026最新诚信优选 合肥市瑶海区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 贵阳市南明区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026年期货期权程序化:主流工具品种覆盖与权限边界观察
  • 2026最新诚信优选 广州市黄埔区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 福州市鼓楼区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • Windows系统缺失ddraw.dll文件?游戏闪退、图形报错原因详解及处理办法
  • 2026最新诚信优选 河池市金城江区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026年Java八股文+场景题最全总结(真实大厂高频1000题)
  • 2026最新诚信优选 广州市荔湾区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 福州市晋安区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 贵阳市乌当区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 医护职称评审PPT制作指南:三种AI方法介绍
  • 2026最新诚信优选 广州市南沙区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 福州市马尾区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 河池市宜州区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 贵阳市云岩区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 桂林市叠彩区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 广州市天河区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026 最新!3 款亲测录音生成会议纪要神器,10 分钟出稿免费好用不踩坑
  • 2026最新诚信优选 福州市台江区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 河源市源城区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 德阳市罗江区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 终极Sollumz完整指南:从零开始掌握GTA V模型编辑
  • 2026最新诚信优选 桂林市临桂区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 如何用3D打印打造1000美元内的开源六轴机械臂:完整DIY指南
  • 2026最新诚信优选 菏泽市定陶区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • LEFT JOIN 中 ON 与 WHERE 过滤的差异
  • 2026年必看:六款热门AI编程工具横评,Trae与Cursor怎么选
  • 2026最新诚信优选 福州市长乐区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 桂林市七星区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收