0%

本篇文章记录对@Import注解学习的整个过程。首先文章会介绍@Import注解的使用,接着分析下spring是如何处理@Import注解,最后通过@EnableAsync来举例说明该类型注解实现的原理。

基本用法

大体上有三种用法

  1. 引入其它Configuration
  2. 初始化其它的bean
  3. 个性化加载bean

下面依次介绍这三种的用法,首先定义几个类,方便后面的讲解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface ServiceInterface {
void test();
}
class ServiceA implements ServiceInterface {

@Override
public void test() {
System.out.println("ServiceA");
}
}

class ServiceB implements ServiceInterface {

@Override
public void test() {
System.out.println("ServiceB");
}
}

引入configuration

创建了俩个Config类,其中ConfigA通过@Import引入ConfigB,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Import(ConfigB.class)
@Configuration
class ConfigA {
@Bean
@ConditionalOnMissingBean
public ServiceInterface getServiceA() {
return new ServiceA();
}
}

@Configuration
class ConfigB {
@Bean
@ConditionalOnMissingBean
public ServiceInterface getServiceB() {
return new ServiceB();
}
}

同时这里也使用了ConditionalOnMissingBean注解,主要用于判断哪个bean先生成。

通过ConfigA创建AnnotationConfigApplicationContext,获取ServiceInterface,看是哪种实现:

1
2
3
4
5
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigA.class);
ServiceInterface bean = ctx.getBean(ServiceInterface.class);
bean.test();
}

输出为:ServiceB.证明@Import的优先于本身的的类定义加载。

阅读全文 »

本篇文章主要对常用的限流算法进行总结,会按照以下思路来进行整理,首先明确什么是限流,为什么需要限流,常用的限流算法有哪些,最后对我自己觉得限流有关的比较不错的文章进行总结。

阅读全文 »

平常在使用Spring过程中,经常会用到类型转换,但一直没时间对这一块进行系统的整理。因此接下来会用几篇文章对这一块进行系统的整理。

大概的想法是下面俩篇:

  1. Spring类型转换整理
  2. BeanWrapper使用以及原理
  3. DataBinder使用以及原理

这篇文章用于记录自己在学习Spring类型转换相关的内容,主要有以下三块。

  1. PropertyEditor:用于String到Object的类型转换
  2. Conver :用于Object到Object之间的转换
  3. Format :主要用于格式化,将对象转换成指定格式的字符串,比如Date和string之间的转换
    阅读全文 »

外观模式

外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。

问题

假设你必须在代码中使用某个复杂的库或框架中的众多对象。 正常情况下, 你需要负责所有对象的初始化工作、 管理其依赖关系并按正确的顺序执行方法等。

最终, 程序中类的业务逻辑将与第三方类的实现细节紧密耦合, 使得理解和维护代码的工作很难进行。

阅读全文 »

适配器模式

适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。

问题

假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格式的股票数据, 然后向用户呈现出美观的图表。

在开发过程中, 你决定在程序中整合一个第三方智能分析函数库。 但是遇到了一个问题, 那就是分析函数库只兼容 JSON 格式的数据。
problem-zh-2x

你可以修改程序库来支持 XML。 但是, 这可能需要修改部分依赖该程序库的现有代码。 甚至还有更糟糕的情况, 你可能根本没有程序库的源代码, 从而无法对其进行修改。

阅读全文 »

linux 查看文件命令

当我们在进行调试的时候,经常需要查看各种日志文件,这时候熟悉linux下一些常用的查看文件命令是非常重要的,本篇文章专门整理了这些常用的命令,主要有下面几个。

  1. tail
  2. cat
  3. more

tail命令

ltail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个文件的最后几行显示到终端上,假设该文件有更新,tail会自己主动刷新,确保你看到最新的文件内容。

tail命令语法

tail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [-r] [ File ]

参数解释:

  1. -f 该参数用于监视File文件动态增长。
  2. -c Number 从 Number 字节位置读取指定文件
  3. -n Number 从 Number 行位置读取指定文件。
  4. -m Number 从 Number 多字节字符位置读取指定文件,比方你的文件假设包括中文字,假设指定-c参数,可能导致截断,但使用-m则会避免该问题。
  5. -b Number 从 Number 表示的512字节块位置读取指定文件。
  6. -k Number 从 Number 表示的1KB块位置读取指定文件。
  7. -r 这个会似的按照现实内容相反的顺序现实,具体见下面例子
  8. File 指定操作的目标文件名称

上述命令中,都涉及到number,假设不指定,默认显示10行。Number前面可使用正负号,表示该偏移从顶部还是从尾部开始计算。这个具体看下面例子。

阅读全文 »

Hiberate Validator使用教程之自定义约束

前面一篇文章已经讲解了Hibernate Validator的基本使用。虽然校验库本身已经提供了许多的约束,但是不一定能够满足不同功能的需要,这时就需要自定义一些约束,本篇文章主要就是来学习如何自定义约束。

简单例子

创建一个简单的自定义约束分为以下三步

  1. 创建一个约束注解
  2. 实现一个约束注解对应的Validator
  3. 定义一个默认的错误信息

下面的这个例子,是用来判断某个String字段是否是全部大小字段或者小写字段。

阅读全文 »

maven冲突解决流程

当项目比较大且开发维护的时间比较长时,项目的Maven依赖管理也会变得越来越复杂,手动的去排除冲突或者错误已经变得很困难,同时由于开发人员的不规范行为,更一步加深maven的依赖冲突比较多。我也是最近在接手一个已经做了八年项目时才有很大的感悟,之前也没碰过这么久的项目,在自己对maven依赖冲突解决的过程中形成了以下的一些思考或者说技巧。

阅读全文 »

maven依赖机制简介

本文主要是对maven官方文档Introduction to the Dependency Mechanism翻译与整理。其中加上了自己的一些理解。

依赖关系管理是Maven的一个核心特性。管理单个项目的依赖关系很容易。管理由数百个模块组成的多模块项目和应用程序的依赖关系是可能的。Maven在定义、创建和维护具有良好定义的ClassPath路径和Library版本的可复制构建方面有很大帮助。

阅读全文 »