您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

关于 Spring 注解容器配置的那些事,掌握这几点,不再难

时间:2022-04-18 11:11:22  来源:  作者:辗转难眠

无论选择是什么,Spring 都能容纳这两种风格,甚至可以将它们混合在一起。值得指出的是,通过它的 JAVA 配置选项,Spring 允许注解以一种非入侵的方式使用,不触碰目标组件源码和那些工具,所有的配置风格由 Spring 工具套件支持。

 

基于注解的配置提供了一种 XML 设置的可替代方式,它依赖于字节码元数据来连接组件,而不是用尖括号声明的方式。代替使用 XML 来描述 bean 连接,开发者通过将注解使用在相关的类,方法或字段声明中,将配置移动到了组件类本身的内部。正如在“Example: The
RequiredAnnotationBeanPostProcessor”那节提到的那样,使用BeanPostProcessor与注解结合是扩展 Spring IoC 容器的的常见方法。例如,Spring 2.0 引入了@Required注解来执行需要的属性的可能性。Spring 2.5 使以同样地通用方法来驱动 Spring 的依赖注入变为可能。本质上来说,@Autowired提供了如 3.4.5 小节描述的同样的能力。“Autowiring collaborators”但更细粒度的控制和更广的应用性。Spring 2.5 也添加对 JSR-250 注解的支持,例如,@PostConstruct和@PreDestroy

 

。Spring 3.0 添加了对 JSR-330,包含在javax.inject包内的注解(Java 的依赖注入)的支持,例如@Inject和@Named。关于这些注解的细节可以在相关的小节找到。

 

注解注入在 XML 注入之前进行,因此对于通过两种方法进行组装的属性后者的配置会覆盖前者。

 

跟以前一样,你可以作为单独的 bean 定义来注册它们,但也可以通过在一个基于 XML 的 Spring 配置(注入包含上下文命名空间)中包含下面的标签来隐式的注册它们:

<?xml version="1.0" encoding="UTF-8"?>

 

<beans xmlns="http://www.springframework.org/schema/beans"

 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 

xmlns:context="http://www.springframework.org/schema/context"

 

xsi:schemaLocation="http://www.springframework.org/schema/beans

 

http://www.springframework.org/schema/beans/spring-beans.xsd

 

http://www.springframework.org/schema/context

 

http://www.springframework.org/schema/context/spring-context.xsd">

 

context:annotation-config/

 

</beans>

(隐式注册的后处理器包括
AutowiredAnnotationBeanPostProcessor,
CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor和前面提到的
RequiredAnnotationBeanPostProcessor。)

 

<
context:annotation-config/>仅在定义它的同样的应用上下文中寻找注解的 beans。这意味着,如果你在一个为DispatcherServlet服务的WebApplicationContext中放置了<context:annotation-config/>,它只能在你的控制器中寻找@Autowired注解的 beans,而不是在你的服务层中。更多信息请看 18.2 小节,“The DispatcherServlet”。

3.9.1 @Required

@Required注解应用到 bean 属性的 setter 方法上,例子如下:

public class SimpleMovieLister {



private MovieFinder movieFinder;



@Required



public void setMovieFinder(MovieFinder movieFinder) {



this.movieFinder = movieFinder;



}



// ...



}

这个注解仅仅是表明受影响的 bean 属性必须在配置时通过显式的 bean 定义或自动组装填充。如果受影响的 bean 属性没有填充,容器会抛出一个异常,这允许及早明确的失败,避免NullPointerExceptions或后面出现类似的情况。仍然建议你在 bean 类本身加入断言,例如,加入到初始化方法中。这样做可以强制这些需要的引用和值,甚至是你在容器外部使用这个类的时候。

2 @Autowired

 

===========================================================================

 

在下面的例子中 JSR 330 的@Inject注解可以用来代替 Spring 的@Autowired注解。

 

你可以将@Autowired注解应用到构造函数上。

