Java中注解(Annotation)的用法。

在Java中注释的英文为Comment。而注解的英文是Annotation。

虽然注解和注释一样,也是在源代码中添加额外的补充信息。但注解都是以@开头的。

注解可以在类、字段变量、方法、接口等位置进行标记。主要为后续一些诸如:代码生成、数据校验、资源整合等工作进行铺垫。


基本注解

例如一段代码:

@Override
public String toString() {
    return "Hello World";
}

这段代码是表示重写了父类的toString()方法。如果不使用@Override代码也可以正常执行。但使用了@Override代表告诉编译器这是一个重写方法。如果我们把方法名打错,就提前报错。这可以在前期排除一些简单的问题。

如果代码不加@Override,那在我们把方法名打错的情况,这个方法就变成一个普通的方法,而不是重写方法。

注解本身是一种数据类型,是一种接口类型。是一种语法糖,其中复杂的过程由编译器来帮我们完成。

直到Java11共有11个内置注解。其中有 5 个是基本注解,它们来自于 java.lang 包。有 6 个是元注解,它们来自于 java.lang.annotation 包,自定义注解会用到元注解。

  • @Override表示重写方法
  • @Deprecated表示弃用方法
  • @SuppressWarnings用于抑制警告
  • @SafeVarargs用于抑制警告
  • @FunctionalInterface用于指定接口,保证该接口只能包含一个抽象方法。

在Java的文档注释中同样也有@deprecated,仅仅差了一个开头的大小写。虽然两者的目的差不多,都是为了表示该方法已经过时。但两者的作用却不一样文档注释作用与文档,编译器不会给出警告,注释也不直接作用于程序。而注解是直接用于修饰程序中的程序单元,如方法、类和接口等。并且注解是Java5之后才开始支持。而文档注释仅仅在程序外整理。


元注解

元注解是负责对其它注解进行说明的注解。

Java5定义了4个注解,分别是@Documented、@Target、@Retention 和 @Inherited。Java8又增加了@Repeatable和@Native两个注解。


自定义注解

基本注解和元注解,如果这两种注解不能满足你的需求,可以自定义注解。

不包含任何成员变量的注解称为标记注解,例如基本注解中的@Override注解就属于标记注解。

包含成员变量的注解称为元数据注解,因为它们可以接受更多的元数据。


注解的用法

注解的实现的原理很大的一部分是基于反射实现。

使用反射获取到类对象,进而获取构造器、字段和方法等。在源码中,类、构造器、字段和方法等均实现了AnnotatedElement接口。而这个接口包含了关于注解的一些方法。

可以通过反射来获取某个类或方法是否拥有注解。注解了些什么。需要按照这些注解整形那些步骤。

注解是一种分散式的元数据,与源代码绑定。

xml是一种集中式的元数据,与源代码无绑定。

在Java后台的开发过程中,服务器的配置项大多会存放在一个xml文件中,而Spring基于注解进行配置,从而替代了配置文件的功能。两者各有好处也有缺点。

注解有几个主要用途:

  • 生成文档,通过代码里标识的元数据生成javadoc文档。
  • 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
  • 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
  • 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例

参考:

听说你只会用注解,不会自己写注解?

java注解的使用

代码风格

##代码风格

##次行风格和尾行风格

块的写法有两种常用方式:次行(next-line) 风格和行尾(end-of-line) 风格。

public class Test
{
	public static void main(String[] args)
	{
		System.out.println("Block Styles");
	}
}
public class Test{
	public static void main(String[] args){
		System.out.println("Block Styles");
	}
}

次行风格将括号垂直对齐,因而使程序容易阅读;而行尾风格更节省空间,并有助于避
免犯一些细小的程序设计错误。这两种风格都是可以采纳的。

对于类型和泛型的理解

类型

对于强类型语言,我们需要先定义变量类型,再使用变量。


这让我不禁让我想到去吃的肯德基疯狂星期四。肯德基的疯狂星期四里面有8个蛋挞的套餐。通常一盒蛋挞是两个装。因此如果你点了疯狂星期四的套餐,你会收到四个蛋挞盒,共计八个蛋挞。

