偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

SpringBoot中這十個(gè)神仙功能,驚艷到我了!

開(kāi)發(fā) 前端
有些小伙伴在工作中可能遇到過(guò)這樣的場(chǎng)景:不同環(huán)境需要加載不同的Bean配置。傳統(tǒng)的做法是用@Profile,但@Conditional提供了更靈活的控制能力。

前言

我們每天都在用SpringBoot,但可能只用到了它20%的功能。

今天我要分享那些讓開(kāi)發(fā)效率提升數(shù)倍的隱藏神器,希望對(duì)你會(huì)有所幫助。

一、@Conditional注解

有些小伙伴在工作中可能遇到過(guò)這樣的場(chǎng)景:不同環(huán)境需要加載不同的Bean配置。

傳統(tǒng)的做法是用@Profile,但@Conditional提供了更靈活的控制能力。

基礎(chǔ)用法

@Configuration
publicclass DataSourceConfig {
    
    @Bean
    @Conditional(ProdDataSourceCondition.class)
    public DataSource prodDataSource() {
        // 生產(chǎn)環(huán)境數(shù)據(jù)源
        return DataSourceBuilder.create()
                .url("jdbc:mysql://prod-host:3306/app")
                .username("prod-user")
                .password("prod-pass")
                .build();
    }
    
    @Bean
    @Conditional(DevDataSourceCondition.class)
    public DataSource devDataSource() {
        // 開(kāi)發(fā)環(huán)境數(shù)據(jù)源
        return DataSourceBuilder.create()
                .url("jdbc:h2:mem:testdb")
                .username("sa")
                .password("")
                .build();
    }
}

// 生產(chǎn)環(huán)境條件判斷
publicclass ProdDataSourceCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String env = context.getEnvironment().getProperty("app.env");
        return"prod".equals(env);
    }
}

// 開(kāi)發(fā)環(huán)境條件判斷
publicclass DevDataSourceCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String env = context.getEnvironment().getProperty("app.env");
        return"dev".equals(env) || env == null;
    }
}

進(jìn)階用法:組合條件

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnDatabaseTypeCondition.class)
public @interface ConditionalOnDatabaseType {
    String value();
}

publicclass OnDatabaseTypeCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Map<String, Object> attributes = metadata.getAnnotationAttributes(
            ConditionalOnDatabaseType.class.getName());
        String expectedType = (String) attributes.get("value");
        String actualType = context.getEnvironment().getProperty("app.db.type");
        return expectedType.equals(actualType);
    }
}

// 使用自定義條件注解
@Configuration
publicclass CacheConfig {
    
    @Bean
    @ConditionalOnDatabaseType("redis")
    public CacheManager redisCacheManager() {
        returnnew RedisCacheManager();
    }
    
    @Bean
    @ConditionalOnDatabaseType("caffeine")
    public CacheManager caffeineCacheManager() {
        returnnew CaffeineCacheManager();
    }
}

深度解析:@Conditional的核心價(jià)值在于實(shí)現(xiàn)了"條件化配置",這是SpringBoot自動(dòng)配置的基石。

通過(guò)實(shí)現(xiàn)Condition接口,我們可以基于任何條件(環(huán)境變量、系統(tǒng)屬性、類路徑、Bean存在性等)來(lái)決定是否加載某個(gè)Bean。

二、@ConfigurationProperties

有些小伙伴可能還在用@Value一個(gè)個(gè)注入配置屬性,其實(shí)@ConfigurationProperties才是更優(yōu)雅的解決方案。

基礎(chǔ)綁定

@Component
@ConfigurationProperties(prefix = "app.datasource")
@Validated
publicclass DataSourceProperties {
    
    @NotBlank
    private String url;
    
    @NotBlank
    private String username;
    
    private String password;
    
    @Min(1)
    @Max(100)
    privateint maxPoolSize = 10;
    
    private Duration connectionTimeout = Duration.ofSeconds(30);
    
    // 嵌套配置
    private Pool pool = new Pool();
    
    // getters and setters
    publicstaticclass Pool {
        privateint maxSize = 20;
        privateint minIdle = 5;
        
        // getters and setters
    }
}

