当前位置: 首页 > news >正文

Spring 约定编程案例与示例

Spring 约定编程案例与示例


案例 1:组件自动扫描(@ComponentScan

描述:通过包路径约定自动扫描组件,无需逐个配置Bean。

代码示例

// 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配置。

代码示例

// 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

描述:通过注解约定自动配置内嵌服务器、组件扫描等。

代码示例

// 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 实体类命名约定

描述:通过实体类命名约定自动关联数据库表名。

代码示例

// 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注解约定自动注入日志对象。

代码示例

// 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)

关键约定说明
  1. 包路径约定:组件扫描默认从主类所在包及子包开始扫描。
  2. REST路径约定@RequestMapping的路径前缀可复用,方法名如saveUser自动映射为/save-user
  3. Spring Boot 自动配置@SpringBootApplication会自动启用内嵌Tomcat、静态资源处理等。
  4. JPA 方法名约定findByName等方法名按规则自动生成查询SQL。
  5. Lombok注解:通过注解自动生成setter/getter、构造函数等代码。
http://www.dtcms.com/a/97013.html

相关文章:

  • uv 命令用conda命令解释
  • iOS抓包-charles和Stream
  • SAP:越来越多组织通过AI解决数据问题,迈向大规模应用
  • leetcode33.搜索旋转排序数组
  • 云原生四重涅槃·破镜篇:混沌工程证道心,九阳真火锻金身
  • 【商城实战(93)】商城高并发实战:分布式锁与事务处理深度剖析
  • Linux驱动编程 - UVC驱动分析
  • Java Optional:优雅处理空值的艺术,告别NullPointerException
  • 高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系
  • 小林coding-17道Java基础面试题
  • MySQL 基础查询语句参考手册
  • 【Zabbix技术系列文章】第①篇——基础入门
  • CSS学习笔记5——渐变属性+盒子模型阶段案例
  • ubuntu 升级补丁,备份备份备份
  • JAVA学习*异常
  • CSS-BFC(块级格式化上下文)
  • 主流大模型采用的架构、注意力机制、位置编码等汇总表
  • 【SECS】初识SECS协议
  • MiniRAG检索流程详细图解
  • #VCS# 关于 +incdir+xxx 编译选项的注意点
  • #前端js发异步请求的几种方式
  • 【AI语音】edge-tts实现文本转语音,免费且音质不错
  • 指针 --1
  • RS232转Profinet网关技术,检漏仪新篇章!
  • 深度融合华为鸿蒙生态,嘀嗒出行重构顺风车出行新体验
  • 「HTML5+Canvas实战」星际空战游戏开发 - 纯前端实现 源码即开即用【附演示视频】
  • 18-背景渐变与阴影(CSS3)
  • C++ | constexpr
  • Linux服务器怎样根据端口找到对应启动的服务
  • TCSVT审稿学习笔记