在Spring项目中,我们希望bean的注入不是必须的,而是依赖条件的。

只有当项目中引入特定依赖库、或者只有当某个bean被创建、或者设置了某个环境变量时,才会创建这个bean。

在Spring4之前,这种条件注入的方式还不支持,在Spring4之后引入了一个新的注解 @Conditional ,这个注解作用在@Bean注解修饰的方式上。它能够通过判断指定条件是否满足来决定是否创建这样的Bean。

使用@Conditional注解需要满足一定条件:

@Conditional注解的类要实现Condition接口,它提供了一个matches()方法。只有matches()方法返回true时, 则被@Conditional注解修饰的bean就会被创建出来,否则不会创建(即matches方法返回false)。

接下来,我们对@Conditionl注解进行深入探讨。

Read More

2019,岁末。

迟迟没有动笔,不知从何讲起。

2019,变化的一年,踏实的一年,平静的一年。

变化,在于工作。原计划2020年六月的行动,提前半年实施。

坐在新的办公桌前,我敲下这段文字,生活就是这样,一个个选择造就了现在的自己。关于工作更迭,不再多言,已经在之前的文章中详细写过。

Read More

我们在开发中通常会使用邮件方式进行告警,传统的邮件发送整合起来较为繁琐,因此Spring Boot提供了一套更为简洁易用的整合方案,对Java Mail进行了封装,能够让业务更快的具备邮件发送能力。

本文主要讲解如何为Spring Boot应用添加邮件发送能力。

依赖引入

首先还是要有一个Spring Boot应用,这个就不再赘述了。在maven中央仓库搜索Spring Boot邮件发送模块,将坐标添加到项目的pom下。(这里以2.2.1RELEASE举例)

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

Read More

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 – 引用自runnoob

一个MongoDB的BSON数据结构如下:

BSON

引入spring-boot-starter-data-mongodb依赖

首先当然需要建立一个SpringBoot项目,接着在项目的pom.xml中引入spring-boot-starter-data-mongodb。坐标如下:

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

Read More

一般情况下,如果想在Spring Boot中使用定时任务,我们只需要@EnableScheduling开启定时任务支持,在需要调度的方法上添加@Scheduled注解。这样就能够在项目中开启定时调度功能了,并且这种方法支持通过cron表达式灵活的控制执行周期和频率。

上述的方式好处是快捷,轻量,缺点是周期一旦指定,想要更改必须要重启应用,如果我们想要动态的对定时任务的执行周期进行变更,甚至动态的增加定时调度任务则上述方式就不适用了。

本文我将讲解如何在Spring 定时任务的基础上进行扩展,实现动态定时任务。

Read More

本文整理一下在Spring Boot中整合Jersey实现RESTful接口的开发。

最官方的,当然是Spring Boot的官方文档,官方文档中关于整合Jersey的说明

我们主要关注如下步骤

To get started with Jersey, include the spring-boot-starter-jersey as a dependency

想要在Spring Boot中使用Jersey首先需要引入Jersey支持,坐标如下(我的项目是基于2.2.1.RELEASE构建的):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jersey</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

Read More

本文为扫盲文,为刚进入音视频行业的同学提供一些专业名词的解释,方便更快熟悉音视频相关的业务。

视频上传

顾名思义,视频上传 即通过使用相关工具,将视频从本地导入到云端服务器进行存储的过程。

Read More

天行健,君子以自强不息。 – 《周易·乾·象》

踏出熟悉的公司大门,我回头,知道以后应该不会经常回来,抬手,拍照,朋友圈里,我留下了“莫愁前路无知己,天下谁人不识君”的文字。

再见了,我将拥抱新的生活。再见了,我会有新的工作。

Read More

CouchDB 是一个开源的面向文档的数据库管理系统,它具有高度可伸缩性,提供了高可用性和高可靠性。

CouchDB发布于2005年,2008年成为Apache软件基金会项目。CouchDB是一个面向文档的NoSQL数据库。

本系列笔者将记录对CouchDB的学习实战相关内容。

作为本系列第一篇,本文主要介绍如何在centos下搭建CouchDB,以及CouchDB的简单使用。

Read More

RoceketMQ提供了两种消息消费者,DefaultMQPushConsumer、DefaultMQPullConsumer。我们都知道DefaultMQPullConsumer是基于拉模式的消费,而DefaultMQPushConsumer是基于推模式的消费。我们先简单复习一下推拉模式的概念。

推模式:当服务端有数据立即通知客户端,这个策略依赖服务端与客户端之间的长连接,它具有高实时性、客户端开发简单等优点;同时缺点也很明显,比如:服务端需要感知与它建立链接的客户端,要实现客户端节点的发现,服务端本身主动推送,需要服务端对消息做额外的处理,以便能够及时将消息分发给客户端。

拉模式:客户端主动对服务端的数据进行拉取。客户端拉取数据,拉取成功后处理数据,处理完成再次进行拉取,循环执行。缺点是如果不能很好的设置拉取的频率,时间间隔,过多的空轮询会对服务端造成较大的访问压力,数据的实时性也不能得到很好的保证。

基于对上述两个策略的优缺点的综合考虑,RocketMQ的DefaultMQPushConsumer采用了结合了推拉模式两者优点的长轮询机制,对消息进行消费。这样,既能保证主动权在客户端,还能保证数据拉取的实时性。

本文我们就对RocketMQ的长轮询机制进行分析讲解,从而更好的理解RocketMQ的设计精巧之处。

首先了解一下什么是 长轮询 机制:

Read More

Fork me on GitHub