也就是说,如果你是店员,你需要准备四个盒子来装8个蛋挞。

对于肯德基的店员来说,一个店员能装的蛋挞数量,这是拿到的盒子限制的;但一个盒子只能装两个蛋挞,这是盒子大小限制的;而盒子大小是肯德基规定的。

对于计算机的数据来说,一个整形能存储的数据大小,这是字节数限制的;但一个字节最多能存储255的正整数,这是字节大小限制的(也就是8位);而字节大小是计算机行业规定的。


但肯德基和计算机还有一个很大的不同,就是进制和统计的不同。

肯德基是十进制,四个盒子分别是2、2、2、2。这四个盒子是分别计算。

肯德基合计是2+2+2+2=8,这符合我们的常理。因为我们是分开计算的。

计算机是十六进制,四个字节分别是FF、FF、FF、FF。这四个字节是在一个整体中,为0xFFFFFFFF。

计算机合计是255+65280+16711680+4278190080=4294967295。

因此计算机显得不是那么好看。


泛型

对于面向对象也是,我们总说先定义对象类型,再实例化和使用对象。

但类型并不是对象,而是对象的模板。


假设我们的程序在单线程环境中有一段代码。我们把这段代码看作是一个面包店中一台烘焙饼干的机器。但这家面包店由于电力负载问题,一次只能有一台烘焙饼干的机器在运行。

最开始,人们发明了一个烘焙饼干的机器,但这个机器只能制作小熊形状的饼干。突然人们想吃小兔饼干,于是又发明了另一个机器,但这个机器只能制作小兔形状的饼干。

人们希望有更多的饼干形状。于是出现了越来越多的机器,用于生产不同形状的饼干。这些机器功能都非常单一,一种机器只能生产一种形状的饼干。这些机器有很多非常不方便的地方。我们以小熊饼干机器为例:

  • 机器内部有很多个小熊模具,用于压出饼干形状。如果希望制作有小兔饼干就必须全部替换机器中的小熊模具。
  • 假设制作小熊饼干的机器有潜在问题,那其他所有制作不同形状饼干的机器也可能有潜在问题。
  • 这些不同的机器占据了非常大的空间位置。
  • 维护这些机器非常的复杂和繁琐。

于是人们希望有这样一种机器——这个机器有一个卡槽,在卡槽中放入需要的模具,就可以生成需要形状的饼干。这样只需要一台机器,在适当的时候放入模具,就可以生产需要形状的饼干了。

之后机器真的发明出来了,人们称这台机器为泛型烘焙机。因为它是泛用的。放入小熊模具后,这机器就变成小熊饼干烘焙机;放入小兔模具,这机器就变成小兔饼干烘焙机。


对于程序来说,类型就像是一个烘培用的小熊饼干模具,它本身并不能食用。而用这个模具做出来的小熊饼干才是我们需要的对象,这个对象才有耳朵、有身体躯干、有它的香味、并且可以食用。

因此,泛型更像是类型的模板,也就是模具的模板。我们可以使用小熊模具制造小熊饼干,也可以使用兔子模具制造兔子饼干。我们只需要在卡槽中替换模具就行了。而这个替换模具的位置就是泛型。

泛型就像是占位符,就像泛型烘焙机中放置模具的位置。

搭建SVN服务器与客户端

搭建SVN服务器与客户端

服务器使用VisualSVN,而客户端使用TortoiseSVN。

首先,需要有一台主机安装VisualSVN,这台主机将作为服务器,为下游客户端提供版本控制服务。而下游的客户端需要安装TortoiseSVN来使用服务器提供的服务。


服务器

服务器安装

下面是VisualSVN的官网。

Subversion Server for Windows | VisualSVN Server

你可以在这里先查看VisualSVN不同版本的价格和对应的功能。当然也可以只使用免费的社区版。

Pricing | VisualSVN Server

下面是VisualSVN官网的下载地址。可以自行选择需要的版本。

Download | VisualSVN Server

你可以在下面的链接中找到官方的安装流程。在安装过程中可能会出现Select the authentication mode,也就是选择身份验证模式。如果选择Use Windows authentication则需要提供许可证密钥。在安装时需要注意。

