阶段一模块二

mmdetection各模块拆解(二)一阶段检测模型的构建(以FCOS为例) 一阶段检测模型的构建(以FCOS为例)引言一阶段检测模型的构成mmdet中的FCOS模型构建方法介绍mmdet模型一般构建过程FCOS 引言 对于笔者来说,学习mmdetection最重要的就是学会如何DIY自己的模型,那么弄懂经典的模型是如何一步步搭建出来的就显得非常重要。本章将从零开始,解构一阶段检测模型(以FCOS为例)在mmdetection中的构建过程。 一阶段检测模型的构成 一阶段检测模型(OneStageDetector)直接在提取到的特征图上进行目标位置和类别的密集预测。一阶段检测器的模型构 阅读详情

作业要求:

学员自定义 @Service、@Autowired、@Transactional 注解类,完成基于注解的 IoC 容器(Bean 对象创建及依赖注入维护)和声明式事务控制,写到转账工程中,并且可以实现转账成功和转账异常时事务回滚。
注意考虑以下情况:

  1. 注解有无 value 属性值【@service(value="") @Repository(value="")】

  2. service 层是否实现接口的情况【 JDK 还是 CGLib 】

分析:

  1. 按照课程里面的项目,实现以 XML 形式的 IoC 容器,同时实现 AOP 功能。这里多说一句, XML 解析我是使用 DOM 搭配 XPath 实现的,与 MyBatis 中类似,但是没有进一步封装。

  2. 编写注解,替换注解中对应的标签,并且修改其解析代码,实现作业要求。

核心部分:

其实这个作业最核心的部分就是扫描对应包路径下的所有类。在 Java 当中,目前我所知几种实现方式:

  1. 纯 Java 方式,利用文件系统。
  2. 使用 Spring 中的扫描工具类 MetadataReaderFactory
  3. 使用外部反射工具,reflections

作业中,我是使用的 Spring 的扫描工具类实现对应功能,这种方式更加贴近 Spring 源码。纯 Java 的方式实现比较复杂,而且有可能出现问题。而使用外部反射工具,这种方式非常简单,其内部封装了许多方便快捷的方法。

代码:

注解部分:
  1. Autowired

    package cn.worstone.annotation;
    
    import java.lang.annotation.*;
    
    @Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Autowired {
    }
    
  2. Component

    package cn.worstone.annotation;
    
    import java.lang.annotation.*;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Component {
        String value() default "";
    }
    
  3. Repository

    package cn.worstone.annotation;
    
    import java.lang.annotation.*;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Repository {
        String value() default "";
    }
    
  4. Service

    package cn.worstone.annotation;
    
    import java.lang.annotation.*;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Repository {
        String value() default "";
    }
    
  5. Transactional

    package cn.worstone.annotation;
    
    import java.lang.annotation.*;
    
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface Transactional {
    }
    
