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

加油,为Vue3提供一个可媲美Angular的ioc容器

为什么要为Vue3提供ioc容器

Vue3因其出色的响应式系统,以及便利的功能特性,完全胜任大型业务系统的开发。但是,我们不仅要能做到,而且要做得更好。大型业务系统的关键就是解耦合,从而减缓shi山代码的生长。而ioc容器是目前最好的解耦合工具。Angular从一开始就引入了ioc容器,因此在业务工程化方面一直处于领先地位,并且一直在向其他前端框架招手:“我在前面等你们,希望三年后能再见”。那么,我就试着向前走两步,在Vue3中引入ioc容器,并以此为基础扩充其他工程能力,得到一个新框架:Zova。诸君觉得是否好用,欢迎拍砖、交流:

IOC容器分类

在 Zova 中有两类 ioc 容器:

  1. 全局ioc容器:在系统初始化时,会自动创建唯一一个全局 ioc 容器。在这个容器中创建的Bean实例都是单例模式
  2. 组件实例ioc容器:在创建 Vue 组件实例时,系统会为每一个 Vue 组件实例创建一个 ioc 容器。在这个容器中创建的Bean实例可以在组件实例范围之内共享数据和逻辑

Bean Class

Zova 采用模块化体系,Bean Class 都由不同的模块提供。使用模块内部的 Bean Class 时可以直接基于Class类型定位。在跨模块使用时可以基于Bean标识定位,而不是基于Class类型/文件路径定位,这样有利于实现模块之间的松耦合

因此,Zova 提供了两类 Bean Class:

  1. 匿名bean:使用@Local装饰的 class 就是匿名bean。此类 bean 仅在模块内部使用,不存在命名冲突的问题,定义和使用都很便捷
  2. 具名bean:除了@Local之外,其他装饰器函数装饰的 class 都是具名bean。Zova 为此类 bean 提供了命名规范,既可以避免命名冲突,也有利于跨模块使用

注入机制

Zova 通过@Use装饰器函数注入 Bean 实例,提供了以下几种注入机制:

1. Bean Class

通过Bean Class在 ioc 容器中查找并注入 Bean 实例,如果不存在则自动创建。这种机制一般用于同模块注入

import { ModelTodo } from '../../bean/model.todo.js';class ControllerTodo {@Use()$$modelTodo: ModelTodo;
}

2. Bean标识

通过Bean标识在 ioc 容器中查找并注入 Bean 实例,如果不存在则自动创建。这种机制一般用于跨模块注入层级注入

import type { ModelTabs } from 'zova-module-a-tabs';class ControllerLayout {@Use('a-tabs.model.tabs')$$modelTabs: ModelTabs;
}
  • 通过a-tabs.model.tabs查找并注入 Bean 实例
  • 因此,只需导入 ModelTabs 的 type 类型,从而保持模块之间的松耦合关系

3. 注册名

通过注册名在 ioc 容器中查找并注入 Bean 实例,如果不存在则返回空值。这种机制一般用于同模块注入层级注入

import type { ModelTodo } from '../../bean/model.todo.js';class ControllerTodo {@Use({ name: '$$modelTodo' })$$modelTodo: ModelTodo;
}
  • 通过注册名$$modelTodo查找并注入 Bean 实例。一般而言,应该确保在 ioc 容器中已经事先注入过 Bean 实例,否则就会返回空值

4. 变量名

通过变量名在 ioc 容器中查找并注入 Bean 实例,如果不存在则返回空值。这种机制一般用于同模块注入层级注入

import type { ModelTodo } from '../../bean/model.todo.js';class ControllerTodo {@Use()$$modelTodo: ModelTodo;
}
  • 通过变量名$$modelTodo查找并注入 Bean 实例。一般而言,应该确保在 ioc 容器中已经事先注入过 Bean 实例,否则就会返回空值

注入范围

匿名bean的默认注入范围都是ctx具名bean可以在定义时指定默认注入范围,不同的场景(scene)有不同的默认注入范围。 此外,在实际注入时,还可以在@Use 中通过injectionScope选项覆盖默认的注入范围

Zova 提供了以下几种注入范围:app/ctx/new/host/skipSelf

1. app

如果注入范围是 app,那么就在全局 ioc 容器中注入 bean 实例,从而实现单例的效果