Getting Started | VisualSVN Server

服务器配置

在VisualSVN安装完成之后,我们需要先配置服务器的网络环境。之后创建供客户端使用的存储库。

配置服务器的网络环境可以参考下面的文章。

SVN服务器远程访问 – 简书 (jianshu.com)

存储库的搭建可以参考下面的文章。

搭建SVN服务器详细教程

如果使用Windows身份验证模式,可以在安装后,查看官网的这篇文章进行配置。

How to configure Integrated Windows Authentication in VisualSVN Server | VisualSVN Help Center


客户端

下面是TortoiseSVN的官网。

Home · TortoiseSVN

下面是TortoiseSVN的下载地址。可以自行选择需要的版本。

Downloads · TortoiseSVN

安装的TortoiseSVN默认是英文的,如果需要中文,可以在下面的网址选择对应版本的汉化包进行安装。

Downloading File / – TortoiseSVN – OSDN

对汉化流程不熟悉的可以查看下面的文章。

解决SVN安装语言包后无法选择中文的问题。

在客户端中安装TortoiseSVN完成后,可以直接使用存储库的URL进行访问。

C#中特性(Attribute)的用法。

### C#中特性(Attribute)的用法。

特性其实类似于修饰器,在方法执行的前后可以额外执行其他的代码,而不需要主动去做额外的设计。

其用法其实就是在类或方法前加上[Attribute()]。

using System; 
public class AnyClass
{
    [Obsolete("Don't use Old method, use New method", true)]
    static void Old() { }

    static void New() { }

    public static void Main()
    {
        Old();
    }
}

上面这个例子,在这个例子中我们使用了Obsolete特性,它标记了一个不应该再被使用的程序实体。

第一个参数是一个字符串,它解释了 为什么该实体是过时的以及应该用什么实体来代替它。实际上,你可以在这里写任何文本。第二个参数告诉编译器应该把使用这个过时的程序实体当作一种错误。它的默认值是false,也就是说编译器对此会产生一个警告。

当我们尝试编译上面这段程序的时候,我们将会得到一个错误:

AnyClass.Old()' is obsolete: 'Don't use Old method, use New method'

我们也可以自己实现特性。首先要从System.Attribute派生出我们自己的特性类(一个从System.Attribute抽象类继承而来的类,不管是直接还是间接继承,都会成为一个特性类。特性类的声明定义了一种可以被放置在声明之上新的特性)。

using System; 
public class HelpAttribute : Attribute
{

}

[Help()]
public class AnyClass
{

}

注意:对一个特性类名使用Attribute后缀是一个惯例。当我们把特性添加到一个程序实体,是否包括Attribute后缀是我们的自由。编译器会首先在System.Attribute的派生类中查找被添加的特性类。如果没有找到,那么编译器会添加Attribute后缀继续查找。

接下来把上面的特性添加到具体的程序实体中。

using System; 
public class HelpAttribute : Attribute
{
    public HelpAttribute(String Descrition_in)
    {
        this.description = Description_in;
    }
    protected String description;
    public String Description
    {
        get
        {
            return this.description;

        }
    }
}

[Help("this is a do-nothing class")]
public class AnyClass
{

}

在这个例子中,我们给HelpAttribute特性类添加了一个属性并且在后续的部分中会在运行时环境中查寻它。

字符集整理。

##字符集整理

ASCII

最通用的信息交换标准,等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。

标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。

ANSI

通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码。不同ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI编码的文本中。

Unicode

将世界上所有的文字用2个字节(也就是16位)统一进行编码。像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。

UTF-8

UTF-16

GBK

GB2312

其中GB的意思其实是“国家标准”。

一些计算机的冷知识问答

##一些计算机的冷知识问答

#为什么数组的下标从0开始编号?为什么不是1?

索引值是一个偏移量:它表示当前要引用的这个元素到数组中第一个字符之间的距离。计算机在存储器中以连续字节的形式保存数组,并利用索引计算数组元素在存储器中的位置。这样可以根据下标很快找到想要的数据。