public class MovieRecommender {



private final CustomerPreferenceDao customerPreferenceDao;



@Autowired



public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {



this.customerPreferenceDao = customerPreferenceDao;



}



// ...



}

从 Spring 框架 4.3 起,如果目标 bena 仅定义了一个构造函数,那么@Autowired注解的构造函数不再是必要的。如果一些构造函数是可获得的,至少有一个必须要加上注解,以便于告诉容器使用哪一个。

 

正如预料的那样,你也可以将@Autowired注解应用到“传统的”setter 方法上:

public class SimpleMovieLister {



private MovieFinder movieFinder;



@Autowired



public void setMovieFinder(MovieFinder movieFinder) {



this.movieFinder = movieFinder;



}



// ...



}

你也可以应用注解到具有任何名字和/或多个参数的方法上:

public class MovieRecommender {



private MovieCatalog movieCatalog;



private CustomerPreferenceDao customerPreferenceDao;



@Autowired



public void prepare(MovieCatalog movieCatalog,



CustomerPreferenceDao customerPreferenceDao) {



this.movieCatalog = movieCatalog;



this.customerPreferenceDao = customerPreferenceDao;



}



// ...



}

你也可以应用@Autowired到字段上,甚至可以与构造函数混合用:

public class MovieRecommender {



private final CustomerPreferenceDao customerPreferenceDao;



@Autowired



private MovieCatalog movieCatalog;



@Autowired



public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {



this.customerPreferenceDao = customerPreferenceDao;



}



// ...



}

通过给带有数组的字段或方法添加@Autowired注解,也可以从ApplicationContext中提供一组特定类型的 bean:

public class MovieRecommender {



@Autowired



private MovieCatalog[] movieCatalogs;



// ...



}

同样也可以应用到具有同一类型的集合上:

public class MovieRecommender {



private Set<MovieCatalog> movieCatalogs;



@Autowired



public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {



this.movieCatalogs = movieCatalogs;



}



// ...



}

如果你希望数组或列表中的项按指定顺序排序,你的 bean 可以实现
org.springframework.core.Ordered接口,或使用@Order或标准@Priority注解。

 

只要期望的 key 是String,那么类型化的 Maps 就可以自动组装。Map 的值将包含所有期望类型的 beans,key 将包含对应的 bean 名字:

public class MovieRecommender {



private Map<String, MovieCatalog> movieCatalogs;



@Autowired



public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {



this.movieCatalogs = movieCatalogs;



}



// ...



}

默认情况下,当没有候选 beans 可获得时,自动组装会失败;默认的行为是将注解的方法,构造函数和字段看作指明了需要的依赖。这个行为也可以通过下面的方式去改变。

public class SimpleMovieLister {



private MovieFinder movieFinder;



@Autowired(required=false)



public void setMovieFinder(MovieFinder movieFinder) {



this.movieFinder = movieFinder;



}



// ...



}

每个类只有一个构造函数可以标记为必需的,但可以注解多个非必需的构造函数。在这种情况下,会考虑这些候选者中的每一个,Spring 使用最贪婪的构造函数,即依赖最满足的构造函数,具有最大数目的参数。

 

建议在@Required注解之上使用@Autowired的required特性。required特性表明这个属性自动装配是不需要的,如果这个属性不能被自动装配,它会被忽略。另一方面@Required是更强大的,在它强制这个属性被任何容器支持的 bean 设置。如果没有值注入,会抛出对应的异常。

 

你也可以对那些已知的具有可解析依赖的接口使用@Autowired:BeanFactory,ApplicationContext,Environment, ResourceLoader,ApplicationEventPublisher和MessageSource。这些接口和它们的扩展接口,例如
ConfigurableApplicationContext或ResourcePatternResolver,可以自动解析,不需要特别的设置。

public class MovieRecommender {



@Autowired



private ApplicationContext context;



public MovieRecommender() {



}



// ...



}

@Autowired、@Inject、@Resource和@Value都是通过 Spring 的BeanPostProcessor实现处理的,这反过来意味着,你不能在自己的BeanPostProcessor或BeanFactoryPostProcessor中使用这些注解。

 

