3c6d55fbb2fb4316f37bc4922ea4462308f7d3f6.png

在使用虚拟机运行了Ubuntu,对linux进行基础学习。linux的命令有非常多,本次学习主要针对常用的一些进行了学习

1、文件和目录
linux不同于windows,在windows系统下,打开计算机,其有多个驱动器盘符,盘符下有各类文件夹及文件。但在linux中,看不到盘符,只能看到文件夹及其内部的文件,linux没有盘符的概念,只有一个更目录“/”,所有的文件都在它下面。
linux常见的文件目录
/:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。

/bin、/usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。

/boot:放置linux系统启动时用到的一些文件,如Linux的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub。

/etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,这里的文件轻易不要动,其中重要的配置文件有 /etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d。

/home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,表示当前用户的家目录, edu 表示用户 edu 的家目录。

/root:系统管理员root的家目录。

/tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。

用户目录
/home/user目录称之为用户工作目录或者家目录,user为用户名,在增加用户时,通过选择会自动在/home下创建家目录,表示方式:

/home/user
~

相对路径和绝对路径
绝对路径

从/根目录开始描述的路径为绝对路径,如:

cd /home
ls /usr
cd ~

相对路径

从当前位置开始描述的路径为相对路径,如:

# . .. 其中.表示当前目录,..表示上一级目录
cd ../../
ls abc/def

2、文件权限
文件权限就是文件的访问控制权限,即哪些用户和组群可以访问文件以及可以执行什么样的操作。一个文件/目录可能有读、写及执行权限:

  • 读权限(r) 对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
  • 写权限(w) 对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
  • 可执行权限(x) 对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。

​3、访问用户
通过设定权限可以从以下三种访问方式限制访问权限:

  • 只允许用户自己访问(所有者) 所有者就是创建文件的用户,用户是所有用户所创建文件的所有者,用户可以允许所在的用户组能访问用户的文件。
  • 允许一个预先指定的用户组中的用户访问(用户组)用户都组合成用户组,例如,某一类或某一项目中的所有用户都能够被系统管理员归为一个用户组,一个用户能够授予所在用户组的其他成员的文件访问权限。
  • 允许系统中的任何用户访问(其他用户)用户也将自己的文件向系统内的所有用户开放,在这种情况下,系统内的所有用户都能够访问用户的目录或文件。在这种意义上,系统内的其他所有用户就是other 用户类

通过在终端输入:ls -lh,我们可以查看当前文件夹的所有文件详细信息:
微信截图_20190716170809.png

以dbs文件夹为例,其中:

1)d代表文件的类型;

2)而后每3个字符代表一类用户具有的文件权限,dbs的所有者用户具有读、写、执行权限,同一用户组的用户具有读、写、执行权限,其他用户具有读和可执行权限;

3)拥有者为python用户,用户组为python用户组。

dbs的所有者用户具有读、写、执行权限,同一用户组的用户具有读、写、执行权限,其他用户具有读和可执行权限;

3)拥有者为python用户,用户组为python用户组。

概述:

