spring注解及扩展

2023-11-15

1,spring配置注解

spring建议通过注解配置,替代原xml配置方式。

使用配置类替代xml配置的优势大体:

1,xml配置维护容易出错而且不易检查,java配置类基于java语法检查,对于java程序员更友好,易于维护;

2,注解配置,简洁、清晰,代码都内聚于java代码,理解和代码开发都更连贯;

主要缺点是:

1,结构没有xml文件结构清晰,分散不易于整体阅读;

2,部分注解不易于实现配置,建议仍然采用xml配置实现。

spring采用配置类的注解主要包括:

  • @Configuration 指示类声明一个或多个用@bean注解修饰的方法,并且可以由Spring容器处理,以便在运行时为这些bean生成bean定义和服务请求。指明给java配置类,替代beans.xml配置文件;
  • @ComponentScan 配置用于@Configuration 类的组件扫描路径等。 提供与xml配置上的的元素相同的功能;

  • @bean 指明方法生成由Spring容器管理的bean。替换xml配置中的bean标签;

2,容器组件注解

spring中和spring容器相关注解包括如下:

  • @component 指示带注释的类是“组件”。当使用基于注释的配置和类路径扫描时,此类被视为自动检测的候选类,自动装载进入容器。

  • @Service 指示带注释的类是“服务”,作为独立于模型的接口提供的操作,没有封装状态。行为类组件,应该是无状态bean。(具体概念参见领域驱动设计基本概念中的服务)

  • @Controller 指示带注释的类是“控制器”,在springMVC中的控制器。也是一个组件。

  • @Repository 指示带注释的类是“存储库”,封装存储、检索和模拟对象集合的搜索行为的机制。持久层操作。也是一个组件。(概念有别于dao层;具体参见领域驱动设计基本概念中的仓储)(实现传统2ee模式(如“数据访问对象”)的团队也可以将这种原型应用于DAO类,但是在这样做之前,应该注意理解数据访问对象和DDD风格仓储之间的区别。这个注释是一个通用的原型,单个团队可能会适当地缩小它们的语义和使用范围。)

  • @Conditional 指示组件只有在符合注册条件时才有资格注册。 用于修饰组件、bean等;

  • @Primary 当有多个组件或者bean有资格被依赖注入时,无法判断注入的bean。如果候选人中存在一个主bean,则该bean将是自动设置的值。 被@Primary修饰的component、bean被作为主bean被spring容器优先采用。

  • @Lazy 指示是否要延迟初始化bean,如延迟,则在第一次被使用时初始化加载。默认 true。

  • @scope 当作为类型级注释与@Component一起使用时,@Scope指示要用于带注释类型的实例的作用域范围的名称。 spring容器在不指定scope的情况下默认是单例的。可选:prototype、request、session、global session;

  • @Import 指示要导入的一个或多个@Configuration类。 允许导入@Configuration类、ImportSelector、ImportBeanDefinitionRegistrar 实现。向spring容器中注册bean。

  • @PostConstruct 自定义初始化函数,在bean创建后执行;对应有自定义的销毁函数@PreDestroy,在销毁前执行;

3,组件赋值注解

组件赋值注解包括如下:

  • @value 用于字段、方法/构造函数参数的注解,将表达式的值映射到受影响参数上。
  • @Autowired 将构造函数、字段、setter方法或config方法标记为自动使用Spring的依赖注入工具赋值。
  • @Qualifier 此注解可在字段或参数上用作候选bean的限定符。它也可用于注解其他自定义注解,这些注解随后可用作限定符。 比如和@Autowired共同使用,限定被依赖注入的具体组件;
  • @Resource默认按照ByName自动注入,由J2EE提供。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
  • @PropertySource 主要是让Spring的Environment接口读取属性配置文件用的,这个注解是标识在@Configuration配置类上的。
  • @profile 指示当一个或多个指定的profile环境被激活,组件才有资格注册。(启动参数设定环境方式、代码启动设定环境方式)

4,基于Aware 扩展

在使用spring的过程中,大多数功能相关组件直接通过配置类或者注解完成往spring容器中注册,整个过程对spring容器的框架对象是无感知的。但是基于某些特殊需求,我们需要使用spring容器的框架对象组件,那么spring提供了基于Aware的方式的扩展,可以获取spring容器的框架对象组件。