这些类型必须显式通过 XML 或使用 Spring 的@Bean方法来装配。

3 用 @Primary 微调基于注解的自动装配

因为根据类型的自动装配可能会导致多个候选目标,所以在选择过程中进行更多的控制经常是有必要的。一种方式通过 Spring 的@Primary注解来完成。当有个多个候选 bean 要组装到一个单值的依赖时,@Primary表明指定的 bean 应该具有更高的优先级。如果确定一个’primary’ bean 位于候选目标中间,它将是那个自动装配的值。

 

假设我们具有如下配置,将firstMovieCatalog定义为主要的MovieCatalog。

@Configuration



public class MovieConfiguration {



@Bean



@Primary



public MovieCatalog firstMovieCatalog() { ... }



@Bean



public MovieCatalog secondMovieCatalog() { ... }



// ...



}

根据这样的配置,下面的MovieRecommender将用firstMovieCatalog进行自动装配。

public class MovieRecommender {



@Autowired



private MovieCatalog movieCatalog;



// ...



}

对应的 bean 定义如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

context:annotation-config/

<bean class="example.SimpleMovieCatalog" primary="true">

</bean>

<bean class="example.SimpleMovieCatalog">

</bean>

<bean id="movieRecommender" class="example.MovieRecommender"/>

</beans>

3.9.4 微调基于注解且带有限定符的自动装配

当有多个实例需要确定一个主要的候选对象时,@Primary是一种按类型自动装配的有效方式。当需要在选择过程中进行更多的控制时,可以使用 Spring 的@Qualifier注解。为了给每个选择一个特定的 bean,你可以将限定符的值与特定的参数联系在一起,减少类型匹配集合。在最简单的情况下,这是一个纯描述性值:

public class MovieRecommender {



@Autowired



@Qualifier("mAIn")



private MovieCatalog movieCatalog;



// ...



}

@Qualifier注解也可以指定单个构造函数参数或方法参数:

public class MovieRecommender {



private MovieCatalog movieCatalog;



private CustomerPreferenceDao customerPreferenceDao;



@Autowired



public void prepare(@Qualifier("main")MovieCatalog movieCatalog,



CustomerPreferenceDao customerPreferenceDao) {



this.movieCatalog = movieCatalog;



this.customerPreferenceDao = customerPreferenceDao;



}



// ...



}

对应的 bean 定义如下。限定符值为”main”的 bean 被组装到有相同值的构造函数参数中。

<?xml version="1.0" encoding="UTF-8"?>



<beans xmlns="http://www.springframework.org/schema/beans"



xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"



xmlns:context="http://www.springframework.org/schema/context"



xsi:schemaLocation="http://www.springframework.org/schema/beans



http://www.springframework.org/schema/beans/spring-beans.xsd



http://www.springframework.org/schema/context



http://www.springframework.org/schema/context/spring-context.xsd">



context:annotation-config/



<bean class="example.SimpleMovieCatalog">



<qualifier value="main"/>



</bean

<bean class="example.SimpleMovieCatalog">

 

<qualifier value="action"/>

 

</bean>

 

<bean id="movieRecommender" class="example.MovieRecommender"/>

 

</beans>

对于回退匹配,bean 名字被认为是默认的限定符值。因此你可以定义一个 id 为main的 bean 来代替内嵌的限定符元素,会有同样的匹配结果。然而,尽管你可以使用这个约定根据名字引用特定的 beans,但是@Autowired从根本上来讲是使用可选的语义限定符来进行类型驱动注入的。这意味着限定符的值,即使回退到 bean 名称,总是缩小语义类型匹配的集合;它们没有从语义上将一个引用表达为一个唯一的 bean id。好的限定符值是”main”或”EMEA”或”persistent”,表达一个特定组件的性质,这个组件是独立于 bean id的,即使前面例子中像这个 bean 一样的匿名 bean 会自动生成 id。

 

