Springboot的自动装配原理解析

一、@SpringBootApplication注解

该注解的作用是用来标识一个springboot应用程序的主启动类的,它也是springboot程序的启动入口。从源代码中可以发现,该注解内部也是有好多个注解加以标注的,包含:

@Target:表示该注解可以作用在哪里(如ElementType.TYPE表示该注解可以作用在类、接口、注解、枚举上)

@Retention:表示定义了Annotation保留的时间长短,换句话说就是被@Retention标注的注解的生存周期,其中主要有三种保留方针(.class / .source / .runtime)

@Documented:这个注解只是用来标注生成javadoc的时候是否会被记录

@Inherited:表示被 @Inherited 注解修饰的注解,如果作用于某个类上,其子类是可以继承的该注解的

@SpringBootConfiguration:表示一个配置类,其本质也是spring中的一个component,在启动类注解中标注也表达了通过该注解来加载IOC容器的配置,因为本质上springboot就是一个spring项目

@EnableAutoConfiguration:表示开启自动装配,它是starter的基础,也是springboot的核心。该注解是springboot进行自动装配的一个核心注解,就是它在背后默默的帮我们进行各种配置。

@ComponentScan:相当于xml配置文件中的<context:component-scan>, 它的主要作用就是扫描指定路径下的标识了需要装配的类,自动装配到spring的Ioc容器中。标识需要装配的类的形式主要是:@Component、@Repository、@Service、@Controller这类的注解标识的类。

但是,在我们对springboot自动装配原理的分析过程中,我们关注更多的是最后三个注解,特别是@EnableAutoConfiguration

 

二、SpringBoot自动装配的过程

 

  在springboot的自动装配中最重要的一个注解就是@EnableAutoConfiguration注解,它就是执行自动装配的主力军。我们单从名字就可以知道,它的意思是开启自动配置,故见名知意。

 

  根据我的理解它的简单流程是,首先利用其内部的注解@AutoConfigurationPackage内的@Import注解将Registrar.class的Class对象导入,在Registrar内主要做的一个事就是调用registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry),将主启动类所在包及其子包内的的所有组件扫描到spring容器,同时这个设置也解释了为什么程序所创建的controller / service / dao / entity等包一定要与主启动类位于同一个包内,不然程序会报错的原因。

 

  其次,通过进入注解@EnableAutoConfiguration内,会发现有一个导入注解@Import( {AutoConfigurationImportSelector.class} ),它的作用就是导入AutoConfigurationImportSelector的Class对象,并利用该类内部的一个获取配置导入过滤方法getAutoConfigurationImportFilters()来根据pom文件中加入的start等依赖来将一些需要的配置类灌入到spring容器(applicationContext)中。那么如何去找到相应的配置类呢,也就是一些XXXAutoConfiguration呢?其主要是进入到一个名为Maven: org.springframework.boot:spring-boot-autoconfigure的jar包内的spring-boot-autoconfigure的jar包下的META-INF/spring.factories内利用Spring框架提供的SpringFactoriesLoader这个特性去扫描对应的配置,如此便完成了springboot的装配功能。

 

  王福强说:“魔法”大体上是这样发生的: SpringBoot一旦发现@EnableAutoConfiguration, 那么就使用Spring框架提供的SpringFactoriesLoader这个特性去扫描当前应用classpath下所有META-INF/spring.factories元信息配置, 然后根据当前使用场景需要(如spring-boot-starter-web), 加载符合当前场景需要的配置类型并供当前或者后继流程使用, 对于@EnableAutoConfiguration的场景,就是提取以org.springframework.boot.autoconfigure.EnableAutoConfiguration作为key标志的一系列Java配置类,然后将这些Java配置类中的bean定义加载或者说灌入Spring容器中。

当然, EnableAutoConfiguration通过SpringFactoriesLoader筛选并加载进来的这些Java配置类里面,我们其实还可以进一步对要加载到容器的bean定义进行筛选, 这就会用Spring3系列引入的@Conditional“军团”, 通过像@ConditionalOnClass, @ConditionalOnMissingBean等具体的类型和条件来进一步决定加载还是不加载哪些bean定义。

 

  以上是对于springboot如何进行自动装配的一个分析,如果我们在面试中该如何去给面试官描述呢,其实不必这么细致。

 

  在面试中,我们可以这样说:

 

  Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

 

本文转载于网络 如有侵权请联系删除