代码修改部分:
  1. TransferServlet

        // private ProxyFactory proxyFactory = (ProxyFactory) XMLBeanFactory.getBean("proxyFactory");
        // private AccountService accountService = (AccountService) proxyFactory.getJdkProxy(XMLBeanFactory.getBean("accountService"));
        private AccountService accountService = (AccountService) AnnotationBeanFactory.getBean("accountService");
    

    这里说明一下,在 Spring 中,因为其通过 SpringMVC 中的 DispatchServlet 对所有请求进行拦截,然后统一处理分发,所以可以使用对应的 Controller 作为每次请求的入口。而这实在是太复杂了,实在是没有时间精力。/(ㄒoㄒ)/~~。所以这里只能和老师一样直接写死入口,其次,因为事务修改为注解实现的声明式事务,所以这块不需要显式获取代理对象,直接从 BeanFactory 中获取 Bean 即可。

  2. AnnotationBeanFactory

    package cn.worstone.factory;
    
    import cn.worstone.annotation.*;
    import cn.worstone.service.AccountService;
    import org.springframework.core.io.Resource;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.core.io.support.ResourcePatternResolver;
    import org.springframework.core.type.classreading.MetadataReader;
    import org.springframework.core.type.classreading.MetadataReaderFactory;
    import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;
    
    import java.lang.reflect.Field;
    import java.util.HashMap;
    import java.util.Map;
    
    public class AnnotationBeanFactory {
    
        private static Map<String, Object> beansMap = new HashMap<>();
    
        static {
            beansMap.putAll(XMLBeanFactory.getBeansMap());
            String packageName = "cn.worstone";
            try {
    
                ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
                Resource[] resources = resourcePatternResolver.getResources(packageHandler(packageName));
                MetadataReaderFactory metadata = new SimpleMetadataReaderFactory();
                for (Resource resource : resources) {
                    MetadataReader metadataReader = metadata.getMetadataReader(resource);
                    String className = metadataReader.getClassMetadata().getClassName();
                    Class<?> aClass = Class.forName(className);
                    Map<String, Object> componentMap = componentAnnotation(aClass);
                    if ((boolean) componentMap.get("isComponent")) {
                        className = getName(aClass, (String) componentMap.get("value"));
                        Object o = aClass.getDeclaredConstructor().newInstance();
                        beansMap.put(className, o);
                    }
                }
                Map<String, Object> transactionMap = new HashMap<>();
                for (String s : beansMap.keySet()) {
                    Object bean = beansMap.get(s);
                    // 处理 Autowired 注解
                    Field[] fields = bean.getClass().getDeclaredFields();
                    for (Field field : fields) {
                        field.setAccessible(true);
                        if (field.getAnnotation(Autowired.class) != null) {
                            Object o = getByType(field.getType());
                            // 正常来说需要对基础类型进行判断
                            if (o == null) {
                                throw new RuntimeException("Not have the type bean: " + field.getType());
                            }
                            field.set(bean, o);
                        }
                    }
                    beansMap.put(s, bean);
    
                    // 处理 Transactional 注解
                    Transactional transactional = bean.getClass().getAnnotation(Transactional.class);
                    if (transactional != null) {
                        transactionMap.put(s, bean);
                    }
                }
    
                for (String s : transactionMap.keySet()) {
                    Object bean = beansMap.get(s);
                    Class<?>[] interfaces = bean.getClass().getInterfaces();
                    ProxyFactory proxyFactory = (ProxyFactory) beansMap.get("proxyFactory");
                    Object proxy = null;
                    if (proxyFactory == null) {
                        throw new RuntimeException("Proxy Factory is null");
                    }
                    if (interfaces.length == 0) {
                        proxy = proxyFactory.getJdkProxy(bean);
                    } else {
                        proxy = proxyFactory.getCglibProxy(bean);
                    }
                    beansMap.put(s, proxy);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static Object getBean(String id) {
            return beansMap.get(id);
        }
    
        private static Map<String, Object> componentAnnotation(Class<?> aClass) {
            Map<String, Object> result = new HashMap<>(4);
            result.put("isComponent", false);
            result.put("value", "");
            if (aClass.isAnnotation()) return result;
            Component component = aClass.getAnnotation(Component.class);
            Service service = aClass.getAnnotation(Service.class);
            Repository repository = aClass.getAnnotation(Repository.class);
            if (component != null) {
                result.put("isComponent", true);
                result.put("value", component.value());
                return result;
            }
            if (service != null) {
                result.put("isComponent", true);
                result.put("value", service.value());
                return result;
            }
            if (repository != null) {
                result.put("isComponent", true);
                result.put("value", repository.value());
                return result;
            }
            return result;
        }
    
        private static String toLowerCaseFirstChar(String word) {
            if (Character.isUpperCase(word.charAt(0))) {
                return word.replace(word.charAt(0), (char) (word.charAt(0) + 32));
            }
            return word;
        }
    
        private static String getName(Class<?> aClass, String value) {
            if (!"".equals(value)) return value;
            return toLowerCaseFirstChar(aClass.getSimpleName());
        }
    
        private static String packageHandler(String packageName) {
            packageName = packageName.replaceAll("\\.", "/");
            if (!packageName.endsWith("/")) {
                packageName += "/";
            }
            return packageName + "**/*.class";
        }
    
        private static Object getByType(Class<?> aClass) {
            Object result = null;
            for (String s : beansMap.keySet()) {
                Object o = beansMap.get(s);
                if (aClass.isAssignableFrom(o.getClass())) {
                    if (result != null) {
                        throw new RuntimeException("Finding the type bean is not only one: " + aClass.getName());
                    }
                    result = o;
                }
            }
            return result;
        }
    
        public static Map<String, Object> getBeansMap() {
            return beansMap;
        }
    }
    

    这个类为了与 XML 解析进行区分,所以重新创建了一个 BeanFactory,同时,XML 解析的 BeanFactory 让我修改为 XMLBeanFactory。

  3. ProxyFactory

    package cn.worstone.factory;
    
    import cn.worstone.annotation.Autowired;
    import cn.worstone.annotation.Component;
    import cn.worstone.utils.TransactionManager;
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.sql.SQLException;
    
    @Component
    public class ProxyFactory {
    
        @Autowired
        private TransactionManager transactionManager;
    
        public void setTransactionManager(TransactionManager transactionManager) {
            this.transactionManager = transactionManager;
        }
    
        // JDK 动态代理
        public Object getJdkProxy(Object obj) {
    
            // 获取代理对象
            return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    return getObject(method, args, obj);
                }
            });
        }
    
        // CGLib 动态代理
        public Object getCglibProxy(Object obj) {
            return Enhancer.create(obj.getClass(), new MethodInterceptor() {
                @Override
                public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                    return getObject(method, objects, obj);
                }
            });
        }
    
        private Object getObject(Method method, Object[] args, Object obj) throws SQLException, IllegalAccessException, InvocationTargetException {
            Object result = null;
            try {
                // 开启事务 (关闭事务的自动提交)
                transactionManager.beginTransaction();
                result = method.invoke(obj, args);
                // 提交事务
                transactionManager.commit();
            } catch (Exception e) {
                e.printStackTrace();
                // 回滚事务
                transactionManager.rollback();
                // 抛出异常便于上层 Servlet 捕获
                throw e;
            }
            return result;
        }
    }
    

    这里将两个动态代理方法内部获取代理对象以及织入事务部分的代码抽象了出来,因为两者代码几乎一致。

