前言:
在 Java 后端开发中,尤其是 Spring Boot 生态里,“注解(Annotation)”就是一等公民。它可以大幅减少 XML 配置和样板代码。但是很多初学者(甚至写了几个月代码的新手)面对满屏的
@XXX依然会感到懵圈。本文将按照后端开发的**“分层架构(Entity -> Dao -> Service -> Controller)”以及“常用配置”**,为你彻底梳理 Spring Boot 和数据库操作中最核心的注解。看完这篇,再也不用担心看不懂大佬的代码了!
一、 启动与配置基石
万物起源于启动类,这里的注解决定了 Spring Boot 如何跑起来。
1. @SpringBootApplication
位置:项目的主启动类上。
作用:Spring Boot 项目的核心注解。它实际上是三个注解的终极合体:
@SpringBootConfiguration:允许在上下文中注册额外的 bean 或导入其他配置类。@EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。@ComponentScan:扫描当前包及其子包下的所有组件(带有@Component、@Service等注解的类)。
2. @Configuration 与 @Bean
位置:@Configuration 放在类上,@Bean 放在方法上。
作用:替代传统的 XML 配置。@Configuration 告诉 Spring 这是一个配置类,而 @Bean 告诉 Spring:“请运行这个方法,并将返回的对象交给 Spring 容器管理。”
Java
@Configuration
public class AppConfig {
@Bean(name = "myUser")
public User user() {
return new User("张三", 18);
}
}
二、 实体层与数据库映射 (Entity & JPA)
这部分主要用于 JPA(Java Persistence API),负责把 Java 对象(POJO)和数据库的表关联起来。
1. @Entity 与 @Table
@Entity:标注在类上,告诉 JPA 这个类对应数据库里的一张表。@Table:可选。如果表名和类名不一致,可以通过它指定表名,如@Table(name = "t_user")。
2. @Id 与 @GeneratedValue
@Id:标明这个属性是表的主键。@GeneratedValue:指定主键的生成策略。最常用的是GenerationType.IDENTITY(依赖数据库的自增,如 MySQL)。
3. @Column
作用:设置字段的属性(列名、长度、是否为空等)。如果不写,默认列名就是属性名。
Java
@Entity
@Table(name = "t_man")
public class Man {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "username", length = 50)
private String name;
}
三、 持久层 (Dao / Mapper)
这部分负责与数据库进行直接交互。这里分为 JPA 流派和 MyBatis 流派。
1. JPA 流派:@Repository
作用:标注在持久层接口上。通常这个接口会继承 JpaRepository。Spring 会自动为其生成实现类。
Java
@Repository
public interface ManDao extends JpaRepository<Man, Long> {
// 继承后直接拥有基本的 CRUD 方法
Man findByName(String name);
}
2. MyBatis 流派:@Mapper 与 CRUD 注解
@Mapper:标识这是一个 MyBatis 的 Mapper 接口。@Select,@Insert,@Update,@Delete:直接在方法上写对应的 SQL 语句,省去了写 XML 文件的麻烦(适合简单 SQL)。
Java
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(int id);
}
四、 业务逻辑层 (Service)
1. @Service
作用:标识这是一个业务逻辑层的类。被标注的类会被 Spring 容器接管。
2. @Autowired 与 @Resource
作用:依赖注入。把 Spring 容器里已经创建好的对象(比如 Dao 层实例)“塞”到当前类里。
@Autowired是 Spring 提供的,默认按类型注入。@Resource是 JDK 提供的,默认按名称注入。
Java
@Service
public class MyService {
@Autowired // 自动把 manDao 注入进来
private ManDao manDao;
public String getManInfo(){
return manDao.findById(1).toString();
}
}
五、 控制层与参数接收 (Controller)
这是前后端交互的桥梁,负责接收 HTTP 请求并返回数据。
1. @RestController
作用:现在前后端分离项目最常用的注解。它是 @Controller 和 @ResponseBody 的结合体。
- 加了它,类里的所有方法返回的都是数据(通常是 JSON 格式),而不是试图跳转到某个 HTML 页面。
2. 路由映射注解
@RequestMapping:通用的请求映射,可以指定 Method(GET、POST 等)。- 快捷注解:
@GetMapping:等价于@RequestMapping(method = RequestMethod.GET),用于查询。@PostMapping:用于新增。@PutMapping:用于更新。@DeleteMapping:用于删除。
3. 神奇的参数接收注解
这是新手最容易搞混的地方,请牢记:
@RequestParam:获取 URL 查询参数(问号后面的参数)。- URL:
http://localhost/user?id=10 - 代码:
public String getUser(@RequestParam int id)
- URL:
@PathVariable:获取 路径参数(URL 本身的一部分)。- URL:
http://localhost/user/10 - 代码:
@GetMapping("/user/{id}") public String getUser(@PathVariable int id)
- URL:
@RequestBody:获取 请求体(Body)中的 JSON 数据。前端发 POST 请求传对象时必用!- 代码:
public String login(@RequestBody User user)
- 代码:
六、 其他高频组件注解
1. @Component
作用:泛指各种组件。如果一个类不好归类为 @Service、@Controller 或 @Repository,但又想让 Spring 管理它(比如一个工具类、拦截器),就用这个。
2. @Value
作用:从配置文件(application.yml 或 properties)中读取特定的值。
Java
@Value("${server.port}")
private String port;
3. @CrossOrigin
作用:解决前后端分离开发时头疼的跨域问题。直接加在 Controller 类上,允许前端跨域访问。
4. @Aspect
作用:面向切面编程(AOP)。用来定义一个切面,常用于统一处理日志打印、权限校验等,实现代码解耦。
总结打油诗:
启动先找
@SpringBoot,数据库建表
@Entity凑。业务处理
@Service做,接口返回
@RestController收。参数是问号
@RequestParam,路径带值
@PathVariable抠。实体 JSON
@RequestBody,跨域阻拦
@CrossOrigin救!
Comments 2 条评论
瓦达西
哟西哟西