// in module: test-module1
@Store()
class StoreCounter {}
// in module: test-module2
import type { StoreCounter } from 'zova-module-test-module1';class Test {@Use('test-module1.store.counter')$$storeCounter: StoreCounter;
}
  • Store 的注入范围默认是 app,因此通过 Bean 标识test-module1.store.counter在全局 ioc 容器中查找并注入 bean 实例

2. ctx

如果注入范围是 ctx,那么就在当前组件实例的 ioc 容器中注入 bean 实例

// in module: a-tabs
@Model()
class ModelTabs {}
// in module: test-module2
import type { ModelTabs } from 'zova-module-a-tabs';class ControllerLayout {@Use('a-tabs.model.tabs')$$modelTabs: ModelTabs;
}
  • Model 的注入范围默认是 ctx,因此通过 Bean 标识a-tabs.model.tabs在当前组件实例的 ioc 容器中查找并注入 bean 实例

3. new

如果注入范围是 new,那么就直接创建新的 bean 实例

// in module: a-tabs
@Model()
class ModelTabs {}
// in module: test-module2
import type { ModelTabs } from 'zova-module-a-tabs';class ControllerLayout {@Use({ beanFullName: 'a-tabs.model.tabs', injectionScope: 'new' })$$modelTabs: ModelTabs;
}
  • 由于指定 injectionScope 选项为 new,因此通过 Bean 标识a-tabs.model.tabs直接创建新的 bean 实例

层级注入

注入范围除了支持app/ctx/new,还支持层级注入:host/skipSelf

4. host

如果注入范围是 host,那么就在当前组件实例的 ioc 容器以及所有父容器中依次查找并注入 bean 实例,如果不存在则返回空值

// in parent component
import type { ModelTabs } from 'zova-module-a-tabs';class Parent {@Use('a-tabs.model.tabs')$$modelTabs: ModelTabs;
}
// in child component
import type { ModelTabs } from 'zova-module-a-tabs';class Child {@Use({ injectionScope: 'host' })$$modelTabs: ModelTabs;
}
  • 由于父组件已经注入了 ModelTabs 的 bean 实例,因此子组件可以直接查找并注入
  • 层级注入同样支持所有注入机制:Bean Class/Bean标识/注册名/变量名

5. skipSelf

如果注入范围是 skipSelf,那么就在所有父容器中依次查找并注入 bean 实例,如果不存在则返回空值

Zova已开源:https://github.com/cabloy/zova

相关文章:

加油,为Vue3提供一个可媲美Angular的ioc容器

为什么要为Vue3提供ioc容器 Vue3因其出色的响应式系统,以及便利的功能特性,完全胜任大型业务系统的开发。但是,我们不仅要能做到,而且要做得更好。大型业务系统的关键就是解耦合,从而减缓shi山代码的生长。而ioc容器是…...

RS485 CAN SPI IIC UART RS232这些通信协议传输距离、传输速度对比给出比较顺序-笔记(面试必备)

各类通信协议(RS485、CAN、SPI、I2C、UART、RS232)的传输距离和传输速度各有不同,适用于不同的应用场景。以下是这些通信协议的传输距离和传输速度的对比及排序: 传输距离比较(从长到短) RS485 最大传输距…...

高频JMeter软件测试面试题

近期,有很多粉丝在催更关于Jmeter的面试题,索性抽空整理了一波,以下是一些高频JMeter面试题,拿走不谢~ 一、JMeter的工作原理 JMeter就像一群将请求发送到目标服务器的用户一样,它收集来自目标服务器的响应以及其他统计…...

iptables netfilter

iptables -L --line...

如何使用Python自动发送邮件?

Python 提供了强大的内置库 smtplib 和 email,让我们能够轻松地发送各种类型的电子邮件。本指南将带你逐步了解如何使用 Python 发送邮件,从简单文本邮件到包含 HTML 内容、附件和内嵌图片的复杂邮件。 1. 准备工作: 1.1 安装必要的库 确保…...

C#中读写INI配置文件

在作应用系统开发时,管理配置是必不可少的。例如数据库服务器的配置、安装和更新配置等等。由于Xml的兴起,现在的配置文件大都是以xml文档来存储。比如Visual Studio.Net自身的配置文件Mashine.config,Asp.Net的配置文件Web.Config&#xff0…...

深入解析Spring中的@RequestMapping注解

RequestMapping是Spring框架中的一个核心注解,用于映射Web请求到处理器类的方法上。本文将详细介绍RequestMapping注解的用途、支持的属性以及如何在Spring MVC和Spring WebFlux中应用它。 1. 引言 在Spring框架中,RequestMapping是一个用于简化请求映…...