目前存在的缺点:(对比 Spring)

  1. Autowired 注解目前功能实现比较单一,在 Spring 中可以放置在构造方法上。
  2. Transactional 注解功能实现比较单一,在 Spring 中有一整套非常完成的属性设置。
  3. 这里直接写死解析的包路径,在 Spring 中有相关的注解。
  4. 入口 Servlet 直接写死,在 Spring 是通过在 web.xml 中配置配置信息,将其加载到 ApplicationContext 中。

问题:

  1. 使用 Tomcat 的 Maven 插件没办法运行。
  2. 异常信息没有在控制台打印。
  3. Web 项目中,如何定义 Spring 入口
  4. Tomcat 没有找到类
  5. Spring 源码构建
  6. 如何通过注解的 Class 获取注解中的属性值
  7. 为什么无需要配置 Servlet 就可以直接使用

扩展:

什么鬼?弃用JDK动态代理,Spring5 默认使用 CGLIB 了?

java代理service和自定义注解 java静态代理设计模式,学习记录,简单自定义注解编写 立即下载

相关推荐

lagou-transfer:Spring框架大作业

大作业:自定义@Service、@Autowired、@Transactional注解类,完成基于注解的IOC容器(Bean对象创建及依赖注入维护)和声明式事务控制,写到转账工程中,并且可以实现转账成功和转账异常时事务回滚 编程题: 自定义注解: @Component 添加在类上,value属性用于设置bean的id,默认值为"" @Autowired 添加在属性上,只实现了根据类型注入,即若属性是接口类型,需要该接口的实现类唯一,才可以注入 @Transactional 添加在类上,对添加了此注解的类采用动态代理生成代理对象,若该类实现了接口则用jdk动态代理,若没有实现接口,则采用CGlib动态代理。 工程中,com.lagou.edu.service.impl.TransferServiceCGlib为CGlib动态代理测试类; 工程中,com.lagou.edu.service.i

后端-SSH-各种注解@Autowired,@Autowired,@Controller,@Service,@Repository,@Repository