#在C语言中,布尔值是用数字表示的。对C语言来讲,数字0代表假的值。任何不等于0的数字都将被当作真处理。

#在C语言中,逻辑与和逻辑或的运算可以只使用“|”和“&”。而“&&”和“||”被称为短路与和短路或。短路或和短路与表示如果条件成立则执行之后的逻辑。而“|”和“&”也经常被拿来进行逐位运算,对逻辑表达式求值只是它们的其中一个用处。“&”也还被用取内存地址。

#在C语言中,几乎每样东西都有返回值。不仅仅是函数调用,就连赋值表达式也有返回值。

x = 4;
y = (x = 4);
y = x = 4;

我们将4赋值给变量x。但其实“x = 4;”本身也有一个值,这个值就是赋给x的值,也就是4。而“y = (x = 4);”表示返回的值赋给了变量y。当我们把这条语句的括号去掉之后就变成了同时给多个变量赋值的链式赋值语法“y = x = 4;”

#1990年1月15日,AT&T的长途电话系统死机,照成6万人无法使用电话服务。起因是一个负责写电路交换部分C代码的开发人员企图用break从if语句中退出。break使程序跳过了整段代码,引起了这个bug,令七千万次电话呼叫在9个多小时内无法接通。

#在C语言中scanf()的意思其实是scan formatted,它用来扫描带格式的输入。

#声明是一段代码,它声称某样东西(变量或函数)存在;而定义说明了它是说明东西。如果在声明了变量的同时将其设为某个值(例如int x = 4;),这段代码既是声明又是定义。

#为什么C语言中make工具规定必须使用tab缩进,而不是空格缩进呢?

因为make之父Stuart Feldman曾说过:程序正确运行了,于是就保留了下来。几个星期以后,make拥有了几个用户,大部分是朋友,但又不愿破坏代码的基本结构。

#Java的包java.lang中的lang是什么意思?

lang是language的意思,表示Java语言包。Java语言的基本功能都在里面。包括了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等。每个Java程序运行时,系统都会自动地引入java.lang包,所以这个包的加载是缺省的。

#Windows XP的XP是什么意思?

Windows XP中XP代表的就是 Experience(体验)。和Office XP末尾的XP一样

编程语言的超集和语法扩展。

##编程语言的超集和语法扩展

微软开发了一款编程语言叫TypeScript。对于这款语言的介绍中写道:TypeScript是JavaScript的超集,扩展了JavaScript的语法,因此现有的JavaScript代码可与TypeScript一起工作无需任何修改。

超集的定义是:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S1就是S2的一个超集,相对的,S2是S1的子集。如果S1是S2的超集,且S1中一定有S2中没有的元素,则S1是S2的真超集,反过来S2是S1的真子集 。

我们再看回编程语言TypeScript。TypeScript是JavaScript的超集,也就是说,TypeScript在JavaScript的基础上可以使用更多的语法。也就是对JavaScript进行了语法扩展。

我们举个简单的例子。假设有款编程语言A只有加法。如果使用多次的加法运算会非常麻烦。于是我们开发了一款新的编程语言B。我们在编程语言A的基础上新增了乘法,使多次的加法运算更加方便。在不改变编程语言A的基础上,我们扩展了乘法运算。这就是对编程语言A的语法扩展,也可以说编程语言B是编程语言A的超集。

其实现在不只出现了针对JavaScript语法扩展的TypeScript。还有对CSS的语法扩展的Less(Leaner Style Sheets)语言。甚至还有其他编程语言的语法扩展。

这些扩展语言通常会使用和基础语言类似的语法。最后将源代码转换为基础语言的语法结构。我们再回到上面编程语言A和编程语言B的例子。我们在源代码中使用编程语言B的乘法运算后,需要将源代码转化为编程语言A的加法运算。这个过程通常由编程语言B使用自己的命令完成,就像源代码编译那样。也就是说,我们写的乘法运算最后会被转换成加法运算。在这里我们也称编程语言A是编程语言B的超集。

这里需要注意的是,超集的定义是:集合S2中的每一个元素都在集合S1中。也就是说扩展语言是向后兼容的。编程语言A中的所有特性都应该可以在编程语言B中使用。对于C++和C语言,我们通常认为C++是对C语言的扩展,但其实并非如此。C语言中有些特性是无法在C++中使用的。