VMWare提供了三种工作模式,它们是bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式)。要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式。
  • 1.bridged(桥接模式)

  在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器。

  在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,由于这个虚拟系统是局域网中的一个独立的主机系统,那么就可以手工配置它的TCP/IP配置信息,以实现通过局域网的网关或路由器访问互联网。

  使用桥接模式的虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑。想让它们相互通讯,你就需要为虚拟系统配置IP地址和子网掩码,否则就无法通信。

  如果你想利用VMWare在局域网内新建一个虚拟服务器,为局域网用户提供网络服务,就应该选择桥接模式。

  • 2.host-only(主机模式)

  在某些特殊的网络调试环境中,要求将真实环境和虚拟环境隔离开,这时你就可采用host-only模式。在host-only模式中,所有的虚拟系统是可以相互通信的,但虚拟系统和真实的网络是被隔离开的。

  提示:在host-only模式下,虚拟系统和宿主机器系统是可以相互通信的,相当于这两台机器通过双绞线互连。

  在host-only模式下,虚拟系统的TCP/IP配置信息(如IP地址、网关地址、DNS服务器等),都是由VMnet1(host-only)虚拟网络的DHCP服务器来动态分配的。

  如果你想利用VMWare创建一个与网内其他机器相隔离的虚拟系统,进行某些特殊的网络调试工作,可以选择host-only模式。

  • 3.NAT(网络地址转换模式)

  使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式可以实现在虚拟系统里访问互联网。NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,无法进行手工修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。

  如果你想利用VMWare安装一个新的虚拟系统,在虚拟系统中不用进行任何手工配置就能直接访问互联网,建议你采用NAT模式。

  提示:以上所提到的NAT模式下的VMnet8虚拟网络,host-only模式下的VMnet1虚拟网络,以及bridged模式下的VMnet0虚拟网络,都是由VMWare虚拟机自动配置而生成的,不需要用户自行设置。VMnet8和VMnet1提供DHCP服务,VMnet0虚拟网络则不提供。

这个问题一直都没有彻底的搞清楚,心里不是很有数,Vmware中什么网桥,NAT啊,Hostonly什么的,另外还有Colinux里面的网络问题。总之很繁杂,搞清楚很有必要。

1.VMware网络连接的几种方式

大家在安装完虚拟机后,默认安装了两个虚拟网卡,VMnet1和
VMnet8,其他的未安装(当然也可以手动安装其他的)。其中VMnet1是host网卡,用于host方式连接网络的。VMnet8是NAT网卡,用
于NAT方式连接网络的。它们的IP地址是随机生成的,如果要用虚拟机做实验的话,最好将VMnet1到VMnet8的IP地址改掉。习惯上把
VMware虚拟网卡使用的网段“固定”,使用如下原则:VMnet1对应的网段是192.168.10.0,VMnet2对应的网段是
192.168.20.0,其他的类似。当然平常只是随便用用的就不用改了,能上网就行了。

网络连接的方式主要有:Bridged(桥接)、NAT、host(主机网络)。

vmware中的网络(bridge,nat) - undemon - 对自己的最佳肯定就是对自己的不断否定

Use bridged networking(使用桥接网络)

说明:使用VMnet0虚拟交换机,此时虚拟机相当与网络上的一台独立计算机与主机一样,拥有一个独立的IP地址。
1.jpg
vmware中的网络(bridge,nat) - undemon - 对自己的最佳肯定就是对自己的不断否定

使用桥接方式,A,A1,A2,B可互访。

vmware中的网络(bridge,nat) - undemon - 对自己的最佳肯定就是对自己的不断否定

Use network address translation(NAT)

说明:使用Vmnet8虚拟交换机,此时虚拟机可以通过主机单向网络上的其他工作站,其他工作站不能访问虚拟机。
2.jpg
vmware中的网络(bridge,nat) - undemon - 对自己的最佳肯定就是对自己的不断否定

使用NAT方式,A1,A2可以访问B,但B不可以访问A1,A2。但A,A1,A2可以互访。

vmware中的网络(bridge,nat) - undemon - 对自己的最佳肯定就是对自己的不断否定

Use Host-Only networking(使用主机网络)

说明:使用Vmnet1虚拟交换机,此时虚拟机只能与虚拟机、主机互访。也就是不能上Internet
3.jpg
vmware中的网络(bridge,nat) - undemon - 对自己的最佳肯定就是对自己的不断否定

使用Host方式,A,A1,A2可以互访,但A1,A2不能访问B,也不能被B访问。

