国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot:詳解Bean裝配

這篇具有很好參考價值的文章主要介紹了SpringBoot:詳解Bean裝配。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

SpringBoot:詳解Bean裝配,# 深入淺出SpringBoot,spring boot,java,后端,軟件工程,容器,IOC,Bean

??浩澤學編程:個人主頁

??? 推薦專欄:《SpringBoot從官方文檔學習》《java項目分享》
??????????????《RabbitMQ》《Spring》《SpringMVC》
??學無止境,不驕不躁,知行合一


前言

IoC((Inversion of Control,控制反轉(zhuǎn))容器是 Spring 的核心,可以說 Spring 是一種基于 IoC容器編程的框架。因為Spring Boot 是基于注解的開發(fā) Spring IoC, 所以我們就從全注解的方式來講訴Bean裝配。


一、IoC容器的簡介

Spring IoC 容器是一個管理 Bean 的容器,在 Spring 的定義中,它要求所有的 IoC 容器都需要實現(xiàn)接口 BeanFactory,它是一個頂級容器接口。 我們從源碼講訴。

BeanFactory接口源碼

package org.springframework.beans.factory;

import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;

public interface BeanFactory {
	// 前綴
    String FACTORY_BEAN_PREFIX = "&";
	
	// 多個getBean方法
    Object getBean(String name) throws BeansException;

    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    Object getBean(String name, Object... args) throws BeansException;

    <T> T getBean(Class<T> requiredType) throws BeansException;

    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
	
	// 是否包含Bean
    boolean containsBean(String name);
	
	//是否單例
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
	
	// 是否原型
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
	
	// 是否類型匹配
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
	
	// 獲取Bean的類型
    @Nullable
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
	
	// 獲取Bean的別名
    @Nullable
    Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;

    String[] getAliases(String name);
}

分析:

  • 上訴源碼中加入了中文注釋,通過它們就可以理解這些方法的含義。
  • 這里值得注意的是接口中的幾個方法:
    • 首先我們看到了多個getBean 方法,這也是IoC 容器最重要的方法之一, 它的意義是從IoC 容器中獲取Bean而從多個getBean方法中可以看到有按類型(bytype)獲取Bean 的,也有按名稱(by name)獲取 Bean 的,這就意味著在 Spring IoC 容器中,允許我們按類型或者名稱獲取 Bean。這對理解后面將講到的Spring 的依賴注入(Dependency Injection, DI) 是十分重要的。
    • isSingleton 方法則判斷 Bean 是否在 Spring IoC 中為單例。這里需要記住的是在 Spring IoC 容器中,默認的情況下, Bean 都是以單例存在的,也就是使用 getBean 方法返回的都是同一個對象。與isSingleton 方法相反的是 isPrototype 方法,如果它返回的是 true,那么當我們使用 getBean 方法獲取Bean 的時候, Spring IoC 容器就會創(chuàng)建一個新的 Bean 返回給調(diào)用者。

由于BeanFactory 的功能還不夠強大,因此 Spring 在 BeanFactory 的基礎(chǔ)上, 還設(shè)計了一個更為高級的接口 ApplicationContext。 它是 BeanFactory 的子接口之一, 在 Spring 的體系中 BeanFactoryApplicationContext 是最為重要的接口設(shè)計,在現(xiàn)實中我們使用的大部分 Spring IoC 容器是ApplicationContext 接口的實現(xiàn)類。

SpringBoot:詳解Bean裝配,# 深入淺出SpringBoot,spring boot,java,后端,軟件工程,容器,IOC,Bean

  • 在圖中可以看到, ApplicationContext 接口通過繼承上級接口,進而繼承 BeanFactory 接口, 但是在BeanFactory 的基礎(chǔ)上,擴展了消息國際化接口(MessageSource)、環(huán)境可配置接口 (EnvironmentCapable)、應(yīng)用事件發(fā)布接口(ApplicationEventPublish巳r) 和資源模式解析接口(ResourcePatternResolver),所以它的功能會更為強大。
  • 在Spring Boot 當中我們主要是通過注解來裝配Bean到 Spring IoC 容器中,為了貼近 SpringBoot 的需要, 這里不再介紹與 XML 相關(guān)的 IoC 容器,而主要介紹一個基于注解的 IoC 容器,它就是AnnotationConfigApplicationContext,從名稱就可以看出它是一個基于注解的 IoC 容器。 之所以研究它, 是因為Spring Boot 裝配和獲取 Bean 的方法與它如出一轍。

例:創(chuàng)建一個User類,然后使用AnnotationConfigApplicationContext構(gòu)建IoC容器

public class User {
	private Long id; 
	private String userName; 
/**setter and getter **/ 
}
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Con f工guration ;
import com.springboot.chapter3.po] o.User;
@Configuration 
public class AppConfig { 
	@Bean(name =”user” } 
	public User ini tUser () { 
		User user= new User (); 
		user. set Id (1L) ; 
		user.setUserName (”aa”); 
		return user;
	}
}