例如在C和C++中,都可以在一个结构的内部声明另一个结构。

struct box
{
    struct point {int x; int y;} upperleft;
    struct point lowerright;
};

struct box ad;      // C和C++都可以
struct point dot;   // C可以,C++报错
box::point dot;     // C报错,C++可以

在C语言中,随后可以使用任意使用这些结构,但是在C++中使用嵌套结构时要使用冒号“:”。例如这样在C语言中可以使用,但C++中无法使用的例子还有很多。我们只能认为C++和C语言是两种具有相似特性的不同语言。或者像经常看到的那样说C++是对C语言做了改进。但我们不能说C++是C语言的超集。说C++是对C语言的语法扩展就更加不合理了。

在无法改变基础语言的情况下新增一些方便好用的语法特性是语法扩展的好处。通常这些语法扩展会设计得方便易学,至少不会和基础语言相差太远。缺点可能就是需要花更多的学习和维护成本了。

系统和软件之间的兼容关系。

##系统和软件之间的兼容关系

兼容(Compatible),这个词在汉语中的意思大概就是:可以在一起工作或相处。

在计算机中兼容也是指,硬件之间或软件之间可以很好的配合,不会引起错误或崩溃的情况。如果运行得很好,或者很容易配合在一块我们就会称之为兼容性很好;反之称为兼容性很差。

在计算机的快速发展过程中,无论硬件还是软件,我们所使用的产品都会发生迭代——这里的产品指的可以是计算机硬件也可以是软件程序。 出于客观原因,我们不可能让所有人使用的产品都保持一致。因此我们需要让旧的产品和新的产品可以很好的在一起工作,这也就是兼容。

这里会引申出两种情况,旧的产品可以在新的产品上使用;新的产品可以在旧的产品上使用。

前者我们称之为向后兼容(Backward Compatibility),也称为向下兼容(Downward Compatibility)。

后者我们称之为向前兼容(Foreward Compatibility),也称为向上兼容(Upward Compatible)。

这两者无论你如何理解都可以。我们用非常经典的办公软件office来举例。office 2003和office 2007是同一个产品的不同版本。新产品office 2007可以使用office 2003的文档,我们称软件office 2007可以向后兼容。而旧产品office 2003可以使用office 2007的文档,我们称软件office 2003可以向前兼容。

有时候我们会遇到使用office 2007中的新功能编辑文档,但在office 2003中无法使用的情况。这就可以说该功能不兼容office 2003。或者说office 2003对该文档(功能)不支持向前兼容。

总体来说,新产品可以使用旧产品,称为向后兼容。旧产品可以使用新产品,称为向前兼容。其实这两者只是相对的概念,就像我们称呼速度的快慢一样。例如,车跑得比人快,人跑得比车慢;新软件向后兼容旧软件,旧软件向前兼容新软件。只是其中混杂着一些计算机数据或文件共享的知识,而且这不像速度快慢一样绝对。我们习惯上说,车比人快,相对的那人一定是比车慢。而在计算机中,经常新产品向后兼容,但旧的产品不一定向前兼容。

上面提到的兼容较为狭义,通常我们两种不一样的产品可以放在一起使用我们也称之为兼容。假设有一款软件在Windows上运行得很好,在Linux上也运行得很好,我们也称之为兼容,通常说该软件兼容Windows和兼容Linux。或者当不同的软件A和软件B在一起运行时会相互影响,例如访问并修改同一处内存导致错误,我们也会称软件A和软件B不兼容或兼容性差。

一些题外话:其实计算机技术发展这么快,我们对词语的理解经常会跟不上技术的发展。就算不使用专业的词汇,也可以用其他方式很好的描述产品特性。我们只是需要描述某个东西能不能在某个地方使用,或者能不能和某个其他东西很好的一起工作而已。

常见计算机英文缩略词速查。

##计算机硬件/驱动

IC:Integrated Circuit,集成电路。

VLSI:Very Large-Scale Integration,超大规模集成电路。