正如前面讨论的那样,限定符也可以应用到类型结合上,例如,Set<MovieCatalog>。在这个例子中,根据声明的限定符匹配的所有 beans 作为一个集合进行注入。这意味着限定符不必是唯一的;它们只是构成过滤标准。例如,你可以定义多个具有同样限定符值”action”的MovieCatalog,所有的这些都将注入到带有注解@Qualifier("action")的Set<MovieCatalog>中。

 

如果你想通过名字表达注解驱动的注入,不要主要使用@Autowired,虽然在技术上能通过@Qualifier值引用一个 bean 名字。作为可替代产品,可以使用 JSR-250 @Resource注解,它在语义上被定义为通过组件唯一的名字来识别特定的目标组件,声明的类型与匹配过程无关。@Autowired有不同的语义:通过类型选择候选 beans,特定的String限定符值被认为只在类型选择的候选目标中,例如,在那些标记为具有相同限定符标签的 beans 中匹配一个”account”限定符。

 

对于那些本身定义在集合/映射或数组类型中的 beans 来说,@Resource是一个很好的解决方案,适用于特定的集合或通过唯一名字区分的数组 bean。也就是说,自 Spring 4.3 起,集合/映射和数组类型中也可以通过 Spring 的@Autowired类型匹配算法进行匹配,只要元素类型信息在@Bean中保留,返回类型签名或集合继承体系。在这种情况下,限定符值可以用来在相同类型的集合中选择,正如在前一段中概括的那样。

 

自 Spring 4.3 起,@Autowired也考虑自引用注入,例如,引用返回当前注入的 bean。注意自注入是备用;普通对其它组件的依赖关系总是优先的。在这个意义上,自引用不参与普通的候选目标选择,因此尤其是从不是主要的;恰恰相反,它们最终总是最低的优先级。在实践中,自引用只是作为最后的手段,例如,通过 bean 的事务代理调用同一实例的其它方法:在考虑抽出受影响的方法来分隔代理 bean 的场景中。或者,使用@Resource通过它的唯一名字可能得到一个返回当前 bean 的代理。

 

@Autowired可以应用到字段,构造函数和多参数方法上,允许通过限定符注解在参数层面上缩减候选目标。相比之下,@Resource仅支持字段和 bean 属性的带有单个参数的 setter 方法。因此,如果你的注入目标是一个构造函数或一个多参数的方法,坚持使用限定符。

 

你可以创建自己的定制限定符注解。简单定义一个注解,在你自己的定义中提供@Qualifier注解:

@Target({ElementType.FIELD, ElementType.PARAMETER})



@Retention(RetentionPolicy.RUNTIME)



@Qualifier



public @interface Genre {



String value();



}

然后你可以在自动装配的字段和参数上提供定制的限定符:

public class MovieRecommender {



@Autowired



@Genre("Action")



private MovieCatalog actionCatalog;



private MovieCatalog comedyCatalog;



@Autowired



public void setComedyCatalog(@Genre("Comedy") MovieCatalog comedyCatalog) {



this.comedyCatalog = comedyCatalog;



}



// ...



}

接下来,提供候选 bean 定义的信息。你可以添加<qualifier/>标记作为<bean/>标记的子元素,然后指定匹配你的定制限定符注解的类型和值。类型用来匹配注解的全限定类名称。或者,如果没有名称冲突的风险,为了方便,你可以使用简写的类名称。下面的例子证实了这些方法。

<?xml version="1.0" encoding="UTF-8"?>



<beans xmlns="http://www.springframework.org/schema/beans"



xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"



xmlns:context="http://www.springframework.org/schema/context"



xsi:schemaLocation="http://www.springframework.org/schema/beans



http://www.springframework.org/schema/beans/spring-beans.xsd



http://www.springframework.org/schema/context



http://www.springframework.org/schema/context/spring-context.xsd">



context:annotation-config/



<bean class="example.SimpleMovieCatalog">



<qualifier type="Genre" value="Action"/>



</bean>



<bean class="example.SimpleMovieCatalog">