目录 @Transactional @Autowired @Controller @Service @Repository @Component @Transactional 只有@Transactional 注解应用到 public 方法,才能进行事务管理 Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。 声明

Blog belong to 二狗 957

PaddleOCR实战:DBnet++与DBnet模型训练全流程解析

本文详细解析了基于PaddleOCR框架的DBnet与DBnet++文字检测模型的完整训练流程。从环境配置、数据集准备、配置文件解读,到模型训练、评估调参及最终推理部署,提供了实战指南。重点对比了DBnet++与DBnet在精度、速度及适用场景上的差异,帮助开发者高效构建定制化的OCR检测模型。

weixin_29038155的博客 335

自定义@Service、@Autowired、@Transactional注解类,完成基于注解的IOC容器(Bean对象创建及依赖注入维护)和声明式事务控制

题目注意考虑以下情况: 1)注解有无value属性值【@service(value="") @Repository(value="")】 2)service层是否实现接口的情况【jdk还是cglib】 解决思路: 1)需要完成@Service、@Autowired、@Transactional三个注解的自定义。 2)扫描指定包下注解,完成类实例化、依赖关系、事务等步骤,并完成工厂初始化。 3)使用注解替换xml形式定义bean方式。 4)测试。 脚本准备 CREATE TABLE account ( car

weixin_42941199的博客 2780

蓝桥杯FPGA赛道积分赛

代码如下: 按键驱动 代码如下 按键驱动 代码如下: 顶层文件 按键驱动 数码管驱动 声明:本代码借鉴网络资料,如有侵权和错误请联系作者删除。我是从寒假开始备赛的,由于我基础不行,备赛过程中也是混混呃呃的,备赛效率不高,总体来说备赛不认真,有点拖拉,但是最后我也坚持备赛到了今天,在备赛过程中,即复习了旧的东西,也学到了新的东西,总结起来还是有点收获的,后天北京、天津、河北地区就要进行省赛了,我会全力以赴,不管结果怎么样,尽力就好,最后祝大家都能

weixin_69804913的博客 1997

宜搭,高级认证实操2,FaaS连接器指导教程

找到FaasEntry.java将如下代码整体替换,注意引包。如图所示在util下新建EDSUtil.java代码如下。回到连接器界面点击右上角测试-->测试。连接器工厂-->新建FaaS连接器。保存-->前往云IDE开发。返回如图所示代码,部署成功。

2301_80286061的博客 3343

Spring 之注解事务 @Transactional

见:http://blog.youkuaiyun.com/zheng0518/article/details/49206847 先让我们看代码吧! 以下代码为在“Spring3事务管理——基于tx/aop命名空间的配置”基础上修改。首先修改applicationContext.xml如下: ? [html]v

愿我如星君如月 ... 夜夜流光相皎洁 ... 525

【多模态融合】TransFusion学习笔记(1)

工作上主要还是以纯lidar的算法开发,部署以及系统架构设计为主。对于多模态融合(这里主要是只指Lidar和Camer的融合)这方面研究甚少。最近借助和朋友们讨论论文的契机接触了一下这方面的知识,起步是晚了一点,但好歹是开了个头。下面就借助TransFusion论文及其开源代码来串一串这方面的知识。这个很好理解,参考FPointNet网络图示。就是利用现有的2D检测器在图像上提取2D初始框,根据Camera成像原理,捕获2D框视锥内的点云,再利用点云分类模型(如:PointNet)做进一步分类。

4964

Spring 和 SpringMVC 常用注解和配置(@Autowired、@Resource、@Component、@Repository、@Service、@Controller的区别)

Spring 常用注解总结内容一、Spring部分1、声明bean的注解2、注入bean的注解3、java配置类相关注解4、切面(AOP)相关注解5、@Bean的属性支持6、@Value注解7、环境切换8、异步相关9、定时任务相关10、@Enable*注解说明11、测试相关注解二、SpringMVC部分总结 总结内容 作者:IT_faquir 原文:https://blog.youkuaiyun.com/IT_faquir/article/details/78025203 一、Spring部分 1、声明bean的注解

zzvar的博客 2569

老款 NUC 复活计划:装 Ubuntu 部署 OpenClaw 本地 AI

老款 NUC 变身本地 AI 服务器指南 本文详细介绍了如何将老旧华硕 NUC 设备改造为本地 AI 服务器。主要内容包括: 硬件评估:列出老款 NUC 的最低配置要求(i3 6代/8GB内存/256GB SSD),并提供兼容性检查命令和性能预期表 系统准备:指导备份数据、下载 Ubuntu 22.04 LTS 和制作启动盘的方法(Windows/Linux双平台) 安装流程:从 BIOS 设置到 Ubuntu 安装的完整步骤,包括推荐的分区方案 系统优化:禁用不必要的服务、内核参数调优、Swap 配置和

博客 7608

「HTML和CSS入门指南」hr 标签详解

标签是 HTML5 中用于插入水平分割线的标签,常用于在页面中添加分隔线或者段落之间的分割线。通过灵活运用 标签和属性,我们可以帮助用户更好地理解页面内容,同时也可以美化和装饰页面。在实际应用中需要注意避免过度使用 标签,以使页面看起来简洁明了。

a451319296的博客 7663

service层@Transactional事务控制使用以及注意

@Service @Transactional public class CeshiService { @Autowired LoginFeignClient loginFeignClient; @Transactional(rollbackFor = Exception.class) public void test(){ User ...

seapeak007的博客 4万+

使用蒙特卡洛模拟方法在MATLAB中估算居里温度: 一个详细而通俗的指南

居里温度是磁性材料失去磁性的温度。但是,计算机模拟为我们提供了一个在理论和实验之间的桥梁,使我们能够在不进行实际测量的情况下估计这一重要参数。在下一部分,我们将详细介绍蒙特卡洛迭代的核心代码,以及如何使用它来模拟磁性材料中原子的行为。在估算居里温度的上下文中,我们将使用蒙特卡洛方法来模拟磁性材料中的原子或分子的行为。通过使用蒙特卡洛方法,我们可以在MATLAB中估算居里温度,从而为理论研究和实验设计提供有价值的信息。:我们使用的是一个有限的尺寸的网格模型,这可能导致一些大小效应,特别是在接近居里温度时。

qq_38334677的博客 979

阶段一模块二总结

阶段一模块二总结

qq_23187859的博客 311

华为od面试手撕真题【分解质因数】

华为od面试手撕真题【分解质因数】

MISAYAONE的博客 1136

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

阶段二模块一

作业要求 开发 Minicat V 4.0,在已有 Minicat 基础上进一步扩展,模拟出 webapps 部署效果。磁盘上放置一个 webapps 目录,webapps 中可以有多个项目,例如 demo1、demo2、demo3... 每个项目中含有 Servlet,可以根据请求 url 定位对应 Servlet 进一步处理。 作业具体要求参考以下链接文档: https://gitee.com/lagouedu/alltestfile/raw/master/tomcat/Tomcat%E4%BD%9C%

LiveForCode的博客 296

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

阶段二模块一 MySQL基础和SQL入门

内容输出来源:拉钩教育Java就业训练营 1 数据库的基本概念 数据库(DataBase) 就是存储和管理数据的仓库 其本质是一个文件系统, 还是以文件的方式,将数据保存在电脑上 数据库存储方式比较: 存储方式 优点 缺点 内存 速度快 不能够永久保存,数据是临时状态的 文件 数据可以永久保存 使用IO流操作文件, 不方便 数据库 1.数据可以永久保存2.方便存储和管理数据3.使用统一的方式操作数据库(SQL) 占用资源,有些数据库需要付费(比如Oracle数据库) 2 SQ

wangxu123445678的博客 248

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【infra之路】阶段二 · 模块一:GPU 架构与显存层级

本文为AI基础设施学习路线第二阶段模块一的理论基础,重点解析GPU如何支持深度学习。核心内容包括:1) CPU与GPU的本质差异,GPU凭借数千简单核心和高吞吐特性,特别适合并行矩阵运算;2) 任务适合GPU的关键标准是可分解为独立并行计算;3) GPU采用SIMT模式,单指令驱动多线程同步执行;4) SM作为基础执行单元,影响任务调度效率;5) 显存分全局、共享和寄存器三层,速度与容量呈反比;6) nvidia-smi显示的显存占用主要指全局显存。这些理论为后续CUDA编程和显存优化奠定基础。