实际应用:现在最普遍使用的是宽带,使用桥接方式,主机必然可以上网,但是虚拟机上的操作系统是不可以上网的。此时你的主机就相当于A,而虚拟机就相当于
A1,除非你再向运营商(如电信,网通)申请个IP地址,显然这是不可取
的。如果你有路由器的话,那么就可以使用桥接方式上网,因为此时你申请的IP地址是写在了路由器上,而不是你的机器上,这样包括你的主机,虚拟机,也包括
连在路由器上的其他人的机器,都将可以上网,使用着由路由器自动分配的IP地址,IP地址一般是192.168.0.XXX。貌似运营商不太乐意你使用路
由器,说什么对他们交换机的接口有损害。当然,只要你的主机可以上网,使用NAT方式,虚拟机总是可以上网(当然不包括在你胡乱改写IP,网关,DNS等
信息的情况下)。

实例手动设置:假设主机的VMnet1使用网段地址为192.168.10.0,VMnet8使用网段地址为192.168.80.0,网关地址为
192.168.80.254(也就是NAT路由器地址,可自己设置,在VMnet8上),主机网卡使用地址为192.168.1.1。

一、使用桥接方式,虚拟机A1的IP地址可以设置成192.168.1.5(与主机网卡地址同网段的即可),其他的诸如网关地址,DNS,子网掩码均与主机的相同。

二、使用NAT方式,虚拟机A1的IP地址可以设置成192.168.80.5(与VMnet8使用相同的网段),网关是NAT路由器地址,即192.168.80.524

三、使用host-only方式,虚拟机A1的IP地址可以设置成192.168.10.5(与VMnet1使用相同的网段)

说明:一般用户不需要自己手动设置,选择自动获取,或开启DHCP服务即可。

2.第二套说法

很多朋友都用vmware来测试不同的系统,我结合自己的经验谈一下对网络设置的理解,不对的地方请指正。

bridge:

这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡 绑定两个不同地址类似,实际上是将网卡设置为混杂模式,从而达到侦听多个IP的能力。

在此种模式下,虚拟机内部的网卡(例如linux下的eth0)直接连到了物理网卡所在的网络上,可以想象为虚拟机和host机处于对等的地位,在网络关系上是平等的,没有谁在谁后面的问题。

使用这种方式很简单,前提是你可以得到1个以上的地址。对于想进行种种网络实验的朋友 不太适合,因为你无法对虚拟机的网络进行控制,它直接出去了。

nat方式:

这种方式下host内部出现了一个虚拟的网卡vmnet8(默认情况下),如果你有过 做nat服务器的经验,这里的vmnet8就相当于连接到内网的网卡,而虚拟机本身则相当于运 行在内网上的机器,虚拟机内的网卡(eth0)则独立于vmnet8。

你会发现在这种方式下,vmware自带的dhcp会默认地加载到vmnet8界面上,这样 虚拟机就可以使用dhcp服务。更为重要的是,vmware自带了nat服务,提供了从vmnet8到外网的地址转 换,所以这种情况是一个实实在在的nat服务器在运行,只不过是供虚拟机用的。

很显然,如果你只有一个外网地址,此种方式很合适。

hostonly:

这应该是最为灵活的方式,有兴趣的话可以进行各种网络实验。和nat唯一的不同的是,此 种方式下,没有地址转换服务,因此,模认情况下,虚拟机只能到主机访问,这也是hostonly的名字的意义。

默认情况下,也会有一个dhcp服务加载到vmnet1上。这样连接到vmnet1上的虚拟机仍然可以设置成dhcp,方便系统的配置.

是不是这种方式就没有办法连接到外网呢,当然不是,事实上,这种方式更为灵活,你可以使用自己的方式,从而达到最理想的配置,例如:

a.使用自己dhcp服务:首先停掉vmware自带的dhcp服务,使dhcp服务更为统一。

b.使用自己的nat,方便加入防火墙。windows host可以做nat的方法很多,简单的如windows xp的internet共享,复杂的如windows server里的nat服务。

c.使用自己的防火墙。因为你可以完全控制vmnet1,你可以加入(或试验)防火墙在vmnet1和外网的网卡间。

从以上可以看出,hostonly这种模式和普通的nat server带整个内网上网的情形类似,因此你可以方便的进行与之有关的实验,比如防火强的设置等。

