Spring 约定编程案例与示例
案例 1:组件自动扫描(@ComponentScan
)
描述:通过包路径约定自动扫描组件,无需逐个配置Bean。
代码示例:
java
// 1. 目标组件(无需XML配置)
@Component // 使用Spring标准注解
class MyService {
public void sayHello() {
System.out.println("Hello from MyService!");
}
}
// 2. 配置类(约定包路径)
@Configuration
@ComponentScan("com.example.service") // 自动扫描该包下所有组件
public class AppConfig {}
// 3. 运行类
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
MyService service = context.getBean(MyService.class);
service.sayHello(); // 输出:Hello from MyService!
}
}
案例 2:REST 控制器映射(@RestController
)
描述:通过注解约定自动映射HTTP请求,无需XML配置。
代码示例:
java
// 1. 控制器类(约定路径前缀)
@RestController
@RequestMapping("/api") // 根路径约定
class UserController {
@GetMapping("/users") // URL路径约定
public String getUsers() {
return "User list endpoint";
}
}
// 2. 启动类(Spring Boot约定)
@SpringBootApplication // 自动配置Web环境
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
// 运行后访问 http://localhost:8080/api/users 返回 "User list endpoint"
案例 3:Spring Boot 自动配置(@SpringBootApplication
)
描述:通过注解约定自动配置内嵌服务器、组件扫描等。
代码示例:
java
// 1. 主启动类(单文件约定)
@SpringBootApplication // 包含@ComponentScan和@EnableAutoConfiguration
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
// 2. 自动注册Bean(无需XML)
@Component
class AutoConfiguredBean {
public AutoConfiguredBean() {
System.out.println("Auto-configured bean initialized!");
}
}
// 启动时自动输出:Auto-configured bean initialized!
案例 4:JPA 实体类命名约定
描述:通过实体类命名约定自动关联数据库表名。
代码示例:
java
// 1. 实体类(表名约定)
@Entity
public class User { // 表名默认为 "user"
@Id
@GeneratedValue
private Long id;
private String name;
// getters/setters
}
// 2. Spring Data JPA 接口(方法名约定)
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByName(String name); // 自动生成SQL查询
}
// 3. 使用示例
@Service
public class UserService {
@Autowired
private UserRepository repository;
public List<User> findUsersByName(String name) {
return repository.findByName(name);
}
}
案例 5:日志记录约定(@Slf4j
)
描述:通过Lombok注解约定自动注入日志对象。
代码示例:
java
// 1. 添加Lombok依赖(pom.xml)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
// 2. 使用注解约定
@Slf4j // 自动生成日志对象 "log"
@Component
public class MyService {
public void doWork() {
log.info("Processing task..."); // 直接使用log对象
}
}
案例总结表
案例名称 | 核心约定 | 代码关键点 | 核心注解/配置 |
---|---|---|---|
组件自动扫描 | 通过包路径约定自动注册Bean | @ComponentScan("包路径") + @Component 注解的类自动被扫描 |
@ComponentScan , @Component |
REST 控制器映射 | 通过注解约定HTTP方法和路径 | @RestController + @RequestMapping /@GetMapping 等路径映射注解 |
@RestController , @RequestMapping |
Spring Boot 自动配置 | 通过注解启用内嵌服务器、组件扫描和自动配置 | @SpringBootApplication 等效于 @Configuration , @ComponentScan , @EnableAutoConfiguration |
@SpringBootApplication |
JPA 实体类命名 | 实体类名默认对应数据库表名(如 User 对应表 user ) |
@Entity 注解的类名自动映射为小写表名 |
@Entity , Spring Data JPA方法名约定 |
Lombok 日志约定 | 通过注解自动生成日志对象(无需手动创建Logger ) |
@Slf4j 注解自动生成log 对象 |
@Slf4j (Lombok) |
关键约定说明
- 包路径约定:组件扫描默认从主类所在包及子包开始扫描。
- REST路径约定 :
@RequestMapping
的路径前缀可复用,方法名如saveUser
自动映射为/save-user
。 - Spring Boot 自动配置 :
@SpringBootApplication
会自动启用内嵌Tomcat、静态资源处理等。 - JPA 方法名约定 :
findByName
等方法名按规则自动生成查询SQL。 - Lombok注解:通过注解自动生成setter/getter、构造函数等代码。