CPU:Central Processing Unit,中央处理器。CPU 是计算机的大脑,负责解释、执行程序的内容。有时也将 CPU 称作“处理器”。

I/O:Input/Output,输入/输出。负责将计算机和外部设备(周边设备)连接在一起。

PIO:Parallel I/O,并行输入/输出。

BIOS:Basic Input/Output System,基本输入输出系统。BIOS的基本功能是负责初始化并测试计算机硬件是否正常,然后从硬盘中加载引导程序或从内存中加载操作系统。同时BIOS也负责管理计算机硬件参数,例如修改硬件运行模式、设备启动顺序等。

USB:Universal Serial Bus,通用串行总线。

RAM:Random-Access Memory,随机访问存储器。

DRAM:Dynamic Random Access Memory,动态随机存取存储器。DRAM 可以对任何地址进行数据的读写操作,但需要保持稳定的电源供给并时常刷新(确保是最新数据),关机后内容将自动清除

ROM:Read-Only Memory,只读存储器。

EPROM:Erasable Programmable Read-Only Memory,可擦除可编程只读存储器。

EEPROM:Electrically Erasable Programmable Read-Only Memory,带电可擦除可编程只读存储器。

CMOS:Complementary Metal Oxide Semiconductor,互补金属氧化物半导体。

POST:Power-OnSelf-Test,加电自检。

MBR:Master Boot Record,主引导记录,或主引导扇区。它是BIOS自检及初始化完成之后,访问硬盘时所必须读取加载的内容。MBR存储于每个硬盘的第一个扇区中。

UEFI,Unified Extensible Firmware Interface,统一可扩展固件接口,是适用于计算机的标准固件接口。

GUID,Globally Unique Identifier,全局唯一标识符。是一种由算法生成的二进制长度为128位的数字标识符。

GPT,GUID Partition Table,全局唯一标识分区表,是硬盘的一种分区表结构布局标准,用来替代MBR分区表并配合UEFI启动使用。

##计算机组成和代码编译

gcc:GNU Compiler Collection,GNU编译器套装。GNU编译器套装不止用来编译C语言一种,因此被称为“套装”。而C语言可能是应用gcc时使用最多的语言。

gbd:GNU Project Debugger,GNU调试器。允许你在程序运行期间研究它的代码。

gprof:GNU Profiler,GNU分析器。可以告诉你程序中哪个部分是最慢的,这样你就能进行适当优化。gprof会修改程序,修改后的程序在结束时会生成一份性能报告,然后你可以用gprof命令行工具分析它,找到程序的瓶颈所在。

gcov:GNU Coverage,GNU覆盖率测试工具。gprof用来检查代码的性能,二gcov用来检查代码中哪些部分运行了,哪些部分没运行。这在写自动化测试时特别有用,因为你需要保证测试代码覆盖了所有你想覆盖的代码。

GIL:Global Interpreter Lock,全局解释器锁。

PTVS:Python Tools for Visual Studio,用于Visual Studio的Python工具。

GTK+:GIMP toolkit,GIMP工具包。GTK+是Linux中非常有名的GUI库。

API:Application Programming Interface,应用程序编程接口。这里特指Windows API,是Windows自带的GUI库。

IDE:Integrated Development Environment,集成开发环境。

Java SE:Java Standard Edition,Java 标准版。可以用来开发客户端的应用程序。

Java EE:Java Enterprise Edition,Java 企业版。可以用来开发服务器端的应用程序。

Java ME:Java Micro Edition,Java 微型版。用来开发移动设备的应用程序。

JDK:Java Development Toolkit,Java 开发工具包。

JPA,Java Persistence API,Java持久化API。

IoC:Inversion of Control,控制反转。

DI:Denpendency Injection,依赖注入。

POJO:Plain Ordinary Java Object,简单的Java对象。有些表示只有setter/getter/toString的简单类,或者说是JavaBeans。

DAO:Data Access Object。数据访问对象。用于与数据库打交道。夹在业务逻辑与数据库资源中间。

DO:Data Object。数据对象。

DTO:Data Transfer Object。数据传输对象。

BO:Business Object。业务对象。