3.第三套说法

VMware支持三种类型的网络:NAT,Bridged,Host-only。

NAT

这种方式下,虚拟机的网卡连接到宿主的 VMnet8 上。此时系统的 VMWare NAT Service 服务就充当了路由器的作用,负责将虚拟机发到 VMnet8 的包进行地址转换之后发到实际的网络上,再将实际网络上返回的包进行地址转换后通过 VMnet8 发送给虚拟机。VMWare DHCP Service 负责为虚拟机提供 DHCP 服务。

vmware中的网络(bridge,nat) - undemon - 对自己的最佳肯定就是对自己的不断否定

Bridged

这种方式下,虚拟机就像一台真正的计算机一样,直接连接到实际的网络上,与宿主机没有任何联系。

vmware中的网络(bridge,nat) - undemon - 对自己的最佳肯定就是对自己的不断否定

Host-only

这种方式下,虚拟机的网卡连接到宿主的 VMnet1 上,但系统并不为虚拟机提供任何路由服务,因此虚拟机只能和宿主机进行通信,而不能连接到实际网络上。

vmware中的网络(bridge,nat) - undemon - 对自己的最佳肯定就是对自己的不断否定

replicate physical network connection state 选项解释:
Select if the virtual machine uses a bridged network connection and if you use the virtual machine on a laptop or other mobile device. As you move from one wired or wireless network to another, the IP address is automatically renewed.
单机多网卡 或者 笔记本和移动设备使用虚拟机时,当在有线网络和无线网络切换时,勾选了Replicate physical network connection state,虚拟机网卡的ip地址会自动更新,不需要重新设置。

 title=

VLAN的意义:

    VLAN的出现就是为了解决交换机在进行局域网互联时无法限制广播的问题。VLAN可以把一个局域网划分成多个虚拟局域网--VLAN(Virtual LAN),也就是在一个局域网内又建了一些局域网,每个VLAN就是一个广播域,VLAN内的主机间通信就和在一个LAN内一样,而VLAN间的主机则不能直接互通,这样,广播数据帧就限制在一个VLAN内。
    在交换式以太网出现以后,同一个交换机的不同端口处于不同的冲突域中,交换式以太网的效率大大提高。但是,在交换式以太网中,由于交换机所有的端口都处于一个广播域中,导致一台计算机发出的广播域,局域网中所有的计算机都能够接收到,使局域网中的有限网络资源被无用的广播信息所占用。
    交换机虽然已经解决了冲突域的问题,但是大量的广播会严重影响主机的CPU处理,从而降低主机的效率。

VLAN的优点如下:

 

  • 限制广播域

广播域被限制在一个VLAN内,节省了带宽,提高了网络处理能力。

  • 增强局域网的安全性

VLAN间的二层报文是相互隔离的,即一个VLAN内的用户不能和其它VLAN内的用户直接通信,如果不同VLAN要进行通信,则需通过路由器或三层交换机等三层设备。

  • 灵活构建虚拟工作组

用VLAN可以划分不同的用户到不同的工作组,同一工作组的用户也不必局限于某一固定的物理范围,网络构建和维护更方便灵活。

Selenium

设置等待时间

Thread.sleep(2000); (1000代表1s)

断言assertion:

验证应用程序的状态是否同所期望的一致。
常见的断言包括:验证页面内容,如标题是否为X或当前位置是否正确,或是验证该复选框是否被勾选。
断言被用于三种模式: assert 、verify、waitfor
Assert 失败时,该测试将终止。
Verify 失败时,该测试将继续执行,并将错误记入日显示屏 。也就是说允许此单个 验证通过。确保应用程序在正确的页面上。
Waitfor用于等待某些条件变为真。可用于AJAX应用程序的测试。
如果该条件为真,他们将立即成功执行。如果该条件不为真,则将失败并暂停测试。直到超过当前所设定的超时时间。 一般跟setTimeout时间一起用