// application.yml
app:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: secret
    max-pool-size: 20
    connection-timeout: 60s
    pool:
      max-size: 50
      min-idle: 10

類型安全配置

@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource(DataSourceProperties properties) {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        dataSource.setMaximumPoolSize(properties.getMaxPoolSize());
        dataSource.setConnectionTimeout(properties.getConnectionTimeout().toMillis());
        return dataSource;
    }
}

深度解析:@ConfigurationProperties不僅提供了類型安全的配置綁定,還支持嵌套屬性、集合類型、數(shù)據(jù)校驗(yàn)、寬松綁定(kebab-case到camelCase自動(dòng)轉(zhuǎn)換)等特性。

這是SpringBoot"約定優(yōu)于配置"理念的完美體現(xiàn)。

三、Spring Boot Actuator

生產(chǎn)環(huán)境監(jiān)控是系統(tǒng)穩(wěn)定性的生命線,Actuator提供了開(kāi)箱即用的監(jiān)控端點(diǎn)。

核心端點(diǎn)配置

@Configuration
publicclass ActuatorConfig {
    
    // 自定義健康檢查
    @Component
    publicclass DatabaseHealthIndicator implements HealthIndicator {
        
        @Autowired
        private DataSource dataSource;
        
        @Override
        public Health health() {
            try (Connection conn = dataSource.getConnection()) {
                if (conn.isValid(1000)) {
                    return Health.up()
                            .withDetail("database", "Available")
                            .withDetail("validationQuery", "SUCCESS")
                            .build();
                }
            } catch (SQLException e) {
                return Health.down(e)
                        .withDetail("database", "Unavailable")
                        .withDetail("error", e.getMessage())
                        .build();
            }
            return Health.unknown().build();
        }
    }
    
    // 自定義指標(biāo)
    @Component
    publicclass OrderMetrics {
        
        privatefinal Counter orderCounter;
        privatefinal DistributionSummary orderAmountSummary;
        
        public OrderMetrics(MeterRegistry registry) {
            this.orderCounter = Counter.builder("order.count")
                    .description("Total number of orders")
                    .register(registry);
                    
            this.orderAmountSummary = DistributionSummary.builder("order.amount")
                    .description("Order amount distribution")
                    .baseUnit("USD")
                    .register(registry);
        }
        
        public void recordOrder(Order order) {
            orderCounter.increment();
            orderAmountSummary.record(order.getAmount().doubleValue());
        }
    }
}

// application.yml 管理端點(diǎn)暴露配置
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  endpoint:
    health:
      show-details: always
      show-components: always
    metrics:
      enabled: true

自定義信息端點(diǎn)

@Component
publicclass BuildInfoContributor implements InfoContributor {
    
    @Override
    public void contribute(Info.Builder builder) {
        Map<String, String> buildDetails = new HashMap<>();
        buildDetails.put("version", "1.0.0");
        buildDetails.put("timestamp", Instant.now().toString());
        buildDetails.put("commit", getGitCommit());
        
        builder.withDetail("build", buildDetails)
               .withDetail("environment", getEnvironmentInfo());
    }
    
    private String getGitCommit() {
        // 獲取Git提交信息
        try {
            returnnew String(Files.readAllBytes(Paths.get("git.properties")));
        } catch (IOException e) {
            return"unknown";
        }
    }
}

深度解析:Actuator不僅僅是監(jiān)控工具,它提供了應(yīng)用的全方位可觀測(cè)性。通過(guò)健康檢查、指標(biāo)收集、審計(jì)事件、HTTP追蹤等功能,我們可以構(gòu)建完整的應(yīng)用監(jiān)控體系。

四、Spring Boot DevTools

有些小伙伴可能還在手動(dòng)重啟應(yīng)用來(lái)查看代碼變更效果,DevTools提供了極致的開(kāi)發(fā)體驗(yàn)。

熱加載配置