Aware 标记超级接口,表示bean有资格通过回调样式的方法由特定框架对象的Spring容器通知。实际可获取的框架对象组件,通过Aware的子接口来决定。 (相对常用如下:)

  • BeanFactoryAware 获得spring的bean Factory;该接口由希望获取beanFactory的bean实现。

  • ApplicationContextAware 当前的applicationContext从而调用容器的服务;该接口由希望获取applicationContext的bean实现。(ApplicationContext接口集成了MessageSource接口、ApplicationEventPublisher接口和ResourceLoader接口,因此当Bean实现ApplicationContextAware的时候就可以得到Spring容器的所有服务。)

  • MessageSourceAware 用于得到message source从而得到文本信息。

  • ApplicationEventPublisherAware 用于获取ApplicationEventPublisher,用于发布事件;

  • ResourceLoaderAware 获取ResourceLoader资源加载器,可以获得外部资源文件;

类继承结构:
Aware继承结构

看下面的代码就知道为什么可以通过实现接口,获得对应spring框架对象组件:

    private void invokeAwareInterfaces(Object bean) {
        if (bean instanceof Aware) {
            if (bean instanceof EnvironmentAware) {
                ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
            }
            if (bean instanceof EmbeddedValueResolverAware) {
                ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
            }
            if (bean instanceof ResourceLoaderAware) {
                ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
            }
            if (bean instanceof ApplicationEventPublisherAware) {
                ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
            }
            if (bean instanceof MessageSourceAware) {
                ((MessageSourceAware) bean).setMessageSource(this.applicationContext);
            }
            if (bean instanceof ApplicationContextAware) {
                ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
            }
        }
    }

5, 基于BeanPostProcessor后置处理器扩展

BeanPostProcessor:spring创建bean时的工厂方法模式中,通过BeanPostProcessor暴露出来两个钩子函数,通过自定义实现该工厂钩子函数,实现需要的扩展,如:检查注解或者用代理包装bean等;

两个具体钩子:

    /**
     * 在参数中的bean已经实例化,依赖注入等完成后,但是在自定义初始化方法(类似@PostConstruct 修饰的自定义初始化函数)完成初始化之前调用。返回该bean或者被代理包装过的bean;
     */
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    /**
     * 在参数中的bean已经实例化,依赖注入等完成后,但是在自定义初始化方法(类似@PostConstruct 修饰的自定义初始化函数)完成初始化之后调用。返回该bean或者被代理包装过的bean;
     */
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

BeanPostProcessor有很多子接口,可以通过扩展实现,具体参见BeanPostProcessor的继承实现结构。

具体实现方式、代码,参照:java注解(java Annotation) 注解修饰类生效方式一。

6,基于BeanFactoryPostProcessor后置处理器扩展

BeanFactoryPostProcessor 允许自定义修改应用程序上下文的bean定义,调整上下文基础bean工厂的bean属性值。

比 BeanPostProcessor更强大,BeanPostProcessor用于bean在实例化后扩展;而BeanFactoryPostProcessor 用于在bean实例化之前读取bean的定义(bean的元数据),并可以修改它,使bean按照新的定义信息初始化bean;

可以按照需要定义很多个BeanFactoryPostProcessor 实例,注册进入spring容器,在spring bean factory初始化完成后,会通知所有processor执行。

BeanFactoryPostProcessor继承结构,有很多实现可以用于扩展,这里只就BeanFactoryPostProcessor和典型子接口BeanDefinitionRegistryPostProcessor进一步描述;

/**
 * 允许自定义修改应用程序上下文的bean定义,调整上下文基础bean工厂的bean属性值。
 */
public interface BeanFactoryPostProcessor {
    /**
     * 在bean factory的标准初始化都装载完成后,在bean实例化之前,允许修改应用程序上下文的内部bean factory。可以重载,也可以添加。
     */
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}
/**
 * 扩展标准的beanfactorypostProcessor SPI,允许在常规beanfactorypostProcessor检测开始之前注册进一步的bean定义。 (从BeanFactoryPostProcessor继承,可以同时实现两个接口)
 */
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {

    /**
     * 修改应用程序上下文的内部bean定义注册表,在其标准的初始化之后。所有常规bean定义都将被加载,但是还没有bean被实例化。这允许在下一个后处理阶段开始之前进一步添加bean定义。在 beanfactorypostProcessor之前。
     */
    void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

}