sweet_ran的博客 409

阶段一模块四任务二:IO流

第十七章 IO流 17.1 IO流的概念 IO就是Input和Output的简写,也就是输入和输出的含义。 IO流就是指读写数据时像流水一样从一端流到另外一端,因此得名为“流"。 17.2 基本分类 按照读写数据的基本单位不同,分为 字节流 和 字符流。 其中字节流主要指以字节为单位进行数据读写的流,可以读写任意类型的文件。 其中字符流主要指以字符(2个字节)为单位进行数据读写的流,只能读写文本文件。 按照读写数据的方向不同,分为 输入流 和 输出流(站在程序的角度)。 其中输入流主要指从文件中读取数据内容

weixin_41930667的博客 102

阶段二模块一任务一:MySQL基础和SQL入门

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习..

weixin_40351820的博客 174

阶段二模块一 MySql单表、约束和事务

内容输出来源:拉钩教育Java就业训练营 1 DQL操作单表 1.1 排序 通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示效果,不会影响真实数据) -- 排序 ASC 表示升序排序(默认) DESC 表示降序排序 SELECT 字段名 FROM 表名 [WHERE 字段 = 值] ORDER BY 字段名 [ASC / DESC] 1.1.1 排序方式 单列排序 只按照某一个字段进行排序, 就是单列排序 -- 默认升序排序 ASC SELECT * FROM emp ORDE

