Spring成為Java開發(fā)的標(biāo)準(zhǔn)以及SpringBoot如何徹底改變開發(fā)體驗
引言:從復(fù)雜到簡約的技術(shù)革命
在Java企業(yè)級應(yīng)用開發(fā)領(lǐng)域,有兩個名字幾乎無人不知——Spring和SpringBoot。它們之間的關(guān)系宛如汽車引擎與自動駕駛系統(tǒng):Spring提供了強大的動力和精密的機械結(jié)構(gòu),而SpringBoot則為這套復(fù)雜的系統(tǒng)裝上了智能駕駛艙,讓駕駛變得簡單而高效。
本文將深入剖析:
- Spring框架為何能夠統(tǒng)治Java企業(yè)開發(fā)十余年
- SpringBoot如何解決傳統(tǒng)Spring開發(fā)的痛點
- 兩者的關(guān)系與協(xié)同工作方式
一、Spring的崛起:企業(yè)級Java開發(fā)的范式革命
1.1 傳統(tǒng)Java EE開發(fā)的困境
在Spring出現(xiàn)之前,Java企業(yè)開發(fā)主要依賴于EJB(Enterprise JavaBeans),這種開發(fā)模式存在諸多問題:
// 傳統(tǒng)EJB開發(fā)示例 - 復(fù)雜的配置和依賴
@Stateless
public class BankBean implements Bank {
// 需要實現(xiàn)復(fù)雜的EJB接口
// 大量的XML配置
// 依賴容器管理,難以測試
}
主要痛點:
- 配置繁瑣:需要大量的部署描述符(XML)
- 容器依賴:嚴(yán)重依賴應(yīng)用服務(wù)器
- 測試?yán)щy:難以進行單元測試
- 侵入性強:業(yè)務(wù)代碼需要實現(xiàn)特定接口
1.2 Spring的核心價值主張
Spring框架于2003年首次發(fā)布,它的設(shè)計哲學(xué)可以概括為:“讓Java EE開發(fā)變得更簡單”。這不僅僅是一句口號,而是通過一系列創(chuàng)新架構(gòu)實現(xiàn)的。
1.2.1 IoC容器:依賴管理的革命
控制反轉(zhuǎn)(Inversion of Control) 是Spring最核心的概念。傳統(tǒng)編程中,對象自己創(chuàng)建依賴:
// 傳統(tǒng)方式:對象自己管理依賴
public class OrderService {
private OrderRepository repository;
public OrderService() {
// 對象自己創(chuàng)建依賴 - 緊耦合!
this.repository = new JdbcOrderRepository();
}
}Spring通過IoC容器接管了這一過程:
// Spring方式:依賴由容器注入
@Component
public class OrderService {
private final OrderRepository repository;
// 依賴注入 - 松耦合!
@Autowired
public OrderService(OrderRepository repository) {
this.repository = repository;
}
}IoC帶來的核心優(yōu)勢:
- 解耦組件:對象之間不再直接依賴,而是通過接口通信
- 易于測試:可以輕松注入Mock對象進行單元測試
- 生命周期管理:容器統(tǒng)一管理Bean的創(chuàng)建、初始化和銷毀
- 配置集中化:依賴關(guān)系在配置中聲明,而非硬編碼
1.2.2 AOP:橫切關(guān)注點的優(yōu)雅處理
面向切面編程(Aspect-Oriented Programming) 解決了代碼橫切關(guān)注點的問題。以事務(wù)管理為例:
// 沒有AOP的事務(wù)管理 - 代碼重復(fù)且侵入性強
public class OrderService {
public void createOrder(Order order) {
Connection conn = null;
try {
conn = dataSource.getConnection();
conn.setAutoCommit(false);
// 業(yè)務(wù)邏輯
orderDao.save(order);
inventoryDao.update(order.getItems());
conn.commit();
} catch (Exception e) {
if (conn != null) conn.rollback();
throw e;
} finally {
if (conn != null) conn.close();
}
}
}使用Spring AOP后:
// 使用AOP的事務(wù)管理 - 業(yè)務(wù)邏輯純凈
@Transactional
public void createOrder(Order order) {
// 只關(guān)注核心業(yè)務(wù)邏輯
orderDao.save(order);
inventoryDao.update(order.getItems());
}
// 事務(wù)切面配置
@Aspect
@Component
public class TransactionAspect {
@Around("@annotation(transactional)")
public Object manageTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
// 事務(wù)管理邏輯統(tǒng)一在此處理
TransactionStatus status = transactionManager.beginTransaction();
try {
Object result = joinPoint.proceed();
transactionManager.commit(status);
return result;
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
}
}AOP的關(guān)鍵應(yīng)用場景:
- 聲明式事務(wù)管理:
@Transactional注解 - 安全控制:權(quán)限檢查和認(rèn)證
- 日志記錄:統(tǒng)一的日志切面
- 性能監(jiān)控:方法執(zhí)行時間統(tǒng)計
- 異常處理:統(tǒng)一的異常處理機制
1.2.3 全面而模塊化的生態(tài)系統(tǒng)
Spring不是一個單一的框架,而是一個完整的生態(tài)系統(tǒng):
Spring生態(tài)系統(tǒng) ├── Spring Framework (核心) │ ├── IoC容器 │ ├── AOP框架 │ ├── 數(shù)據(jù)訪問/集成 │ │ ├── JDBC │ │ ├── 事務(wù)管理 │ │ ├── ORM集成 │ │ └── Spring Data │ ├── Web框架 │ │ ├── Spring MVC │ │ └── WebFlux (響應(yīng)式) │ └── 測試框架 │ ├── Spring Boot (快速開發(fā)) ├── Spring Cloud (微服務(wù)) ├── Spring Security (安全) ├── Spring Batch (批處理) ├── Spring Integration (集成) └── Spring Session (會話管理)
1.3 Spring為何能夠流行?
- 非侵入性設(shè)計:Spring不要求業(yè)務(wù)對象繼承特定父類或?qū)崿F(xiàn)特定接口
- 強大的抽象層:對各種復(fù)雜技術(shù)的統(tǒng)一封裝(JDBC、JMS、JPA等)
- 漸進式采用:可以只使用部分功能,無需全盤接受
- 卓越的文檔和社區(qū):官方文檔詳盡,社區(qū)活躍,問題解決容易
- 持續(xù)的創(chuàng)新:從XML配置到注解配置,再到響應(yīng)式編程
二、SpringBoot的誕生:解決配置復(fù)雜性的終極方案
2.1 傳統(tǒng)Spring應(yīng)用的痛點
隨著Spring功能日益強大,其配置也變得越來越復(fù)雜:
<!-- 傳統(tǒng)Spring MVC配置示例 - 大量樣板代碼 -->
<beans>
<!-- 數(shù)據(jù)源配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- 事務(wù)管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- MyBatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- MVC配置 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- ... 更多配置 -->
</beans>主要問題總結(jié):
- 配置復(fù)雜:大量重復(fù)的樣板配置代碼
- 依賴管理困難:版本沖突頻繁發(fā)生
- 部署繁瑣:需要打包WAR并部署到外部容器
- 啟動緩慢:大量配置解析導(dǎo)致啟動時間長
- 環(huán)境配置麻煩:不同環(huán)境需要不同配置
2.2 SpringBoot的核心設(shè)計理念:約定優(yōu)于配置
SpringBoot于2014年發(fā)布,其核心哲學(xué)是"Convention Over Configuration"(約定優(yōu)于配置)。它通過智能默認(rèn)值減少決策點,讓開發(fā)者專注于業(yè)務(wù)邏輯。
2.2.1 起步依賴(Starter Dependencies)
起步依賴是SpringBoot最重要的特性之一,它將相關(guān)的依賴項打包成一個"配方":
<!-- 傳統(tǒng)Spring項目需要分別添加多個依賴 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.68</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.2</version>
</dependency>
<!-- ... 更多依賴 -->
</dependencies>
<!-- SpringBoot只需要一個起步依賴 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.8</version>
</dependency>
</dependencies>常用起步依賴示例:
<!-- Web應(yīng)用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 數(shù)據(jù)訪問 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 安全 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 測試 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>2.2.2 自動配置(Auto-configuration)
SpringBoot的自動配置機制是其"魔法"的核心。它通過條件化配置,根據(jù)類路徑上的依賴自動配置應(yīng)用程序:
// SpringBoot自動配置原理示例
@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@ConditionalOnMissingBean(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource(DataSourceProperties properties) {
return DataSourceBuilder.create()
.url(properties.getUrl())
.username(properties.getUsername())
.password(properties.getPassword())
.driverClassName(properties.getDriverClassName())
.build();
}
}
// 只需在application.properties中配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver自動配置的工作流程:
- 條件檢測:檢查類路徑、已存在的Bean、配置文件等條件
- 智能決策:根據(jù)條件決定是否創(chuàng)建特定的Bean
- 優(yōu)先級處理:用戶自定義配置優(yōu)先于自動配置
- 靈活覆蓋:任何時候都可以通過自定義Bean覆蓋自動配置
2.2.3 嵌入式容器(Embedded Container)
SpringBoot最大的革新之一是嵌入式容器的引入:
// 傳統(tǒng)Spring應(yīng)用啟動
// 1. 打包為WAR文件
// 2. 部署到外部Tomcat服務(wù)器
// 3. 啟動Tomcat服務(wù)器
// SpringBoot應(yīng)用啟動
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
// 一行代碼啟動,內(nèi)嵌Tomcat
SpringApplication.run(MyApplication.class, args);
}
}
// 打包和運行
// mvn clean package -> 生成可執(zhí)行JAR
// java -jar myapp.jar -> 直接運行嵌入式容器的優(yōu)勢:
- 簡化部署:無需安裝和配置外部Web服務(wù)器
- 環(huán)境一致:開發(fā)、測試、生產(chǎn)環(huán)境完全一致
- 云原生友好:適合容器化部署(Docker)
- 快速啟動:啟動速度比傳統(tǒng)部署方式快
2.2.4 Actuator:生產(chǎn)就緒特性
SpringBoot Actuator提供了一系列生產(chǎn)環(huán)境監(jiān)控和管理端點:
# application.yml - Actuator配置
management:
endpoints:
web:
exposure:
include: "*" # 暴露所有端點
endpoint:
health:
show-details: always
metrics:
enabled: true
# 常用的監(jiān)控端點
# /actuator/health - 應(yīng)用健康狀態(tài)
# /actuator/info - 應(yīng)用信息
# /actuator/metrics - 性能指標(biāo)
# /actuator/loggers - 日志級別管理
# /actuator/env - 環(huán)境變量
# /actuator/beans - 所有Bean信息2.3 SpringBoot解決的問題總結(jié)
| 問題領(lǐng)域 | 傳統(tǒng)Spring | SpringBoot解決方案 | 效果 |
|---|---|---|---|
| 項目搭建 | 手動配置POM,添加依賴 | Starter依賴,Spring Initializr | 秒級創(chuàng)建項目 |
| 配置管理 | 大量XML或Java Config | 自動配置 + application.properties | 零配置或極少配置 |
| 依賴管理 | 手動管理版本,易沖突 | Starter統(tǒng)一管理版本 | 無依賴沖突 |
| 應(yīng)用部署 | WAR包部署到外部容器 | 可執(zhí)行JAR,內(nèi)嵌容器 | 一鍵部署運行 |
| 環(huán)境配置 | 多個配置文件切換 | Profile機制 | 輕松管理多環(huán)境 |
| 監(jiān)控管理 | 需要集成第三方工具 | Actuator內(nèi)置 | 開箱即用的監(jiān)控 |
| 開發(fā)體驗 | 需要頻繁重啟服務(wù)器 | DevTools熱部署 | 開發(fā)效率提升50%+ |
三、Spring與SpringBoot的關(guān)系:協(xié)同進化的典范
3.1 不是替代,而是增強
一個常見的誤解是SpringBoot替代了Spring。實際上:
// SpringBoot應(yīng)用本質(zhì)上仍然是Spring應(yīng)用
@SpringBootApplication // 這個注解是三個注解的組合
// = @SpringBootConfiguration // 表明是配置類
// + @EnableAutoConfiguration // 啟用自動配置
// + @ComponentScan // 啟用組件掃描
public class Application {
// 這里可以正常使用所有Spring特性
@Autowired
private ApplicationContext context; // Spring IoC容器
@Bean // 定義Spring Bean
public MyService myService() {
return new MyServiceImpl();
}
}3.2 技術(shù)棧演進路徑
技術(shù)演進路徑:
┌─────────────────────────────────────────────────────┐
│ Java EE (EJB)時代 (2003年前) │
│ ? 重量級容器 │
│ ? 配置復(fù)雜 │
│ ? 侵入性強 │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ Spring Framework時代 (2003-2014) │
│ ? 輕量級IoC容器 │
│ ? AOP支持 │
│ ? 聲明式事務(wù) │
│ ? 但配置仍然復(fù)雜 │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ SpringBoot時代 (2014至今) │
│ ? 約定優(yōu)于配置 │
│ ? 自動配置 │
│ ? 內(nèi)嵌容器 │
│ ? 生產(chǎn)就緒特性 │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ Spring Cloud微服務(wù)時代 │
│ ? 服務(wù)發(fā)現(xiàn)(Netflix Eureka) │
│ ? 配置中心(Spring Cloud Config) │
│ ? 網(wǎng)關(guān)(Spring Cloud Gateway) │
│ ? 基于SpringBoot構(gòu)建 │
└─────────────────────────────────────────────────────┘3.3 現(xiàn)代Spring技術(shù)棧的選擇策略
根據(jù)項目需求選擇合適的技術(shù)組合:

四、最佳實踐與避坑指南
4.1 SpringBoot配置最佳實踐
# application.yml - 結(jié)構(gòu)化配置示例
spring:
application:
name: user-service # 應(yīng)用名稱
datasource:
url: jdbc:mysql://localhost:3306/userdb
username: ${DB_USER:root}
password: ${DB_PASSWORD:secret}
hikari:
maximum-pool-size: 20
connection-timeout: 30000
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
# 多環(huán)境配置支持
profiles:
active: @activatedProperties@ # Maven屬性替換
# 自定義配置
app:
config:
upload-dir: /var/uploads
max-file-size: 10MB
retry-count: 34.2 常見陷阱及解決方案
陷阱1:自動配置沖突
// 錯誤:自定義配置覆蓋了自動配置
@Configuration
public class MyConfig {
@Bean
public DataSource dataSource() {
// 硬編碼配置,不靈活
return DataSourceBuilder.create()
.url("jdbc:h2:mem:test")
.build();
}
}
// 正確:使用配置屬性
@Configuration
public class MyConfig {
@Bean
@ConfigurationProperties("app.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}陷阱2:Bean循環(huán)依賴
// 循環(huán)依賴 - 應(yīng)該避免
@Service
public class ServiceA {
@Autowired
private ServiceB serviceB; // 依賴B
}
@Service
public class ServiceB {
@Autowired
private ServiceA serviceA; // 又依賴A,形成循環(huán)
}
// 解決方案
// 1. 使用@Lazy延遲加載
// 2. 使用setter注入代替構(gòu)造器注入
// 3. 重構(gòu)設(shè)計,提取公共邏輯到第三個類陷阱3:Profile配置不當(dāng)
// 錯誤的Profile使用
@Bean
@Profile("dev") // 只適用于dev環(huán)境
public DataSource devDataSource() {
return createH2DataSource();
}
// 正確的做法:提供默認(rèn)配置
@Bean
@Profile("!prod") // 非生產(chǎn)環(huán)境使用
public DataSource defaultDataSource() {
return createH2DataSource();
}
@Bean
@Profile("prod") // 生產(chǎn)環(huán)境使用
public DataSource prodDataSource() {
return createMySQLDataSource();
}五、未來展望:Spring的持續(xù)創(chuàng)新
5.1 響應(yīng)式編程支持
Spring WebFlux是Spring 5引入的響應(yīng)式Web框架:
// 傳統(tǒng)的命令式編程
@RestController
public class TraditionalController {
@GetMapping("/users")
public List<User> getUsers() {
return userRepository.findAll(); // 阻塞調(diào)用
}
}
// 響應(yīng)式編程
@RestController
public class ReactiveController {
@GetMapping("/users")
public Flux<User> getUsers() {
return userRepository.findAll(); // 非阻塞流
}
@GetMapping("/users/{id}")
public Mono<User> getUser(@PathVariable String id) {
return userRepository.findById(id); // 單個響應(yīng)式結(jié)果
}
}5.2 GraalVM原生鏡像支持
Spring Boot 3支持將應(yīng)用編譯為原生鏡像,極大提升啟動速度和內(nèi)存效率:
# 傳統(tǒng)JVM啟動 # 啟動時間:2-3秒 # 內(nèi)存占用:200-300MB # GraalVM原生鏡像 # 啟動時間:0.05-0.1秒(提升50倍) # 內(nèi)存占用:50-80MB(減少70%) # 構(gòu)建命令 ./mvnw native:compile -Pnative
5.3 持續(xù)簡化的開發(fā)者體驗
Spring團隊持續(xù)改進開發(fā)者體驗:
- 更智能的IDE支持:IntelliJ IDEA和VS Code的深度集成
- 更好的錯誤信息:詳細的啟動失敗分析
- 增強的開發(fā)工具:Spring Boot DevTools的持續(xù)改進
- 云原生優(yōu)化:更好的Kubernetes集成
結(jié)論:技術(shù)演進的智慧
Spring的成功并非偶然,而是對開發(fā)者痛點的深刻理解和持續(xù)創(chuàng)新的結(jié)果:
- Spring框架 通過IoC和AOP解決了代碼層面的復(fù)雜性,讓企業(yè)級Java開發(fā)從笨重的EJB中解放出來。
- SpringBoot 通過"約定優(yōu)于配置"解決了配置和部署的復(fù)雜性,讓開發(fā)者能夠快速啟動項目并部署到生產(chǎn)環(huán)境。
- 兩者的關(guān)系不是替代,而是協(xié)同進化。SpringBoot構(gòu)建在Spring之上,繼承了Spring的所有優(yōu)點,并通過自動化消除了其使用上的繁瑣。
關(guān)鍵啟示:
- 優(yōu)秀的框架不僅要解決技術(shù)問題,更要理解開發(fā)者的工作流程
- “簡單"不等于"功能少”,而是隱藏復(fù)雜性,暴露簡潔接口
- 技術(shù)演進是持續(xù)的,保持學(xué)習(xí)才能跟上時代
正如Spring的創(chuàng)始人Rod Johnson所說:“真正的價值不在于框架本身,而在于它如何幫助開發(fā)者構(gòu)建更好的軟件。” Spring和SpringBoot正是這一理念的最佳實踐。
如需獲取更多關(guān)于Spring IoC容器深度解析、Bean生命周期管理、循環(huán)依賴解決方案、條件化配置等內(nèi)容,請持續(xù)關(guān)注本專欄《Spring核心技術(shù)深度剖析》系列文章。
到此這篇關(guān)于Spring成為Java開發(fā)的標(biāo)準(zhǔn)以及SpringBoot如何徹底改變開發(fā)體驗的文章就介紹到這了,更多相關(guān)spring java開發(fā)的標(biāo)準(zhǔn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 如何配置cursor進行Java springboot項目開發(fā)
- java?Springboot對接開發(fā)微信支付詳細流程
- 在Java開發(fā)中無法繞開的SpringBoot框架詳解
- Java?Web開發(fā)常用框架Spring?MVC?Struts示例解析
- Java?Spring的使用注解開發(fā)詳解
- java開發(fā)SpringBoot參數(shù)校驗過程示例教程
- java集成開發(fā)SpringBoot生成接口文檔示例實現(xiàn)
- Java開發(fā)SpringBoot集成接口文檔實現(xiàn)示例
- java開發(fā)SSM框架具有rest風(fēng)格的SpringMVC
- java開發(fā)之基于Validator接口的SpringMVC數(shù)據(jù)校驗方式
相關(guān)文章
Java中Easyexcel?實現(xiàn)批量插入圖片功能
這篇文章主要介紹了Easyexcel?實現(xiàn)批量插入圖片,本文通過實例代碼給大家介紹了easyexcel文檔處理工具、自定義圖片處理器的相關(guān)知識,需要的朋友可以參考下2022-04-04
使用MybatisPlus實現(xiàn)sql日志打印優(yōu)化
本文主要介紹了使用MybatisPlus實現(xiàn)sql日志打印優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
SpringBoot之統(tǒng)一數(shù)據(jù)返回格式的實現(xiàn)示例
本文主要介紹了SpringBoot之統(tǒng)一數(shù)據(jù)返回格式的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-12-12
Spring Security 密碼驗證動態(tài)加鹽的驗證處理方法
小編最近在改造項目,需要將gateway整合security在一起進行認(rèn)證和鑒權(quán),今天小編給大家分享Spring Security 密碼驗證動態(tài)加鹽的驗證處理方法,感興趣的朋友一起看看吧2021-06-06
java文件操作代碼片斷實例實現(xiàn)統(tǒng)計文件中字母出現(xiàn)的個數(shù)功能
本文介紹java讀文件實例,實現(xiàn)統(tǒng)計某一目錄下每個文件中出現(xiàn)的字母個數(shù)、數(shù)字個數(shù)、空格個數(shù)及行數(shù),除此之外沒有其他字符,大家參考使用吧2014-01-01