Python:lambda函数

lambda函数解释 Lambda函数,也被称为匿名函数,是Python等编程语言中用于创建简单、一次性使用的函数对象的一种快捷方式。在Python中,lambda函数使用lambda关键字定义,其后紧跟一个或多个参数(用逗号分隔)…...

MySQL查询语句

1. 一般查询 select * from table; 创建表:并插入数据,为下面的查询做例 create table info ( id int primary key, name varchar(10), score decimal(5,2), address varchar(20), hobbid int(5));insert into info values(1,liuyi,80,bei…...

远程连接服务

1.SSH协议握手流程 TCP三次握手后当前主机与远程服务器之间协商用哪种协议版本,ssh有两个(ssh1/ssh2)一般用ssh2,协商完后进入到密钥交换的阶段,客户端会生成一个公钥和一个私钥,公钥用来上锁,私…...

系统架构设计师——软件开发方法分类

分类 软件开发方法是指软件开发过程所遵循的办法和步骤,从不同的角度可以对软件开发方法进行不同的分类。 按照开发风范 软件开发过程中,开发方法的选择对项目的成功至关重要。这些方法可按照特定的开发风范分为自顶向下和自底向上两种主要策略&#…...

《看漫画学Python》全彩PDF教程,495页深度解析,零基础也能轻松上手!

前言 说起编程语言,Python 也许不是使用最广的,但一定是现在被谈论最多的。随着近年大数据、人工智能的兴起,Python 越来越多的出现在人们的视野中。 在各家公司里,Python 还常被用来做快速原型开发,以便更快验证产品…...

用户画像系列——Spark任务调优实践

在画像标签的加工和写入hbase中,我们采用了spark来快速进行处理和写入。但是在实际线上运行的过程中,仍然遇到了不少问题,下面来总结下遇到的一些问题 1.数据倾斜问题 其实spark 数据倾斜思路和hive、mapreduce 数据倾斜思路处理类似&…...

前端面试宝典【HTML篇】【4】

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。 核心特色: 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知…...

【UbuntuDebian安装MySQL】在线安装MySQL8

云计算:腾讯云轻量服务器 系统:Ubuntu-v22 1.更新系统软件包列表 打开终端并运行以下命令来确保你的系统软件包列表是最新的: sudo apt update2.安装 MySQL 存储库 MySQL 提供了官方的 APT 存储库,可以确保你安装的是最新版本…...

PDF翻译神器:这四款可以实现一键搞定,留学党必备!

外文的阅读还是需要一定的语言功底,现在大家也对外文越来越重视起来了,但是借助一些翻译工具进行翻译可以很大程度地提升工作的效率,就算是遇到批量的文件处理也可以一键翻译出来,所以今天借此文章整理了四款好用的pdf翻译工具&am…...

精心准备的高水平的博客【点评语】,来抄啊!

大家好,我是一名_全栈_测试开发工程师,已经开源一套【自动化测试框架】和【测试管理平台】,欢迎大家关注我,和我一起【分享测试知识,交流测试技术,趣聊行业热点】。 第 1 条 这篇博客文章如同灯塔般照亮了技…...

gitlab汉化

承接上文安装好gitlab 首先查看好gitlab的版本(ps:要启动gitlab) cat /opt/gitlab/embedded/service/gitlab-rails/VERSION我的版本是10.0.0 然后安装git yum install -y git然后克隆一下汉化的仓库 git clone https://gitlab.com/xhang/g…...

SSH访问控制:精确管理你的服务器门户

“ 在数字世界中,服务器的安全性是任何网络管理员的首要任务。特别是对于远程登录协议如SSH,确保只有授权用户可以访问是至关重要的。 今天,记录两种有效的方法来控制用户对特定服务器的访问:通过sshd_config实现黑/白名单机制和利…...

Java中的SSL/TLS安全通信实现

Java中的SSL/TLS安全通信实现 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨如何在Java中实现SSL/TLS安全通信。 一、什么是SSL/TLS SSL(Secure Sockets La…...

2959. 关闭分部的可行集合数目

2959. 关闭分部的可行集合数目 题目链接:2959. 关闭分部的可行集合数目 代码如下: //参考链接:https://leetcode.cn/problems/number-of-possible-sets-of-closing-branches/solutions/2844227/guan-bi-fen-bu-de-ke-xing-ji-he-shu-mu-b-85ov class S…...

第十九天培训笔记

上午 1 、构建 vue 发行版本 [rootserver eleme_web]# nohup npm run serve& // 运行 vue 项目 [rootserver eleme_web]# mkdir /eleme [rootserver eleme_web]# cp -r /root/eleme_web/dist/* /eleme/ // 将项目整体 移动到 /eleme 目录下 [rootserver eleme_web]# …...

初学者编程指南:方法与资源推荐

一、引言 编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱?编程不仅是技术领域的一项基本技能&#…...

【SpringBoot】数据验证之URL参数校验

URL参数校验 Validated public class UserController{ RequestMapping("/query"); public String query(Length(min2,max10,message"姓名长度错误,姓名长度2-10!") RequestParam(name"name",requiredtrue)String name…...

目标检测 | yolov2/yolo9000 原理和介绍

前言:目标检测 | yolov1 原理和介绍 简介 论文链接:https://arxiv.org/abs/1612.08242 时间:2016年 作者:Joseph Redmon  作者首先在YOLOv1的基础上提出了改进的YOLOv2,然后提出了一种检测与分类联合训练方法&#…...

基于Raft算法的分布式KV数据库:一、开篇

项目描述:本项目是基于Raft算法的分布式KV数据库,保证了分布式系统的数据一致性和分区容错性,在少于半数节点发生故障时仍可对外提供服务。使用个人实现的分布式通信框架mpRPC和跳表数据库skipList提供RPC服务和KV存储服务。 github地址&…...

react-日期选择器封装

文件 import { useMemo, useState, useEffect } from "react" import dayjs, { Dayjs } from "dayjs" import "dayjs/locale/zh-cn" import "./App.css" dayjs.locale("zh-cn")function SimpleCalendar() {// 当前时间对象…...

【C++题解】1022. 百钱百鸡问题

欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1022. 百钱百鸡问题 类型:嵌套穷举 题目描述: 用 100 元钱买 100 只鸡,公鸡,母鸡,小鸡都要有。 公鸡 5 元 1 只&#x…...

计算机毕业设计选题推荐-二手闲置交易系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

AI Agents(智能代理)教程:如何创建信息检索聊天机器人

AI 代理教程:如何创建信息检索聊天机器人 介绍 在本教程中,我们将指导您使用 AI 代理创建用于信息检索的复杂聊天机器人的过程。探索如何利用 AI 的强大功能构建能够高效地从各种来源检索数据的聊天机器人。 设置环境 我们的计划是使用 AI 代理&…...

网站设计毕业设计论文/温州网站快速排名

经过漫长的等待,终于装上win7了,但是忽然发现收不到无线信号(附近确实是有可用的无线信号的),初步以为可能是因为没有装无线网卡驱动的问题。然后去官网,找到对应型号的驱动,可是安装完驱动重新…...

周村网站制作首选公司/互联网营销师证书含金量

1 简介这是我的新系列教程PythonDash快速web应用开发的第一期,我们都清楚学习一个新工具需要一定的动力,那么为什么我要专门为Dash制作一个系列教程呢?图1Dash是一个高效简洁的Python框架,建立在Flask、Poltly.js以及React.js的基…...

做公益网站怎么赚钱/推广普通话文字内容

一、DNS:域名系统。 主要用来记录(登记)域名和IP地址的映射关系(对应关系)。 功能:域名解析。 正向解析:根据域名来解析出IP地址。域名----->IP 反向解析:根据IP地址来解析出域名。IP----->域名 ---------------------…...

重庆做网站开发的集中/seo排名培训学校

参考林海峰老师的配置教程 http://blog.51cto.com/9161406/1839667转载于:https://www.cnblogs.com/luhuajun/p/7379938.html...

网站开发项目商业计划书/目录搜索引擎有哪些

本人完全不懂MySQL源码,以下文字纯属瞎猜,如有误导,概不负责!在sql/rpl_slave.cc文件中,time_diff的计算代码为:/*The pseudo code to compute Seconds_Behind_Master:if (SQL thread is running){if (SQL …...

优质做网站价格/线上培训

Java基础语法 今日内容介绍 u 方法 第1章 方法 1.1 方法概述 在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法。 如:小明同学在路边准备坐车来学校学习。这就面临着一件事情(坐车到学校这件事情)需要…...