<qualifier type="example.Genre" value="Comedy"/>



</bean>



<bean id="movieRecommender" class="example.MovieRecommender"/>



</beans>

在 3.10 小节,“类路径扫描和管理组件”中,你将看到一个基于注解的替代方法,在 XML 中提供限定符元数据。特别地,看 3.10.8 小节,“用注解提供限定符元数据”。

 

在某些情况下,使用没有值的注解就是足够的。当注解为了通用的目的时,这是非常有用的,可以应用到跨几个不同类型的依赖上。例如,当网络不可用时,你可以提供一个要搜索的离线目录。首先定义一个简单的注解:

@Target({ElementType.FIELD, ElementType.PARAMETER})

@Retention(RetentionPolicy.RUNTIME)

@Qualifier

public @interface Offline {

}

然后将注解添加到要自动装配的字段或属性上:

public class MovieRecommender {



@Autowired



@Offline



private MovieCatalog offlineCatalog;



// ...



}

现在 bean 定义只需要一个限定符类型:

<bean class="example.SimpleMovieCatalog">

 

<qualifier type="Offline"/>

 

</bean>

你也可以定义接收命名属性之外的定制限定符注解或代替简单的值属性。如果要注入的字段或参数指定了多个属性值,bean 定义必须匹配所有的属性值才会被认为是一个可自动装配的候选目标。作为一个例子,考虑下面的注解定义:

@Target({ElementType.FIELD, ElementType.PARAMETER})



@Retention(RetentionPolicy.RUNTIME)



@Qualifier



public @interface MovieQualifier {



String genre();



Format format();



}

这种情况下Format是枚举类型:

public enum Format {



VHS, DVD, BLURAY



}

要自动装配的字段使用定制限定符进行注解,并且包含了两个属性值:genre和format。

public class MovieRecommender {

 

@Autowired



Tags:Spring   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  Search: Spring  点击:(60)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  Search: Spring  点击:(41)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  Search: Spring  点击:(23)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  Search: Spring  点击:(93)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19  Search: Spring  点击:(90)  评论:(0)  加入收藏
Spring Boot2.0深度实践 核心原理拆解+源码分析
Spring Boot2.0深度实践:核心原理拆解与源码分析一、引言Spring Boot是一个基于Java的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用...【详细内容】
2024-01-15  Search: Spring  点击:(98)  评论:(0)  加入收藏
SpringBoot3+Vue3 开发高并发秒杀抢购系统
开发高并发秒杀抢购系统:使用SpringBoot3+Vue3的实践之旅随着互联网技术的发展,电商行业对秒杀抢购系统的需求越来越高。为了满足这种高并发、高流量的场景,我们决定使用Spring...【详细内容】
2024-01-14  Search: Spring  点击:(93)  评论:(0)  加入收藏
Spring Boot 3.0是什么?
Spring Boot 3.0是一款基于Java的开源框架,用于简化Spring应用程序的构建和开发过程。与之前的版本相比,Spring Boot 3.0在多个方面进行了改进和增强,使其更加易用、高效和灵活...【详细内容】
2024-01-11  Search: Spring  点击:(139)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11  Search: Spring  点击:(132)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  Search: Spring  点击:(130)  评论:(0)  加入收藏
▌简易百科推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  小白debug  微信公众号  Tags:Docker   点击:(15)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22    51CTO  Tags:Docker   点击:(13)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  云原生运维圈  微信公众号  Tags:容器   点击:(15)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  云原生运维圈  微信公众号  Tags:Docker   点击:(25)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01    简易百科  Tags:Kubernetes   点击:(176)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  匠心独运维妙维效  微信公众号  Tags:容器   点击:(51)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  waynblog  微信公众号  Tags:Docker   点击:(69)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  编程技术汇  今日头条  Tags:Docker   点击:(83)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04    Linux中国  Tags:Docker   点击:(127)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  云云众生s  微信公众号  Tags:Kubernetes   点击:(123)  评论:(0)  加入收藏
站内最新
站内热门
站内头条