@Configuration 代表這是一個 Java 配置文件, Spring 的容器會根據(jù)它來生成IoC 容器去裝配Bean;@Bean 代表將 initUser 方法返回的 POJO 裝配到 IoC 容器中,而其屬性name 定義這個 Bean 的名稱,如果沒有配置它,則將方法名稱“initUser”作為 Bean 的名稱保存到Spring IoC 容器中。

import org.apache. log4j .Logger; 
import org. springframework.context.ApplicationContext; 
import org. springframework.context annotation.AnnotationConfigApplicat工onContext;
import com.springboot.chapter3.po] o .User;
public class IoCTest { 
	private static Logger log= Logger.getLogger(IoCTest.class); 
	publ工c static 飛roid main (String [] args) { 
		ApplicationContext ctx = new AnnotationConfigApplcationContext(AppConfig. class);
 		User user= ctx.getBean(User.class); 
	}
}

代碼中將Java 配置文件 AppConfig 傳遞給 AnnotationConfigApplicationContext 的構(gòu)造方法,這樣它就能夠讀取配置了。然后將配置里面的Bean裝配到IoC容器中,于是可以使用 getBean方法獲取對應(yīng)的POJO。

二、Bean裝配

掃描裝配

上訴講訴的User對象裝配就是使用@Bean裝配。但是如果一個個的 Bean 使用注解@Bean 注入 Spring loC 容器中,那將是一件很麻煩的事情。好在Spring 還允許我們進行掃描裝配 Bean 到 loC 容器中,對于掃描裝配而言使用的注解是@Component和@ComponentScan。@Component 是標明l哪個類被掃描進入 Spring IoC 容器,而ComponentScan則是標明采用何種策略去掃描裝配Bean。