// application-dev.yml
spring:
  devtools:
    restart:
      enabled: true
      exclude: static/**,public/**
      additional-paths: src/main/java
    livereload:
      enabled: true
  thymeleaf:
    cache: false
  freemarker:
    cache: false

// 自定義重啟觸發(fā)器
@Component
public class CustomRestartTrigger implements ApplicationListener<ClassPathChangedEvent> {
    
    private final RestartScope restartScope;
    
    public CustomRestartTrigger(RestartScope restartScope) {
        this.restartScope = restartScope;
    }
    
    @Override
    public void onApplicationEvent(ClassPathChangedEvent event) {
        if (event.getChangeSet().isModified()) {
            // 清除重啟范圍內(nèi)的Bean
            restartScope.clear();
            System.out.println("檢測(cè)到類路徑變化,準(zhǔn)備重啟...");
        }
    }
}

開(kāi)發(fā)時(shí)配置覆蓋

// 開(kāi)發(fā)環(huán)境特定配置
@Profile("dev")
@Configuration
public class DevConfig {
    
    @Bean
    public SomeService someService() {
        // 返回mock實(shí)現(xiàn)或開(kāi)發(fā)環(huán)境特定實(shí)現(xiàn)
        return new MockSomeService();
    }
}

深度解析:DevTools通過(guò)類加載器技巧實(shí)現(xiàn)了快速應(yīng)用重啟,同時(shí)提供了LiveReload、全局配置、開(kāi)發(fā)時(shí)屬性覆蓋等功能,將開(kāi)發(fā)效率提升到了新的高度。

五、Spring Retry

分布式系統(tǒng)中,網(wǎng)絡(luò)抖動(dòng)、服務(wù)短暫不可用是常態(tài)。

Spring Retry提供了聲明式的重試解決方案。

基礎(chǔ)重試配置

@Service
publicclass PaymentService {
    
    @Retryable(
        value = {PaymentException.class, NetworkException.class},
        maxAttempts = 3,
        backoff = @Backoff(delay = 1000, multiplier = 2)
    )
    public PaymentResult processPayment(PaymentRequest request) {
        // 調(diào)用支付網(wǎng)關(guān)
        return paymentGateway.process(request);
    }
    
    @Recover
    public PaymentResult recover(PaymentException e, PaymentRequest request) {
        // 重試全部失敗后的恢復(fù)邏輯
        log.error("支付處理失敗,進(jìn)入恢復(fù)邏輯", e);
        return PaymentResult.failed("支付處理暫時(shí)不可用");
    }
}

// 配置類
@Configuration
@EnableRetry
publicclass RetryConfig {
    
    @Bean
    public RetryTemplate retryTemplate() {
        return RetryTemplate.builder()
                .maxAttempts(5)
                .exponentialBackoff(1000, 2, 10000)
                .retryOn(RemoteAccessException.class)
                .traversingCauses()
                .build();
    }
}

高級(jí)重試策略

@Component
publicclass CircuitBreakerRetryListener extends RetryListenerSupport {
    
    privatefinal CircuitBreaker circuitBreaker;
    
    public CircuitBreakerRetryListener() {
        this.circuitBreaker = CircuitBreaker.ofDefaults("payment-service");
    }
    
    @Override
    public <T, E extends Throwable> void onError(
            RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
        
        // 記錄失敗,可能觸發(fā)熔斷
        circuitBreaker.onError(throwable);
        
        if (circuitBreaker.tryAcquirePermission()) {
            log.warn("重試失敗,但熔斷器仍允許繼續(xù)嘗試");
        } else {
            log.error("重試失敗,熔斷器已打開(kāi),停止重試");
            context.setExhaustedOnly(); // 標(biāo)記為耗盡,停止重試
        }
    }
}

深度解析:Spring Retry的核心在于其靈活的重試策略和退避機(jī)制。

通過(guò)@Retryable和@Recover注解,我們可以用聲明式的方式處理各種暫時(shí)性故障,提高系統(tǒng)的容錯(cuò)能力。

六、Spring Cache

有些小伙伴可能還在手動(dòng)管理緩存,Spring Cache提供了統(tǒng)一的緩存抽象。

多緩存管理器配置

@Configuration
@EnableCaching
publicclass CacheConfig {
    
    @Bean
    @Primary
    public CacheManager redisCacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(30))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
        
        return RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .withInitialCacheConfigurations(Collections.singletonMap(
                    "users", 
                    RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1))
                ))
                .transactionAware()
                .build();
    }
    
    @Bean
    public CacheManager caffeineCacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCaffeine(Caffeine.newBuilder()
                .expireAfterWrite(Duration.ofMinutes(10))
                .maximumSize(1000));
        return cacheManager;
    }
}

// 使用示例
@Service
publicclass UserService {
    
    @Cacheable(value = "users", key = "#id", unless = "#result == null")
    public User getUserById(Long id) {
        // 數(shù)據(jù)庫(kù)查詢
        return userRepository.findById(id).orElse(null);
    }
    
    @Cacheable(value = "users", key = "#username", cacheManager = "caffeineCacheManager")
    public User getUserByUsername(String username) {
        return userRepository.findByUsername(username);
    }
    
    @CacheEvict(value = "users", key = "#user.id")
    public void updateUser(User user) {
        userRepository.save(user);
    }
    
    @Caching(evict = {
        @CacheEvict(value = "users", key = "#user.id"),
        @CacheEvict(value = "users", key = "#user.username")
    })
    public void deleteUser(User user) {
        userRepository.delete(user);
    }
}

深度解析:Spring Cache的價(jià)值在于它提供了統(tǒng)一的緩存抽象層,讓我們可以在不同的緩存實(shí)現(xiàn)(Redis、Caffeine、Ehcache等)之間無(wú)縫切換,同時(shí)保持業(yè)務(wù)代碼的純凈性。

七、Spring Boot Test

測(cè)試是保證代碼質(zhì)量的關(guān)鍵,Spring Boot Test提供了全方位的測(cè)試支持。

分層測(cè)試策略

// 1. 單元測(cè)試 - 不啟動(dòng)Spring容器
@ExtendWith(MockitoExtension.class)
class UserServiceUnitTest {
    
    @Mock
    private UserRepository userRepository;
    
    @InjectMocks
    private UserService userService;
    
    @Test
    void shouldReturnUserWhenExists() {
        // given
        User expected = new User(1L, "john");
        when(userRepository.findById(1L)).thenReturn(Optional.of(expected));
        
        // when
        User actual = userService.getUserById(1L);
        
        // then
        assertThat(actual).isEqualTo(expected);
        verify(userRepository).findById(1L);
    }
}

// 2. 切片測(cè)試 - 只啟動(dòng)部分容器
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryTest {
    
    @Autowired
    private TestEntityManager entityManager;
    
    @Autowired
    private UserRepository userRepository;
    
    @Test
    void shouldFindByUsername() {
        // given
        User user = new User(null, "john", "john@example.com");
        entityManager.persistAndFlush(user);
        
        // when
        User found = userRepository.findByUsername("john");
        
        // then
        assertThat(found.getEmail()).isEqualTo("john@example.com");
    }
}

// 3. 集成測(cè)試 - 啟動(dòng)完整容器
@SpringBootTest
@ActiveProfiles("test")
class UserServiceIntegrationTest {
    
    @Autowired
    private UserService userService;
    
    @Autowired
    private TestRestTemplate restTemplate;
    
    @MockBean
    private EmailService emailService;
    
    @Test
    void shouldCreateUserAndSendEmail() {
        // given
        UserCreateRequest request = new UserCreateRequest("john", "john@example.com");
        doNothing().when(emailService).sendWelcomeEmail(anyString());
        
        // when
        User user = userService.createUser(request);
        
        // then
        assertThat(user.getUsername()).isEqualTo("john");
        verify(emailService).sendWelcomeEmail("john@example.com");
    }
    
    @Test
    void shouldReturnUserViaRest() {
        // when
        ResponseEntity<User> response = restTemplate.getForEntity("/users/1", User.class);
        
        // then
        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(response.getBody()).isNotNull();
    }
}

測(cè)試配置優(yōu)化

@TestConfiguration
publicclass TestConfig {
    
    @Bean
    @Primary
    public DataSource testDataSource() {
        // 使用H2內(nèi)存數(shù)據(jù)庫(kù)進(jìn)行測(cè)試
        returnnew EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .addScript("classpath:test-schema.sql")
                .addScript("classpath:test-data.sql")
                .build();
    }
}

深度解析:Spring Boot Test的核心價(jià)值在于它的分層測(cè)試?yán)砟睢?/span>

通過(guò)不同的測(cè)試注解,我們可以精確控制測(cè)試的范圍和復(fù)雜度,在測(cè)試效率和覆蓋度之間找到最佳平衡。

八、Spring Boot Starter

有些小伙伴可能想封裝自己的通用功能,自定義Starter是最佳實(shí)踐。

創(chuàng)建自定義Starter

// 自動(dòng)配置類
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MyServiceAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean
    public MyService myService(MyServiceProperties properties) {
        returnnew MyService(properties);
    }
    
    @Bean
    @ConditionalOnProperty(name = "my.service.metrics.enabled", havingValue = "true")
    public MyServiceMetrics myServiceMetrics() {
        returnnew MyServiceMetrics();
    }
}

// 配置屬性類
@ConfigurationProperties(prefix = "my.service")
publicclass MyServiceProperties {
    
    private String endpoint = "http://localhost:8080";
    private Duration timeout = Duration.ofSeconds(30);
    privateint maxConnections = 100;
    
    // getters and setters
}

// spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.myservice.MyServiceAutoConfiguration

條件化Bean配置

@Configuration
publicclass ConditionalBeans {
    
    @Bean
    @ConditionalOnWebApplication
    public WebSpecificBean webSpecificBean() {
        returnnew WebSpecificBean();
    }
    
    @Bean
    @ConditionalOnNotWebApplication
    public NonWebBean nonWebBean() {
        returnnew NonWebBean();
    }
    
    @Bean
    @ConditionalOnBean(DataSource.class)
    public DataSourceAwareBean dataSourceAwareBean() {
        returnnew DataSourceAwareBean();
    }
}

深度解析:自定義Starter是SpringBoot生態(tài)擴(kuò)展的核心機(jī)制。

通過(guò)合理的自動(dòng)配置和條件化加載,我們可以創(chuàng)建出即插即用的功能模塊,極大提升代碼復(fù)用性。

九、Spring Boot Admin

雖然Actuator提供了監(jiān)控端點(diǎn),但Spring Boot Admin提供了更友好的管理界面。

服務(wù)端配置

@Configuration
@EnableAdminServer
publicclass AdminServerConfig {
    
    @Bean
    public Notifier notifier() {
        returnnew RemindingNotifier(
            new FilteringNotifier(
                new LoggingNotifier(),
                (instanceEvent) -> instanceEvent.getType() == StatusChangeEvent.TYPE
            ),
            AdminServerNotifier::shouldNotify,
            Duration.ofMinutes(10)
        );
    }
}

// 客戶端配置
@Configuration
publicclass AdminClientConfig {
    
    @Bean
    public SecurityContext securityContext() {
        return SecurityContext.builder()
                .username("admin")
                .password("secret")
                .build();
    }
}

十、Spring Boot CLI

對(duì)于快速驗(yàn)證想法或創(chuàng)建原型,Spring Boot CLI提供了極致的開(kāi)發(fā)體驗(yàn)。

CLI示例

# 創(chuàng)建簡(jiǎn)單的Web應(yīng)用
echo '@RestController class App { @RequestMapping("/") String home() { "Hello World" } }' > app.groovy

# 運(yùn)行應(yīng)用
spring run app.groovy

# 添加依賴
spring install com.example:my-starter:1.0.0

# 打包應(yīng)用
spring jar myapp.jar *.groovy

自定義CLI命令

@Component
@Order(0)
publicclass MyCommand implements CommandLineRunner {
    
    privatefinal ApplicationContext context;
    
    public MyCommand(ApplicationContext context) {
        this.context = context;
    }
    
    @Override
    public void run(String... args) throws Exception {
        if (args.length > 0 && "init".equals(args[0])) {
            // 初始化邏輯
            System.out.println("Initializing application...");
            initializeDatabase();
            loadSampleData();
        }
    }
    
    private void initializeDatabase() {
        // 數(shù)據(jù)庫(kù)初始化邏輯
    }
}

深度解析:Spring Boot CLI的核心價(jià)值在于它極大降低了Spring應(yīng)用的入門門檻,通過(guò)Groovy腳本和自動(dòng)依賴管理,讓開(kāi)發(fā)者可以專注于業(yè)務(wù)邏輯而不是配置。

總結(jié)

我們可以總結(jié)出SpringBoot設(shè)計(jì)的核心理念:

1. 約定優(yōu)于配置

通過(guò)合理的默認(rèn)值和自動(dòng)配置,SpringBoot讓開(kāi)發(fā)者從繁瑣的配置中解放出來(lái)。

2. 模塊化設(shè)計(jì)

每個(gè)Starter都是自包含的功能模塊,可以按需引入,保持應(yīng)用的輕量。

3. 生產(chǎn)就緒

從監(jiān)控到管理,從健康檢查到指標(biāo)收集,SpringBoot為生產(chǎn)環(huán)境提供了完整解決方案。

4. 開(kāi)發(fā)者友好

無(wú)論是DevTools的熱加載,還是CLI的快速原型,都體現(xiàn)了對(duì)開(kāi)發(fā)者體驗(yàn)的重視。

有些小伙伴可能會(huì)問(wèn):為什么要花時(shí)間學(xué)習(xí)這些"神器"?

我的回答是:

  • 效率提升:正確使用這些工具可以讓開(kāi)發(fā)效率提升數(shù)倍。
  • 代碼質(zhì)量:統(tǒng)一的抽象和最佳實(shí)踐提高了代碼質(zhì)量和可維護(hù)性。
  • 系統(tǒng)穩(wěn)定性:完善的監(jiān)控和運(yùn)維工具保障了系統(tǒng)穩(wěn)定性。
  • 團(tuán)隊(duì)協(xié)作:統(tǒng)一的開(kāi)發(fā)模式和工具鏈促進(jìn)了團(tuán)隊(duì)協(xié)作。

技術(shù)選型的真諦不在于追求最新最炫的技術(shù),而在于選擇最適合團(tuán)隊(duì)和業(yè)務(wù)的技術(shù)棧。

SpringBoot的這些"神器"之所以珍貴,正是因?yàn)樗鼈兘?jīng)過(guò)了大量生產(chǎn)實(shí)踐的檢驗(yàn),在功能和易用性之間找到了完美平衡。

希望這篇文章能夠幫助你更好地理解和運(yùn)用SpringBoot,讓你的開(kāi)發(fā)之路更加順暢高效。

責(zé)任編輯:武曉燕 來(lái)源: 蘇三說(shuō)技術(shù)
相關(guān)推薦

2024-12-10 08:20:44

2024-06-11 08:52:58

2024-12-31 08:10:00

2020-10-14 15:00:38

Python 開(kāi)發(fā)編程語(yǔ)言

2025-08-12 07:37:44

2024-05-16 08:26:24

開(kāi)發(fā)技巧項(xiàng)目

2024-04-29 08:35:29

監(jiān)控Kafka集群

2021-10-18 08:01:44

TS語(yǔ)言TypeScript

2023-05-15 12:11:24

2025-06-03 08:27:58

Python異步IO編程

2022-11-04 08:16:22

2023-12-23 11:15:25

2025-06-11 02:00:00

Spring內(nèi)置開(kāi)發(fā)

2020-09-24 10:18:29

JVM參數(shù)類型

2024-12-24 08:23:31

2025-07-25 09:02:56

2022-05-16 07:48:54

Python操作類型

2020-05-15 09:50:08

GitHub開(kāi)源項(xiàng)目

2010-10-09 14:22:40

2024-12-17 09:44:55

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)