wangxu123445678的博客 149

阶段三模块一 直播二 手写VurRouter-hash模式

目标 观察vue-router源码-实现路由嵌套功能 Vue-Router 演示基本效果 Vue-Router 源码结构 Vue.use() 注册插件源码 src\core\global-api\use.js export function initUse (Vue: GlobalAPI) { // Vue.use(VueRouter, options) Vue.use = function (plugin: Function | Object) { const installedPl

weixin_45345105的博客 245

阶段二模块一 MySQL索引、视图和存储过程

内容输出来源:拉钩教育Java就业训练营 1 MySql索引 在数据库表中,对字段建立索引可以大大提高查询速度。通过善用这些索引,可以令MySQL的查询和运行更加高效。 1.1 常见索引分类 索引名称 说明 主键索引 (primary key) 主键是一种唯一性索引,每个表只能有一个主键, 用于标识数据表中的每一条记录 唯一索引 (unique) 唯一索引指的是 索引列的所有值都只能出现一次, 必须唯一. 普通索引 (index) 最常见的索引,作用就是 加快对数据的访问速度 1

wangxu123445678的博客 189

数据分析实训 阶段二 模块一 mysql基础与核心查询 by拉钩教育

一、mysql基础 1、数据库基本概念 2、mysql数据库 3、mysql安装与配置 暂略 4、sql语句操作 4.1 sql通用语法 SQL语句可以单行 或者 多行书写,以分号结尾 ; (Sqlyog中可以不用写分号) 可以使用空格和缩进来增加语句的可读性。 MySql中使用SQL不区分大小写 4.2 mysql注释 单行注释 # 或 – 多行注释 /* …*/ 4.3 DDL 数据库定义语言 操作数据库 创建数据库 # 创建指定名称的库 create database db1; # 指定数

qq_32795481的博客 229

阶段二模块一 MySql多表、外键和数据库设计

内容输出来源:拉钩教育Java就业训练营 1 多表 实际开发中,一个项目通常需要很多张表才能完成。 1.1 单表的缺点 冗余, 同一个字段中出现大量的重复数据 1.2 解决方案 1.2.1 设计为两张表 员工表中有一个字段dept_id 与部门表中的主键对应,员工表的这个字段就叫做外键 拥有外键的员工表 被称为从表, 与外键对应的主键所在的表叫做主表 1.2.2 多表设计上的问题 当我们在 员工表的 dept_id 里面输入不存在的部门id ,数据依然可以添加 显然这是不合理的. 1.3 外键约束 外键指的

wangxu123445678的博客 261
上一篇: 阶段一模块一
下一篇: 阶段一模块三
LiveForCode
博客等级 码龄5年 2粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值