断言常用的有:
assertLocation(判断当前是在正确的页面)、
assertTitle(检查当前页面的title是否正确)、
assertValue(检查input的值, checkbox或radio,有值为”on”无为”off”)、
assertSelected(检查select的下拉菜单中选中是否正确)、
assertSelectedOptions(检查下拉菜单中的选项的是否正确)、
assertText(检查指定元素的文本)、
assertTextPresent(检查在当前给用户显示的页面上是否有出现指定的文本)、
assertTextNotPresent(检查在当前给用户显示的页面上是否没有出现指定的文本)、
assertAttribute(检查当前指定元素的属性的值)、
assertTable(检查table里的某个cell中的值)、
assertEditable(检查指定的input是否可以编辑)、
assertNotEditable(检查指定的input是否不可以编辑)、
assertAlert(检查是否有产生带指定message的alert对话框)、
waitForElementPresent (等待检验某元素的存在。为真时,则执行。)

最常用的unittest断言如下:
1.相等断言:assertEqual(self, first, second, msg=None)  常用于title和url的对比来检查是否与预期结果一致;
 self.assertEqual(u'用户 - Delicate Cloud Dashboard', driver.title, 'switch to Admin_Identity_User panel fail')
2.不等断言:assertNotEqual(self, first, second, msg=None)  与1相反,此断言不常用;
3.True断言:assertTrue(self, expr, msg=None)     此断言可用于对寻找某元素的表达式进行判断,如返回True则通过,否则Fail;
4.False断言:assertFalse(self, expr, msg=None)    此断言可用于对寻找某元素的表达式进行判断,如返回False则通过,否则Fail;
3和4可以配合使用selenium IDE所生成的Python脚本中is_element_present和is_alert_present来使用;
selenium元素的定位以及操作

元素的定位

Selenium
自动化,我们需要做的最基本的事情就是在页面找到元素并通过脚本程
序去操作这个元素,实现模拟人工操作。我们有多种定位元素的方式可以选择:
通过元素的
ID定位元素:
findElement(By.id(element));
通过元素的名称定位元素:
findElement(By.name(element));
通过元素的html中的位置定位元素:
findElement(By.xpath(element));
通过元素的标签名称定位元素:
findElement(By.tagName(element));
通过元素的链接名称定位元素:
findElement(By.linkText(element));
通过元素的类名定位元素:
findElement(By.className(element));
通过元素的css定位元素:
findElement(By.cssSelector(element));
通过元素的部分链接名称定位元素:
findElement(By.partialLinkText(element));

元素的操作

不同的元素我们进行不同的操作,按钮的点击、输入框的字符输入、或者是元素的内
容获取,不同的元素我们操作的方式不一。
对ID为element的元素进行点击操作:
driver.findElement(By.id(element)).click();
对ID为element的元素进行发送字符操作:
driver.findElement(By.id(element)).sendKeys(“XXXXXX”);
这里只举用的最多且最简单的的两例元素的操作,
还有的是先获取元素后,再单独操作
WebElement text1 = driver.findElement(By.name("password"));
text1.sendKeys("123456");

3.页面操作

模拟鼠标点击:driver.click();
打开网页:driver.get("https://www.baidu.com");
关闭网页:driver.close();
在输入框中输入内容:text.sendKeys(“”);
清空输入框中的内容:text.clear();
获取输入框中的内容:text.getText();
选择下拉框中的元素:
Select select = new Select(wd.findElement(By.id("select")));
切换到某个frame:
driver.switchTo().frame("");
从一个frame切换到另一个frame:
driver.switchTo().frame("");
切换到某个window:
driver.switchTo().window("windowName");
返回父iframe:(一般在跳转frame之前都写上这个语句)
driver.switchTo().defaultContent();
刷新页面:driver.navigate().refresh();
页面前进后退:
driver.navigate().forward();
driver.navigate().back();
悬停鼠标:

