UserService.java
public class UserService {
public String getUserName() {
return "John Doe";
}
}
Main.java
public class Main {
public static void main(String[] args) {
// 手动创建 UserService 实例
UserService userService = new UserService();
// 调用服务方法
String userName = userService.getUserName();
System.out.println("User Name: " + userName);
}
}
手动管理依赖:需要手动创建 UserService
实例。
紧耦合:Main
类直接依赖于 UserService
的具体实现。
难以扩展:如果需要替换 UserService
的实现,必须修改 Main
类。
代码结构
UserService
:一个简单的服务类,标记为 Spring 组件。
Application
:Spring Boot 主类,通过 Spring 容器管理依赖。
application.properties
:Spring Boot 配置文件(可选)。
import org.springframework.stereotype.Service;
@Service // 标记为 Spring 组件
public class UserService {
public String getUserName() {
return "John Doe";
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication // 标记为 Spring Boot 应用
public class Application {
@Autowired // 自动注入 UserService
private UserService userService;
public static void main(String[] args) {
// 启动 Spring Boot 应用
ApplicationContext context = SpringApplication.run(Application.class, args);
// 从 Spring 容器中获取 Application 实例
Application app = context.getBean(Application.class);
// 调用服务方法
app.run();
}
public void run() {
String userName = userService.getUserName();
System.out.println("User Name: " + userName);
}
}
ApplicationContext context = SpringApplication.run(Application.class, args);
在 Java 中,每个类在编译后都会生成一个对应的 .class
文件,包含了该类的字节码。
.class
文件记录了类的方法、属性、构造器等信息。Application.class
表示 Application
类的类对象(Class
类型的实例),可用于反射和类型判断等操作。在 SpringApplication.run()
中,Application.class
的主要作用是:
✅ 标识主类位置:
Application.class
所在的包为起点,自动扫描该包及其子包中的 @Component
、@Service
、@Controller
等注解的类。✅ 加载 Spring Boot 配置:
@SpringBootApplication
会触发自动配置机制,加载 application.yml
、application.properties
等配置文件。依赖注入(DI):
Spring 自动管理 UserService
的实例化,并通过 @Autowired
注入到 Application
类中。
无需手动创建对象,降低了代码的耦合度。
控制反转(IoC):
Spring 容器负责管理对象的生命周期和依赖关系。
开发者只需关注业务逻辑,无需关心对象的创建和销毁。
松耦合:
Application
类不直接依赖于 UserService
的具体实现,而是依赖于接口或抽象。
如果需要替换 UserService
的实现,只需修改配置,而无需修改 Application
类。
易于测试:
可以通过 Spring 的测试框架轻松注入模拟对象,进行单元测试。
模块化和可扩展性:
Spring 的模块化设计使得应用程序易于扩展和维护。
例如,可以轻松集成 Spring Data、Spring Security 等模块
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
public class UserService {
public String getUserName() {
return "John Doe";
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
System.out.println("User Name: " + userService.getUserName());
}
}
Spring Boot 示例(自动配置)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public String getUserName() {
return "John Doe";
}
}
@SpringBootApplication
public class Application {
@Autowired
private UserService userService;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
SpringBoot原则:约定优于配置
随着业务复杂度的提升,Java 开发中逐渐暴露出一些问题:
✅ 配置繁琐:大量的 XML 配置
✅ 组件管理复杂:需要手动编写 Bean 实例化、依赖注入等代码
✅ 代码冗余:重复的样板代码(如 JDBC 连接、事务管理等)
Java 的复杂性促使了 Spring 框架的诞生。
✅ 解耦、降低模块间的依赖
✅ 提供更清晰的架构,支持松耦合开发
✅ 简化 Web 应用和数据访问层的开发
✅ 具备优秀的社区和文档支持
尽管 Spring 极大提升了开发效率,但在使用过程中仍存在以下问题:
✅ 配置复杂:大量的 XML 配置文件
✅ 环境搭建繁琐:Bean 管理、事务配置、MVC 设置等步骤较多
✅ 启动过程复杂:需手动配置 Web 服务器(如 Tomcat)
✅ 减少 XML 和 Java 配置(使用yml)
✅ 项目结构简洁,开发效率更高
✅ 内置 Web 服务器,启动更便捷
✅ 兼容传统 Spring 项目,可平滑迁移
1.解耦配置信息和代码
如数据库连接信息、服务端口号、线性池大小等