7,基于spring aop 扩展

AOP:Aspect Oriented Programming 面向切面编程;采用动态代理,在程序运行期间将切面(某段代码,实现通用性功能)织入到指定方法上运行(含前置、后置、返回、异常、环绕五种通知类型,确定了代码织入到目标方法的方式)。通过这种方式,业务逻辑行为和切面处理逻辑独立开来,业务逻辑行为将注意力集中在具体的业务逻辑上,对切面代码和业务逻辑行为代码进行了良好的解耦。

采用spring AOP机制实现功能扩展的实现例子参见:java注解 注解修饰类生效方式二。

在这里简要解析一下AOP是如何在spring框架中是如何生效,以便更好理解spring AOP(spring AOP的实现比较复杂,这里描述整体实现的骨架):

  • spring 注解方式加入AOP模块后,启动时,会往spring容器中注册一个AnnotationAwareAspectJAutoProxyCreator类;
  • AnnotationAwareAspectJAutoProxyCreator类继承自:AbstractAutoProxyCreator;AbstractAutoProxyCreator是一个BeanPostPorcessor同时也实现了BeanFactoryAware;
  • spring在容器准备好后,创建bean,创建bean的过程如下:

    ​1,创建bean实例;

    ​2,给bean属性赋值,注入等;

    ​3,初始化bean:

    ​ 3.1,处理Aware接口类型实现的方法回调;

    ​ 3.2,调用BeanPostProcessor的初始化前置钩子函数;

    ​ 3.3,调用自定义的初始化方法;(@PostConstruct注解等)

    ​ 3.4,调用BeanPostProcessor的初始化后置钩子函数;

  • AnnotationAwareAspectJAutoProxyCreator的钩子函数实现中,完成了如下处理,给目标对象的方法做了代理:

    1,获取所有拦截器,找到哪些切面是要通知到当前bean方法的,并排序;

    2,将bean保存在advisedBeans中;

    3,通过proxyFactory动态创建代理;

    4,给容器中返回当前增强了的代理对象;该代理对象会进入spring容器。

  • 目标方法执行时:

    ​1,方法调用时,代理对象执行方法;调用CglibAopProxy.intercept();

    ​2,职责链的方式进入每一个拦截器依次执行切面功能;

    ​3,实际执行就成了:

    ​ 3.1 前置通知切面依次执行;

    ​ 3.2 目标对象方法执行;

    ​ 3.3 后置通知切面依次执行;

    ​ 3.4 返回通知切面依次执行;

    ​ 3.5 异常通知切面依次执行。

8,基于SPI机制扩展

SPI就是:Service Provider Interface 服务提供者接口。基本含义就是,框架提供接口定义;而不同插件厂商提供具体的实现方案。实际使用时,根据配置,获取实现方案加载、实例化。这样就实现了模块插件的可插拔。SPI在各种框架中是重要的扩展机制,例如常见的dubbo、spring等都提供了自身框架支持的SPI机制。

jdk SPI机制,采用约定的方式,把所有扩展服务实现放在META-INF/services/目录下,读取定义的属性配置文件,获取实际实现类,然后装载、实例化。