1.5.1输入框(text field or textarea)WebElement element = driver.findElement(By.id("passwd-id"));

*element.sendKeys(“test”);//在输入框中输入内容:
* element.clear();       //将输入框清空
* element.getText();     //获取输入框的文本内容: 

1.5.2下拉选择框(Select)Select select = new Select(driver.findElement(By.id("select")));

* select.selectByVisibleText(“A”);
* select.selectByValue(“1”); 
* select.deselectAll();
* select.deselectByValue(“1”);
* select.deselectByVisibleText(“A”);
* select.getAllSelectedOptions();
* select.getFirstSelectedOption(); 

1.5.3单选项(Radio Button)WebElement radio=driver.findElement(By.id("BookMode"));

* radio.click();       //选择某个单选项
* radio.clear();      //清空某个单选项
* radio.isSelected();  //判断某个单选项是否已经被选择

1.5.4多选项(checkbox)WebElement checkbox = driver.findElement(By.id("myCheckbox."));

* checkbox.click();
* checkbox.clear();
* checkbox.isSelected();
* checkbox.isEnabled();

1.5.5按钮(button)WebElement btn= driver.findElement(By.id("save"));

* btn.click();      //点击按钮
* btn.isEnabled ();  //判断按钮是否enable

1.5.7弹出对话框(Popup dialogs)Alert alert = driver.switchTo().alert();

* alert.accept();  //确定
* alert.dismiss();  //取消
* alert.getText(); //获取文本

1.5.8表单(Form)  Form中的元素的操作和其它的元素操作一样,对元素操作完成后对表单的提交可以:
  WebElement approve = driver.findElement(By.id("approve"));
  approve.click();

  approve.submit();//只适合于表单的提交
1.5.9上传文件上传文件的元素操作:
  WebElement adFileUpload =driver.findElement(By.id("WAP-upload"));
  String filePath = "C:\test\uploadfile\media_ads\test.jpg";
  adFileUpload.sendKeys(filePath);
1.6 Windows 和 Frames之间的切换

driver.switchTo().defaultContent();     //返回到最顶层的frame/iframe
driver.switchTo().frame("leftFrame");    //切换到某个frame:
driver.switchTo().window("windowName"); //切换到某个window
1.7 调用Java ScriptWeb driver对Java Script的调用是通过JavascriptExecutor来实现的,例如:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("JS脚本");
1.8 超时设置 WebDriver driver = new FirefoxDriver();

* driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);      //识别元素时的超时时间
* driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);  //页面加载时的超时时间
* driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);  //异步脚本的超时时间

2.png

@Component, @Service, @Controller, @Repository

是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理 
@Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能 
@Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。 
@Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。 
@Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。 
用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。
1.png

官网引用

引用spring的官方文档中的一段描述:
在Spring2.0之前的版本中,@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常
在Spring2.5版本中,引入了更多的Spring类注解:@Component,@Service,@Controller。@Component是一个通用的Spring容器管理的单例bean组件。而@Repository, @Service, @Controller就是针对不同的使用场景所采取的特定功能化的注解组件。
因此,当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller来替代它,同时这些注解会具备有更多的功能,而且功能各异。
最后,如果你不知道要在项目的业务层采用@Service还是@Component注解。那么,@Service是一个更好的选择。
就如上文所说的,@Repository早已被支持了在你的持久层作为一个标记可以去自动处理数据库操作产生的异常(译者注:因为原生的java操作数据库所产生的异常只定义了几种,但是产生数据库异常的原因却有很多种,这样对于数据库操作的报错排查造成了一定的影响;而Spring拓展了原生的持久层异常,针对不同的产生原因有了更多的异常进行描述。所以,在注解了@Repository的类上如果数据库操作中抛出了异常,就能对其进行处理,转而抛出的是翻译后的spring专属数据库异常,方便我们对异常进行排查处理)。


总结

@Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理 
@Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能 
@Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。 
@Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。 
@Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。 
用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。