VO:View Object。显示层对象。

PO:Persistent Object。持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。

REST:Representational State Transfer。表述性状态传递,一种软件架构风格。

##数据库

SQL:Structured Query Language。

DDL:Data Definition Language,数据定义语言。

DML:Data Manipulation Language,数据操作语言。

DCL:Data Controlling Language,数据控制语言。

T-SQL:Transact-SQL。

##计算机软件开发集成

CI:Continuous Intergration,持续集成。

PyPA:Python Packaging Authority。

POM:Project Object Model,项目对象模型。

##计算机网络

HTTP:Hypertext Transfer Protocol,超文本传送协议。

URI:Uniform Resource Identifier,统一资源标识符。

DNS:Domain Name System,域名服务系统。将服务器名称和 IP 地址进行
关联是 DNS 最常见的用法,但 DNS 的功能并不仅限于此,它还可以将邮
件地址和邮件服务器进行关联,以及为各种信息关联相应的名称。

CGI:Common Gateway Interface,通用网关接口(公共网关接口)。对 Web 服务器程序调用其他程序的规则所做的定义就是 CGI,而按照 CGI 规范来工作的程序就称为 CGI 程序。

GPRS:General Packet Radio Service,通用分组无线业务。

UDP:User Datagram Protocol,用户数据报协议

MAC:Media Access Control

MTU:Maximum Transmission Unit,最大传输单元。

MSS:Maximum Segment Size,最大分段大小。

SFD:Start Frame Delimiter,起始帧分界符。

FCS:Frame Check Sequence,帧校验序列。

CRC:Cyclic Redundancy Check,循环冗余校验。

ARP:Address Resolution Protocol,地址解析协议。

MAU:Medium Attachment Unit,介质连接单元。

PHY:Physical Layer Device,物理层装置。

PnP:Plug and Play,是一种自动对扩展卡和周边设备进行配置的功能。

ICMP:Internet Control Message Protocol,Internet 控制报文协议。当包传输
过程中发生错误时,用来发送控制消息。

MDI:Media Dependent Interface,媒体相关接口。

MDI-X:MDI-Crossover。

IX:Internet eXchange,互联网交换。

MX:Mail eXchange,邮件交换。

MIME:Multipurpose Internet Mail Extensions,多用途因特网邮件扩充。原
本是为在电子邮件中附加图片和附件等非文本信息而制定的一种规格,后
来在 Web 的领域也得到了广泛使用。

DSL:Digital Subscriber Line,数字用户线

DOM:Document Object Model,文档对象模型。

AJAX: Asynchronous JavaScript And XML,异步的JavaScript和XML。AJAX并不是编程语言,而是代表一类程序。一类使用了标准的程序。

##Web

CDN:Content Delivery Network,内容分发网络。

##计算机语言

XML:EXtensible Markup Language,可扩展标记语言。

xsi:xml schema instance,XML所应该遵循的规范。

JSON:JavaScript Object Notation,译为“JavaScript 对象简谱”或“JavaScript 对象表示法”,是一种轻量级的、基于文本的、开放的数据交换格式。

YAML:YAML Ain’t Markup Language,它是一种以数据为中心的标记语言,比 XML 和 JSON 更适合作为配置文件。

##程序设计

AOP:Aspect-oriented programming,面向切面编程。

IOC:Inversion of control,控制反转。把传统模式中需要自己通过 new 实例化构造函数,或者通过工厂模式实例化的任务交给容器。

DI:Dependency Injection,依赖注入。DI 是 IoC 的一种实现方式,所谓依赖注入就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。

JSP:Java Server Pages,一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。

##其他

VCS:Version Control Systems,版本控制系统。

RCS:The Revision Control System,修订控制系统。

CVCS:Centralized Version Control Systems,集中化的版本控制系统。

DVCS:Distributed Version Control System,分布式版本控制系统。

LTS:Long-Term Support,意为长期支持。在软件开发中,长期支持版本通常指其维护周期比其他版本更长的稳定版本,以便用户在使用期间获得更长的安全和修复更新期限。Java的LTS版本在发布后,将会获得多年的技术支持和安全更新。