在spring提供的SPI机制中,是通过处理器的形式加载,在spring容器准备好,加载了各种自身的processor和外部定义的processor后,refresh方法中,调用了AbstractApplicationContext的refresh方法;如下附代码,在准备好bean工厂,设置好所有beanPostProcessors后,通过invokeBeanFactoryPostProcessors 调用postProcessors;这样就把插件引入了spring。(例如:mybatis插件就是通过BeanDefinitionRegistryPostProcessor引入。)

    public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // 为刷新、设置其启动日期和活动标志;以及初始化property sourse的初始化上下文准备此上下文。
            prepareRefresh();

            // Tell the subclass to refresh the internal bean factory.
            //刷新内部bean工厂
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // 配置beanFactory的上下文环境,Classloader、BeanPostProcessor等。
            prepareBeanFactory(beanFactory);

            try {
                // Allows post-processing of the bean factory in context subclasses.
                //设置了postProcessors;
                postProcessBeanFactory(beanFactory);

                // Invoke factory processors registered as beans in the context.
                //执行BeanFactoryPostProcessors,会调用各种BeanFactoryPostProcessor的实现方法;同时会调用 processConfigBeanDefinitions(registry) --> processDeferredImportSelectors;EnableAutoConfiguration注解中import的ImportSelector被调用执行;
                invokeBeanFactoryPostProcessors(beanFactory);

                // 注册BeanPostProcessor.
                registerBeanPostProcessors(beanFactory);

                // 初始化 message source.
                initMessageSource();

                // 初始化应用程序事件广播。如果上下文中没有定义任何消息,则使用simpleapplicationEv多发广播
                initApplicationEventMulticaster();

                // 初始化themesource、内嵌的servlet 容器.
                onRefresh();

                //将实现了ApplicationListener的bean放入listeners;
                registerListeners();

                // Instantiate all remaining (non-lazy-init) singletons.
                // 完成beanFactory的初始化,初始化所有剩余的单例bean。
                finishBeanFactoryInitialization(beanFactory);

                // Last step: publish corresponding event.
                // 完成刷新,调用LifecycleProcessor的onRefresh方法;并发布contextrefreshedevent事件;
                finishRefresh();
            }

            catch (BeansException ex) {
                if (logger.isWarnEnabled()) {
                    logger.warn("Exception encountered during context initialization - " +
                            "cancelling refresh attempt: " + ex);
                }

                // Destroy already created singletons to avoid dangling resources.
                destroyBeans();

                // Reset 'active' flag.
                cancelRefresh(ex);

                // Propagate exception to caller.
                throw ex;
            }

            finally {
                // Reset common introspection caches in Spring's core, since we
                // might not ever need metadata for singleton beans anymore...
                resetCommonCaches();
            }
        }
    }

9,小结

​ spring还有一些其它扩展方式,比如:基于ApplicationListener进行事件监听扩展等,基本方式类似BeanPostProcessor。基于理解spring启动和容器中各种处理过程后,就可以参照spring中的实现方式,进行自定义的扩展。良好的运用spring注解和扩展能让产品代码优雅且功能强大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring注解及扩展 的相关文章

  • 唯一索引或主键违规:“PRIMARY KEY ON PUBLIC.xxx”; SQL语句

    每当我的应用程序启动时 我都会收到以下错误消息 Caused by org h2 jdbc JdbcSQLException Unique index or primary key violation PRIMARY KEY ON PUBL
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav

随机推荐

  • mask-rcnn训练识别纸箱模型

    源码来源 matterport Mask RCNN https github com matterport Mask RCNN 一 开发环境及工具 1 开发环境 anaconda3 python3 6 jupyter pycharm 2 样
  • Postman设置接口集断言

    1 点击接口集 Tests 点击右侧选择断言的方式 2 比如 设置返回的字符串包含 XX pm test 通过 function pm expect pm response text to include XX 3 因为通过的body字符串
  • 提高效率:VMLogin浏览器免密码同时登录多个Facebook账号

    无论是媒体运营者还是作为日常使用 几乎每个人都会拥有多个社交媒体账号 其中多个Facebook账号无疑是最常见的之一 多个Facebook账号的好处是显而易见的 可以在不同的身份 角色下展示自己 拓宽人脉圈子 提升个人或品牌的影响力 然而
  • char码值对应列表大全

    char码值对应列表大全 Char 0 为0的字符 Char 1 Char 2 Char 3 Char 4 Char 5 Char 6 Char 7 响铃 Char 8 回格 Char 9 tab 水平制表符 Char 10 换行 Char
  • 【数学】找出若干个有序数组的最小距离

    题目 EPI 题目中要求的是三个有序数组 代码里扩展成k个有序数组 其中k是函数输入的数组的size 题目的意思可简化为 从A中的每个数组里选出一个数 则一共有k个数 这k个数从小到大排序 存放在set里 其实就是排序了 设最大的数减去最小
  • 南昌工学院计算机网络技术,计算机网络与信息安全研究所

    南昌工程学院计算机网络与信息安全研究所是依托信息工程学院建立的首个校级研究所 所长孙辉博士 教授 硕士生导师 信息工程学院院长 江西省中青年学科带头人 江西省普通高校教学名师 南昌市 五一 劳动奖章获得者 水利部及江西省优秀教师 兼任全国水
  • 数据通信2

    一个数据通信系统可划分为三大部分 源系统 传输系统 目的系统 在数据通信模型中 模拟信号和数字信号之间的转换需要调制解调器 常用术语 数据 data 运送消息的实体 信号 signal 数据的电气的或电磁的表现 模拟信号 analogous
  • 多种优化算法优化LSTM——【包括:粒子群、蝙蝠、正余旋、多元宇宙、正余弦、JAYA、哈里斯鹰、萤火虫、布谷鸟、非洲秃鹫、麻雀优化、灰狼优化、蜣螂优化】(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码实现 1 概述 多种优化算法优化LSTM Python代码
  • 应用窗口置顶工具 DeskPins

    作者链接地址 DeskPins 安装后点击右下角的小图标 再选择要置顶的窗口 右键进入配置项可以设置置顶快捷键
  • 编译原理第三版pdf_CS143:编译原理|PA1:熟悉Cool语言

    本文使用 Zhihu On VSCode 创作并发布 这是本人实现斯坦福CS143变编程作业的笔记 对应第一次作业PA1 环境搭建和一些说明请看 CS143 编译原理 环境搭建HelloWorld 从第一篇搬运一段话 你可能发现了 课程官网
  • 星星之火-56:前传接口 CPRI容器的字长、能力与CPRI速率的对应关系

    CPRI容器的字长 能力与CPRI速率的对应关系 选项 Rate1 Rate2 Rate3 Rate4 Rate5 Rate6 Rate7 Rate8 Rate9 Rate10 Rate倍数 1 2 3 4 5 6 7 8 9 10 码片倍
  • v-if 不生效----vue深入式响应原理

    今天在写的一个行内编辑功能 想通过v if 判断行内是否是编辑状态 来展示是input输入 还是普通显示文本 初始化默认的scope row ipshow1 true 点击编辑按钮 想通过 click scope row ipshow1 f
  • 为什么win11连接wifi频繁掉线?

    如果网络波动比较大的话 就会导致电脑使用过程中不顺畅 网页打开速度都会很缓慢 就有win11用户跟小编反映自己的电脑连接WiFi后总是掉线 非常烦人 这该怎么办 下面就来看看小编为大家整理的几个解决办法 希望可以解决这个问题 方法一 1 首
  • 搭建Ambari Hadoop系统实验

    1 基础环境准备 1 登录到实训系统 检查实训环境 确保有一个CentOS 7系统的虚拟机用来搭建ambari集群 非桌面版虚拟机 首先修改主机名 点击实训页面 虚拟机信息 标签进入非桌面版虚拟机 在 后输入hostnamectl set
  • windows重启nginx服务

    在nginx安装目录下 安全有序停止 nginx exe s quit 启动 start nginx
  • 考研OR工作----计算机操作系统简答题及疑难知识点总结(第三章 处理机调度与死锁)

    上一篇文章总结了一些关于进程的知识点 这章的目的也是根据 计算机操作系统 第四版 汤子瀛 的书来总结一下进程调度和死锁的相关知识点 这一章其实和上一章紧密相连 所以如果没有基础或基础较差 对一些概念还有些模糊 的朋友们先去看上一章的简答题总
  • linux常见面试题

    1 连接linux服务器工具有哪些 SecureCRSecureFX 最好 RealVNC SSHClient putty 比较 SecureCRSecureFX 可以文件传输 可使用命令行 设置字符编码 可开启多个 SSH Client
  • Java拾遗

    这里写自定义目录标题 Hibernate Error Unable to locate persister Caused by java lang NoClassDefFoundError javax sql rowset serial S
  • Nginx超时配置、限流

    目录 一 说明 二 超时配置 三 限流 限制访问频率 限制并发连接数 四 问题记录 五 参考文章 Author Jinwei EditTimes 2020年11月25日17 31 06 一 说明 Nginx 处理的每个请求均有相应的超时设置
  • spring注解及扩展

    1 spring配置注解 spring建议通过注解配置 替代原xml配置方式 使用配置类替代xml配置的优势大体 1 xml配置维护容易出错而且不易检查 java配置类基于java语法检查 对于java程序员更友好 易于维护 2 注解配置