相关文章

  • MySQL(4) 数据库增删改查SQL语句(整理集合大全)

    大家好,又见面了,我是你们的朋友全栈君。查看数据库showdatabases;复制使用数据库use数据库名;复制创建数据库CREATEDATABASE数据库名;复制删除数据库DROPDATABASE数据库名;复制创建表createtable表名( 列名1类型(长度)[约束], 列名2类型(长度)[约束], …… );复制长度区别 int类型带长度:不影响存取值,即使设定的值超出了长度的范畴,也能存,如果没有达到设定的长度,则使用空格自动填充到设定的长度 char类型:不可变字符,设定的长度就是规定当前字段能存的数据的最大长度,若超出长度,则会报错,若没有达到长度,使用空格填充到设定的长度 varchar:可变字符,设定的长度同样是规定当前字段能存的数据的最大长度,若超出长度,则会报错,若没有达到长度,不会使用空格填充,实际多长就是多长 删除表DROPTABLE表名;复制表约束1.非空约束NOTNULL 2.默认值约束DEFAULT'男' 3.唯一约束UNIQUE 4.主键约束PRIMARYKEY复制查看表结构DESC表名复制修改表 修改列名Altertable表名c

  • next()和nextLine()的区别详解

    大家好,又见面了,我是你们的朋友全栈君。//next()和nextLine()的区别详解 /*next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其过滤掉;只有在读取到有效字符之后,next()方法才将其后的空格键、Tab键或Enter键等视为结束符;所以next()方法不能得到带空格的字符串。 *//*nextLine()方法字面上有扫描一整行的意思,它的结束符只能是Enter键,即nextLine()方法返回的是Enter键之前没有被读取的所有字符,它是可以得到带空格的字符串的。 *///以下代码开始 packagejava_eight;importjava.util.Scanner;publicclassTest_nextLine{ publicstaticvoidmain(String[]args){ Scannerinput=newScanner(System.in);System.out.println(“请输入两个字符串作为next()的接收值”);/*参见下文输入输出图片

  • 面对企业众多的BI分析需求,该怎么办?

    企业需要规划一个BI项目,却不知道从何入手,各部门都有分析需求,数量众多且复杂。信息部门在规划一个完整的BI建设方案的时候颇具挑战性。这该怎么办?可以从以下几个角度并结合企业的实际情况来思考:第一,需求是企业高层提出来的。有时候需求是高层提出来的,所以他们对BI的需求不是从部门层面或者个人层面来看问题的。他们更多的是站在企业管理的角度,所以首先考虑的是分析的全面性。当需要全面综合分析时,就会涉及到多业务系统、多数据源、多部门、多组织的问题。在数据层面,需要打通各个业务系统的数据,要求数据范围完整。但是他们不会去看每个数据,只需要高度汇总的数据分析指标,所以在规划BI项目第一阶段的时候,重点是考虑高层领导需要关注的KPI指标,指标不一定多,但一定要精,通常可以固化这些指标。第二,需求是具体部门提出的。如果需求是某个具体部门提出的,主要考虑的是如何解决该部门的分析需求,比如财务部、销售部、采购部。这些部门通常有两个要求,一个是为部门的管理决策服务,另一个是为日常业务管理服务,例如通过BI实现日常报表工作的自动化和程序化,降低人工成本和时间成本。所以体现在数据层面,可能涉及的业务系统不多。比

  • 太强了,竟然可以根据指纹图像预测性别!

    重磅干货,第一时间送达在进入神经网络世界之前,让我们先谈一谈指纹?众所周知,没有两个人具有相同的指纹,但是我们可以建立一个CNN模型来从指纹图像中预测性别吗?让我们看看……在本文中,我们将创建一个可以根据指纹预测性别的卷积神经网络(CNN)模型。实现步骤•了解数据集•重新构造数据集(以便使用keras的Flow_from_directory函数)•定义一个简单的函数提取所需的特定标签•定义一个简单的函数读取图像、调整图像大小。•预处理训练和测试数据•从头开始构建简单的CNN模型•训练和测试模型注:如果你是CNN的新手?查看这篇文章以对它有一个很好的理解:https://www.freecodecamp.org/news/an-intuitive-guide-to-convolutional-neural-networks-260c2de0a050/•这篇文章假定您具有卷积神经网络(CNN)的知识。•该代码是在kaggle内核中执行的。它提供免费的GPU和RAM,不足之处是空间有限,但您可以轻松删除不需要的变量。数据集描述来自Kaggle的数据集,包含约55,000张人类指纹图像:htt

  • 脑波的分类

    脑波的分类人类的脑电图中脑波频率一般在0.5~30Hz,通常按照频率进行分类以表示各种成分。下面是国际上的分类标准。一般将比α波慢的δ波与θ波统称为慢波;而将比α波快的β波和γ波统称为快波。此外,对在特定条件下,如在病理情况下容易出现的与上述不相同的脑波,则按其波形特征及其所代表的意义分别予以命名,如棘波、尖慢综合波、顶尖波及三相波等。(8~13Hz)波频率为每秒8~13次,振幅为10~100V。主要分布于顶枕区,一般呈正弦波样,波是健康成人脑电波的基本节律(即脑电以波为主要成分),如果没有外加的刺激,其频率几乎恒定。在头部任何部位皆可记录到波,但以在枕区及顶区后部记录到的最为明显。在觉醒安静闭目状态时出现的数量最多且振幅也最高。当进入睡眠时,α波完全消失。清醒时睁开眼睛或注意力集中时其幅值降低,并由较高频率的β波代替。α波随脑发育成熟或年龄的变化而变化。对少儿,随着脑的发育α波数量逐渐增多,频率逐渐提高,至成年期趋于稳定,到老年期α波则逐渐变慢。可见α波的频率、振幅、和空域分布等因素是反应大脑机能状态的重要指标。睁眼、思考问题或接受其他刺激时,波立即消失而出现快波,此现象称为”波阻断

  • 十三.Linux文件共享服务 FTP,NFS 和 Samba

    Linux系统中,存储设主要有下面几种:DASDAS指DirectAttachedStorage,即直连附加存储,这种设备直接连接到计算机主板总线上,计算机将其识别为一个块设备,例如常见的硬盘,U盘等,这种设备很难做到共享。NASNAS指NetworkAreaStorage,它一般是将本地的存储空间共享给其他主机使用,一般通过C/S架构实现通信。它实现的是文件级别的共享,计算机通常将共享的设别识别为一个文件系统,其文件服务器会管理锁以实现并发访问。常见的NAS有NFS和CIFS。SANSAN指StorageAreaNetwork,它将传输网络模拟成SCSI总线来使用,每一个主机的网卡相当于SCSI总线中的initiator,服务器相当于一个或多个target,它需要借助客户端和服务端的SCSI驱动,通过FC或TCP/IP协议封装SCSI报文。它实现的是块级别的共享,通常被识别为一个块设备,但是需要借助专门的锁管理软件才能实现多主机并发访问。FTPFTP是一个文件传输的协议,客户端需要使用专门的ftp客户端与服务器端进行通信,以完成文件的上传和下载,FTP协议工作在应用层。它使用两个连接

  • synchronized(修饰方法和代码块)

    synchronized(修饰方法和代码块)1.含义synchronized是同步锁,用来实现互斥同步。在Java中,关键字synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作)。synchronized还可以保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代volatile功能,但是volatile更轻量,还是要分场景使用)。2.用法synchronized包括三种用法:修饰实例方法修饰静态方法修饰代码块2.1修饰实例方法所谓的实例对象锁就是用synchronized修饰实例对象中的实例方法,注意是实例方法不包括静态方法,如下:publicsynchronizedvoidincrease(){ i++; }复制2.2修饰静态方法当synchronized作用于静态方法时,其锁就是当前类的class对象锁。由于静态成员不专属于任何一个实例对象,是类成员,因此通过class对象锁可以控制静态成员的并发操作。需要注意的是如果一个线程A调用一个实例对象的非staticsynchr

  • loj#6074. 「2017 山东一轮集训 Day6」子序列(矩阵乘法 dp)

    题意题目链接Sol设\(f[i][j]\)表示前\(i\)个位置中,以\(j\)为结尾的方案数。转移的时候判断一下\(j\)是否和当前位置相同然后发现可以用矩阵优化,可以分别求出前缀积和逆矩阵的前缀积(这题的逆矩阵炒鸡好求)这样就可以\(n*10^3\)发现相邻两个矩阵只有一行不同,那么其他的可以直接copy。就可以做到\(n*10^2\)了。#include<bits/stdc++.h> #definePairpair<int,int> #defineMP(x,y)make_pair(x,y) #definefifirst #definesesecond #defineLLlonglong #defineullunsignedlonglong #defineFin(x){freopen(#x".in","r",stdin);} #defineFout(x){freopen(#x".out","w",stdout);} usingnamespacestd; constintMAXN=

  • 大公司最喜欢问的Java集合类面试题

    看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧。java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式。接口:CollectionCollection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。JavaSDK不提供直接继承自Collection的类,JavaSDK提供的类都是继承自Collection的“子接口”如List和Set。所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。主要的一个接口方法:booleanadd(Ojbec

  • string.length()与-1比较为什么会出现匪夷所思的结果

    今天调试程序发现了个匪夷所思的事情,-1与string.length()比较永远是-1大,看下面代码#include<iostream> #include<string> usingnamespacestd; intmain() { stringstr; str="123"; intnum=-1; //intlen=str.length(); if(num<str.length()) { cout<<"-1<str.length()"; } else { cout<<"-1>=str.length()"; } return0; }复制输出的结果是:-1>=str.length(),这看起来似乎很是离奇,改成下面的代码看看:#include<iostream> #include<string> usingnamespacestd; intmain() { stringstr; str="123"; intnum=-

  • 用winform应用程序登录网站的解决方案

    用winform应用程序登录网站的解决方案背景: 网站使用Membership机制来验证用户要求: c/s应用程序要用网站上的用户名和密码登录,同时在c/s端登录后,浏览网站时就无需再重复登录思路: 1。.net网站对用户是否登录的判断依据是:检查浏览器客户端是否存在有效的cookie验证票据,如果在c/s winform中登录的同时,能让用户浏览器生成验证票据,则实现在winform中登录后,浏览网站时无需再重复登录的问题得已解决具体操作:可在网站上建一个专用页面,功能为验证用户信息合法后,发放验证票据,然后在winform中登录成功后,模拟访问一下这个页面即可(注:经实践,不能用webRequest或webClient来实现,webRequest或webClient虽然可以达到用程序访问该页的效果,但并不能正确设置浏览器的cookie,正确的解决办法是在winform中放置一个webBrowser,让webBrowser来访问该页,这样就跟用户真正用浏览器浏览网页得到的效果才是一样的)2。再来看第二个问题,如何在winform中使用网站的MemberShip数据库,这里提供二种基本

  • Apache配置虚拟主机,关于403问题的解决

    大家好,又见面了,我是你们的朋友全栈君。安装wamp集成开发环境后,配置虚拟主机,在浏览器中输入虚拟主机的域名,出现403forbidden的错误.在以前的开发工作中就遇到过这种情况,之前一直困扰着我,通过网上搜索,终于解决了这个问题。出现这个问题的原因是目录访问权限没有设置。具体解决步骤如下:1打开apache配置文件httpd.conf,找到目录权限的语句<Directory/> OptionsFollowSymLinks AllowOverrideNone Orderdeny,allow Denyfromall </Directory>复制2将以上语句复制到配置虚拟主机的文件中,具体如下:<VirtualHost*:80> ServerAdmintest@biuuu.com DocumentRootE:/Web/Root/biuuu ServerNametest.biuuu.com ErrorLog“logs/dummy-host2.localhost-error.log” CustomLog“logs/dummy-host2.localhos

  • C#根据工作经验来谈谈面向对象

    C#面向对象的三大特性:封装、继承、多态。 这是一种特性,更是官方给我们的学习语法,但是我们根据过去的经验来思考一下, 到底什么是面向对象? 面向对象在我们实际开发中到底起着什么作用? 我们什么时候要用面向对象,他真的为我们解决了什么? 假如不用面向对象行不行? 下面我们来逐步分析一下:   到底什么是面向对象? 提到面向对象时,我们不得不提一下面向过程,面向过程典型的代表就是:C语言开发。 C语言是面向过程,执行顺序由前到后,逻辑表达比较清晰,相对而言,这种逻辑开发更加符合我们日常的思维方式,因为我们平时做事也是按顺序思考;正因为符合我们的日常思维方式,优点:更容易理解,减少了反复实例化的过程,内存认知能力更快,因为不管什么语言都要最终编译成机器码(也就是二进制01)来处理,既然我没有那么多对象,所以本身资源分配会高;缺点:后期维护性和复用性降低,为什么呢,因为我就是按顺序执行的,你怎么让我复用,你要维护时,是不是也得从前向后去找我。 举个例子:比如我们在编写C时,我的入口主方法: #include"stdafx.h" #include<stdio.h

  • 英语词汇替换词

    夸大:exaggerate替换词:overstate 抵消:counteract替换词:offset,cancelout 拆除:teardown替换词:knockdown,pulldown 加速:accelerate替换词:speedup,precipitate 占优势:predominate替换词:dominate 分辨:distinguish替换词:differentiate,discern 开展:launch替换词:conduct,carryout 承担:assume替换词:shoulder,accept 颁布,制定:enact替换词:enforce,promulgate,mapout 影响:influence替换词:impact,pervade 差异:difference替换词:distinction,gap 交流:communicate替换词:exchange,associate 接触:haveaccessto替换词:makecontactwith,keepintouchwith 优先:givepriorityto替换词:put…intofirstplace 节约:econo

  • Filter配置两种方式

    过滤器配置 xml文件配置 <filter> <filter-name>helloFilter</filter-name> <filter-class>com.hwua.filter.HelloFilter</filter-class> </filter> <filter-mapping> <filter-name>helloFilter</filter-name> <url-pattern>/alter.jsp</url-pattern> <!--过滤请求过来的页面--> <dispatcher>REQUEST</dispatcher> <!--过滤转发过来的页面--> <dispatcher>FORWARD</dispatcher> <!--过滤动态导入的页面--> <dispatcher>INCLUDE</dispatcher> <

  • Java JDBC概要总结一(基本操作和SQL注入问题)

    JDBC定义:JDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。 JDBC规范(掌握四个核心对象): DriverManager类:用于注册驱动(管理控制驱动程序) Connection:表示与数据库创建的连接 Statement:操作数据库sql语句的对象 ResultSet:结果集或一张虚拟表(查询结果返回ResultSet集) JDBC案例实现 @Test //查询所有的分类信息 publicvoiddemo1()throwsException{    //注意:使用JDBC规范,采用都是java.sql包下的内容    //1注册驱动    Class.forName("com.mysql.jdbc.Driver");    //2获得连接   &nb

  • ProgressBar.js – 漂亮的响应式 SVG 进度条

    ProgressBar.js是一个借助动态SVG路径的漂亮的,响应式的进度条效果。使用 ProgressBar.js 可以很容易地创建任意形状的进度条。这个 JavaScript 库提供线条,圆形和方形等几个内置的形状,但你可使用 Illustrator或任何其它的矢量图形编辑器创建自己的进度条效果。     在线演示    插件下载   线条进度条: 1 2 3 4 5 var line=new ProgressBar.Line('#example-line-container',{     color:'#FCB03C' });   line.animate(1); 圆形进度条: 1 2 3 4 5 6 7 8 9 var circle=new ProgressBar.Circle('#example-circle-c

  • (原创)select测试用例(TPC-H)

    在select测试中,我们需要覆盖select中各种支持语法等,因此进行了TPC-H的select优化以此来满足测试需求,主要优化的内容为:8张表,每张表插入的数据为5条,22个查询SQL,每个SQL至少能查询出一条测试结果。 创建8张表的SQL #create8tables CREATETABLE`customer`( `C_CUSTKEY`int(11)NOTNULL, `C_NAME`varchar(25)NOTNULL, `C_ADDRESS`varchar(40)NOTNULL, `C_NATIONKEY`int(11)NOTNULL, `C_PHONE`char(15)NOTNULL, `C_ACCTBAL`decimal(15,2)NOTNULL, `C_MKTSEGMENT`char(10)NOTNULL, `C_COMMENT`varchar(117)NOTNULL, PRIMARYKEY(`C_CUSTKEY`) )ENGINE=innodbDEFAULTCHARSET=utf8mb4; CREATETABLE`lineitem`( `L_ORDERKEY`in

  • struts.xml配置详解 内部资料 请勿转载 谢谢合作

    1、<include> 利用include标签,可以将一个struts.xml配置文件分割成多个配置文件,然后在struts.xml中使用<include>标签引入其他配置文件。 比如一个网上购物程序,可以把用户配置、商品配置、订单配置分别放在3个配置文件user.xml、goods.xml和order.xml中,然后在struts.xml中将这3个配置文件引入: struts.xml: 1 2 3 4 5 6 7 8 9 10 <?xml version="1.0"encoding="UTF-8"?> <!DOCTYPE strutsPUBLIC     "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"     "http://struts.apache.org/dtds/struts-2.0.dtd">   <struts>

  • ES6之数值Number新特性

    文章目录 Number.isNaN函数Number.isFinite函数Number.parseInt函数Number.parseFloat函数Number.isInteger函数Math.trunc函数Math.sign函数Math.cbrt函数极小常量安全整数 Number.isNaN函数 传统的isNaN函数会把非数值的参数转化成数值再进行判断,而Number.isNaN只对数值类型有效,非数值类型的参数一律返回false。当返回false的时候,不一定就是一个数值,有可能是一个非数值类型的参数。 isNaN('abc');//结果:true //'abc'无法转为一个数值,返回true Number.isNaN('abc');//结果:false //'abc'是字符串,Number.isNaN不做类型转换,直接返回false 复制 Number.isFinite函数 Number.isFinite函数:用来检查一个数值是否非无穷。注意第二行代码的参数:Infinity,Infinity是window对象下的一个常量,表示一个无穷数。所以第二行代码会返回

  • kubernetes资源管理

    一、资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。 kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。 Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。 当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统。 学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作。 二、资源管理方式 (一)命令式对象管理 1、kubectl命令 kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下:

相关推荐

推荐阅读