@Component(”user") 
public class User { 
	@Value("1") 
	private Long id; 
	@Value("aa"} 
	private String userName; 
/**setter and getter **/ 
}

這里的注解@Component表明這個類將被SpringIoC 容器掃描裝配,其中配置的“user"則是作為Bean 的名稱,當然你也可以不配置這個字符串,那么IoC容器就會把類名第一個字母作為小寫,其他不變作為Bean 名稱放入到IoC 容器中;注解@Value則是指定具體的值,使得Spring IoC給予對應(yīng)的屬性注入對應(yīng)的值。為了讓SpringIoC 容器裝配這個類, 需要改造類AppConfig:

import org.springframework.context.annotaton.ComponentScan;
import org.springframework.context.annotation Configuration; 
@Configuration 
@ComponentScan 
public class AppConfig {
}

這里加入了@ComponentScan,意味著它會進行掃描,但是它只會掃描類AppConfig所在的當前包和其子包。也就是@ComponentScan默認掃描當前類所在包及其子包。 所以User類的位置要注意。

測試:

Applicat工onContext ctx = new AnnotationConfigApplicationContext{AppConfig.class) ;
User user= ctx.getBean(User.class); 
log. info(user.getid());

為了更加合理,@ComponentScan還允許我們自定義掃描的包,我們看一下源碼:

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.core.annotation.AliasFor;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
//在一個類中可重復定義
@Repeatable(ComponentScans.class)
public @interface ComponentScan {

	// 定義掃描的包
    @AliasFor("basePackages")
    String[] value() default {};
	
	//定義掃描的包
    @AliasFor("value")
    String[] basePackages() default {};
	
	//定義掃描的類
    Class<?>[] basePackageClasses() default {};
	
	//Bean name生成器
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
	
	//作用域解析器
    Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
	
	//作用域代理模式
    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
	
	//資源匹配模式
    String resourcePattern() default "**/*.class";
	
	//是否啟用默認的過濾器
    boolean useDefaultFilters() default true;
	
	//當滿足過濾器的條件時掃描
    Filter[] includeFilters() default {};
	
	//當不滿足過濾器的條件時掃描
    Filter[] excludeFilters() default {};
	
	//是否延遲初始化
    boolean lazyInit() default false;
	
	//定義過濾器
    @Retention(RetentionPolicy.RUNTIME)
    @Target({})
    public @interface Filter {
   		//過濾器類型,可以按注解類型或者正則式等過濾
        FilterType type() default FilterType.ANNOTATION;
		
		//定義過濾的類
        @AliasFor("classes")
        Class<?>[] value() default {};

        @AliasFor("value")
        Class<?>[] classes() default {};
		
		//匹配方式
        String[] pattern() default {};
    }
}

分析:

  • 首先可以通過配置項basePackages定義掃描的包名,在沒有定義的情況下,它只會掃描當前包和其子包下的路徑:還可以通過basePackageClasses 定義掃描的類;
  • 其中還有 includeFilters 和 excludeFilters, includeFilters 是定義滿足過濾器(Filter)條件的 Bean 才去掃描, excludeFilters 則是排除過濾器條件的 Bean,它們都需要通過一個注解@Filter 去定義,它有一個type 類型,這里可以定義為注解或者正則式等類型。 classes定義注解類, pattern 定義正則式類

所以得出三個掃描路徑表示:

@ComponentScan ("com.springboot.example.* ")
@ComponentScan(basePackages = {"com.springboot.example.pojo"})
@ComponentScan(basePackageClasses = {User.class} ) 

以及排除掃描包或類,讓其不被裝配:

//掃描example下所有包除了@Service裝配的類
//這樣,由于加入了 excludeFilters 的配置,使標注了@Service 的類將不被 IoC 容器掃描注入,這樣就可以把它類排除到 Spring IoC容器中了。
@ComponentScan(basePackages = {"com.dragon.restart"},excludeFilters = {@ComponentScan.Filter(classes = Service.class)})

探索啟動類

事實上,之前在 Spring Boot 的注解@SpringBootApplication 也注入了@ComponentScan,這里不妨探索其源碼:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
//自定義排除的掃描類
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
	//通過類型排除自動配置
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};
	//通過名稱排除自動配置類
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};
	//定義掃描包
    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};
	//定義被掃描的類
    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};

顯然,通過它就能夠定義掃描哪些包。但是這里需要特別注意的是,它提供的exclude和excludeName兩個方法是對于其內(nèi)部的自動配置類才會生效的。為了能夠排除其他類,還可以再加入@ComponentScan以達到我們的目的。

條件裝配

  • 例如在數(shù)據(jù)庫連接池的配置中漏掉一些配置會造成數(shù)據(jù)源不能連接上。 在這樣的情況下, IoC容器如果還進行數(shù)據(jù)源的裝配, 則系統(tǒng)將會拋出異常,導致應(yīng)用無法繼續(xù)。這時倒是希望IoC容器不去裝配數(shù)據(jù)源。
  • 為了處理這樣的場景, Spring 提供了@Conditional注解幫助我們,而它需要配合另外一個接口Condition(org.springframework.context.annotation.Condition )來完成對應(yīng)的功能。

裝配的Bean:

@Bean(name = "dataSource", destroyMethod = "close" ) 
@Conditional(DatabaseConditional.class)
public DataSource getDataSource ( 
@Value("${database.driverName}") String driver, 
@Value("${database.url}") String url, 
@Value("${database.username}") String username, 
@Value("{database.password}") String password 
){ 
	Properties props= new Properties(); 
	props.setProperty("driver", driver); 
	props setProperty("url", url); 
	props.setProperty("username", username); 
	props setProperty("password", password); 
	DataSource dataSource = null; 
	try { 
		dataSource = BasicDataSourceFactory.createDataSource(props) ; 
	) catch (Exception e) { 
		e.printStackTrace();
	}
	return dataSource;
}

自定義DatabaseConditional類:

public class DatabaseConditional implements Condition { 
/**
* 數(shù)據(jù)庫裝配條件
* 
* @param context 條件上下文
* @param metadata 注釋類型的元數(shù)據(jù)
* @return true 裝配 Bean,否則不裝配
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
	//取出環(huán)境配置
	Environment env = context.getEnvironment(); 
	//判斷屬性文件是否存在對應(yīng)的數(shù)據(jù)庫配置
	return env.containsProperty(”database.driverName” ) 
		&& env.containsProperty(”database.url”) 
		&& env.containsProperty(” database.username”) 
		&& env.containsProperty (”database.password");

matches 方法首先讀取其上下文環(huán)境, 然后判定是否已經(jīng)配置了對應(yīng)的數(shù)據(jù)庫信息。這樣,當這些都己經(jīng)配置好后則返回true。這個時候Spring會裝配數(shù)據(jù)庫連接池的Bean,否則是不裝配的。

自定義Bean

  • 現(xiàn)實的Java 的應(yīng)用往往需要引入許多來自第三方的包, 并且很有可能希望把第三方包的類對象也放入到Spring IoC 容器中,這時@Bean注解就可以發(fā)揮作用了。
  • 例如,要引入一個DBCP數(shù)據(jù)源,我們先在pom.xml上加入項目所需要DBCP包和數(shù)據(jù)庫MySQL驅(qū)動程序的依賴。
<dependency> 
	<groupid>org.apache.commons</groupid> 
	<artifactid>commons-dbcp2</artifactid> 
</dependency> 
<dependency> 
	<groupid>mysql</groupid> 
	<artifactid>mysql-connector-ava</artifactid>
</dependency>

這樣 DBCP 和數(shù)據(jù)庫驅(qū)動就被加入到了項目中,接著將使用它提供的機制來生成數(shù)據(jù)源:

@Bean(name = "dataSource") 
@Conditional(DatabaseConditional.class)
public DataSource getDataSource (){ 
	Properties props= new Properties(); 
	props.setProperty("driver", driver); 
	props setProperty("url", url); 
	props.setProperty("username", username); 
	props setProperty("password", password); 
	DataSource dataSource = null; 
	try { 
		dataSource = BasicDataSourceFactory.createDataSource(props) ; 
	) catch (Exception e) { 
		e.printStackTrace();
	}
	return dataSource;
}

這里通過@Bean 定義了其配置項 name 為“dataSource“,那么 Spring 就會把它返回的對象用名稱“dataSource” 保存在 loC 容器中。當然, 你也可以不填寫這個名稱,那么它就會用你的方法名稱作為Bean 名稱保存到 IoC 容器中。通過這樣,就可以將第三方包的類裝配到SpringIoC容器中了。


總結(jié)

以上就是SpringBoot的Bean裝配的詳細講解。文章來源地址http://www.zghlxwxcb.cn/news/detail-778063.html

到了這里,關(guān)于SpringBoot:詳解Bean裝配的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Spring5深入淺出篇:Spring與工廠設(shè)計模式簡介

    Spring5深入淺出篇:Spring與工廠設(shè)計模式簡介

    輕量級 JavaEE的解決?案 spring實際上就是對原有設(shè)計模式的一種高度封裝和整合 整合設(shè)計模式 工廠設(shè)計模式 什么是工廠設(shè)計模式 當UserServiceImpl發(fā)生變化是會影響到userService等相關(guān)聯(lián)的類,在線上環(huán)境不利于維護

    2024年01月18日
    瀏覽(33)
  • MVCC詳解,深入淺出簡單易懂

    MVCC詳解,深入淺出簡單易懂

    一、什么是MVCC? mvcc,也就是多版本并發(fā)控制,是為了在讀取數(shù)據(jù)時不加鎖來提高讀取效率和并發(fā)性的一種手段。 數(shù)據(jù)庫并發(fā)有以下幾種場景: 讀-讀:不存在任何問題。 讀-寫:有線程安全問題,可能出現(xiàn)臟讀、幻讀、不可重復讀。 寫-寫:有線程安全問題,可能存在更新丟

    2024年02月04日
    瀏覽(22)
  • 【深入淺出Spring Security(三)】默認登錄認證的實現(xiàn)原理

    【深入淺出Spring Security(三)】默認登錄認證的實現(xiàn)原理

    由默認的 SecurityFilterChain 為例(即表單登錄),向服務(wù)器請求 /hello 資源Spring Security 的流程分析如下: 請求 /hello 接口,在引入 Spring Security 之后會先經(jīng)過一系列過濾器(一中請求的是 /test 接口); 在請求到達 FilterSecurityInterceptor 時,發(fā)現(xiàn)請求并未認證。請求被攔截下來,并

    2024年02月09日
    瀏覽(30)
  • 深入淺出之Docker Compose詳解

    深入淺出之Docker Compose詳解

    目錄 1.Docker Compose概述 1.1 Docker Compose 定義 1.2 Docker Compose產(chǎn)生背景 1.3 Docker Compose 核心概念 1.4 Docker Compose 使用步驟 1.5 Docker Compose 常用命令 ? 2. Docker Compose 實戰(zhàn) 2.1 Docker Compose下載和卸載 2.2 Docker Compose 項目概述 2.3?Docker Compose 編排字段部分詳解 2.3.1 version 2.3.2 services 2.3.3 bui

    2024年02月08日
    瀏覽(23)
  • 深入淺出:Python內(nèi)存管理機制詳解

    深入淺出:Python內(nèi)存管理機制詳解

    隨機存取存儲器(Random Access Memory,RAM) :是計算機中用于臨時存儲數(shù)據(jù)的一種硬件組件。它是計算機的主要內(nèi)存之一,用于存儲正在運行的程序和操作系統(tǒng)所需的數(shù)據(jù)。 主要特點: 臨時存儲 :RAM 存儲的數(shù)據(jù)是臨時的,意味著當計算機關(guān)閉或重啟時,其中的數(shù)據(jù)會被清空。

    2024年02月04日
    瀏覽(18)
  • 【深入淺出 Spring Security(七)】RememberMe的實現(xiàn)原理詳講

    【深入淺出 Spring Security(七)】RememberMe的實現(xiàn)原理詳講

    先看看最簡單用法的默認頁面效果變化。 SecurityConfig 配置類 測試 TestController 代碼 以下是給出的默認的登錄頁面。 觀察頁面源代碼可以發(fā)現(xiàn),比原先沒配置 RememberMe 之前多了個 name 為 remember-me 的 checkbox 選項。 如果我們勾選了它并且登錄成功后,當我們關(guān)閉掉當前瀏覽器,

    2024年02月09日
    瀏覽(25)
  • 【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄

    【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄

    (Github授權(quán)登錄的具體操作在目錄第三“章”) 下面是《深入淺出Spring Security》書中的一段概述: OAuth 是一個開放標準(現(xiàn)在所說的 OAuth 一般都是指 OAuth2,即 2.0 版本),可以理解為是一種協(xié)議,該標準允許用戶讓第三方應(yīng)用訪問該用戶在某一網(wǎng)站上存儲的私密資源(如頭

    2024年02月10日
    瀏覽(33)
  • 【深入淺出Spring原理及實戰(zhàn)】「源碼調(diào)試分析」深入源碼探索Spring底層框架的的refresh方法所出現(xiàn)的問題和異常

    閱讀Spring官方文檔,了解Spring框架的基本概念和使用方法。 下載Spring源碼,可以從官網(wǎng)或者GitHub上獲取。 閱讀Spring源碼的入口類,了解Spring框架的啟動過程和核心組件的加載順序。 閱讀Spring源碼中的注釋和文檔,了解每個類和方法的作用和用法。 調(diào)試Spring源碼,可以通過

    2023年04月23日
    瀏覽(33)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法篇】深入淺出——二叉樹(詳解)

    【數(shù)據(jù)結(jié)構(gòu)與算法篇】深入淺出——二叉樹(詳解)

    ???內(nèi)容專欄:《數(shù)據(jù)結(jié)構(gòu)與算法專欄》 ??本文概括: 二叉樹是一種常見的數(shù)據(jù)結(jié)構(gòu),它在計算機科學中廣泛應(yīng)用。本博客將介紹什么是二叉樹、二叉樹的順序與鏈式結(jié)構(gòu)以及它的基本操作,幫助讀者理解和運用這一重要概念。 ??本文作者: 花 蝶 ??發(fā)布時間:2023.6.5

    2024年02月08日
    瀏覽(23)
  • 【C++深入淺出】STL之string用法詳解

    【C++深入淺出】STL之string用法詳解

    目錄 一. 前言 二. STL概要 2.1 什么是STL 2.2 STL的六大組件 2.3 STL的缺陷 三. string類概述 3.1 什么是string類 3.2 為什么要使用string類 四. string類的使用 4.1 包含頭文件 4.2 構(gòu)造函數(shù) 4.3 賦值運算符重載 4.4 容量操作 4.5 訪問/遍歷操作 4.6 查找修改操作 4.7 子串操作 ?4.8 非成員函數(shù) ?

    2024年02月05日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包