在Java里,@Override 不是Spring Boot特有的注解,但它非常重要且常用。
@Override 用于标记一个方法,告诉编译器这个方法是重写父类(或实现接口)中的方法。这就好比儿子继承了父亲的某项技能,但儿子觉得可以把这个技能改进一下,做得更好,于是儿子就“重写”了这个技能的实现方式。
来看个简单例子:
class Animal {public void makeSound() {System.out.println("Animal makes a sound");}}class Dog extends Animal {// 使用 @Override 注解标记这是重写的方法@Overridepublic void makeSound() {System.out.println("Dog barks");}}
在这个例子里,Dog 类继承自 Animal 类,Dog 类重写了 Animal 类的 makeSound 方法。使用 @Override 注解有几个好处:
- 编译检查:如果不小心拼错方法名,或者方法参数、返回类型与父类不一致,编译器会报错,这样能及时发现错误,避免运行时出现意外情况。要是没有这个注解,即使写错方法,程序可能不会马上报错,但运行结果肯定不对,排查错误就更麻烦。
- 代码可读性:看到
@Override注解,其他人就能清楚知道这个方法是从父类或接口重写来的,让代码逻辑更清晰,理解起来更容易。
Spring Boot 3.5包含了许多常用注解,以下是一些主要的注解介绍:
- 核心配置注解:
- @SpringBootApplication:标注在主启动类上,是组合注解,包含
@Configuration、@EnableAutoConfiguration和@ComponentScan功能,用于开启自动配置、组件扫描等,标志着Spring Boot应用的入口。 - @EnableAutoConfiguration:开启自动配置功能,让Spring Boot根据类路径下的依赖自动配置应用。
- @Configuration:标记一个类为配置类,相当于传统的
applicationContext.xml配置文件,可与@Bean注解搭配使用来声明Bean。
- @SpringBootApplication:标注在主启动类上,是组合注解,包含
- 组件注册与管理注解:
- @Component:通用组件注解,用于将普通Java类标记为Spring容器管理的Bean,可用于工具类等。
- @Service:用于标注业务逻辑层(Service层)的类,是
@Component的特化注解,使代码架构层次更清晰。 - @Repository:标注数据访问层(DAO层或Repository层)的类,除注册Bean外,还提供持久化异常转换功能。
- @Bean:方法级别的注解,作用于
@Configuration或@Component标注的类中,用于将方法返回的对象注册为Spring应用上下文中的Bean。
- 请求处理与控制器注解:
- @Controller:标注Spring MVC的控制层类,处理HTTP请求,通常配合
@RequestMapping使用,方法返回值一般是视图名称。 - @RestController:等同于
@Controller+@ResponseBody,用于构建RESTful API,方法返回对象会直接写入HTTP响应体,如JSON格式。 - @RequestMapping:可用于类和方法上,指定方法处理哪些HTTP请求,支持多种请求方式。还有其简化注解
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping,分别用于处理GET、POST、PUT、DELETE请求。
- @Controller:标注Spring MVC的控制层类,处理HTTP请求,通常配合
- 依赖注入与属性管理注解:
- @Autowired:用于自动装配Bean,默认按类型注入。
- @Qualifier:常与
@Autowired配合使用,当有多个同类型Bean时,用于指定注入特定的Bean。 - @Value:用于读取配置文件中的单个配置项。
- 条件注解:
- @ConditionalOnClass:当类路径下存在指定类时,才会生效相关配置或创建Bean。
- @ConditionalOnMissingClass:与
@ConditionalOnClass相反,类路径下不存在指定类时生效。 - @ConditionalOnProperty:当配置文件中存在指定属性且属性值符合条件时生效。
- 其他注解:
- @Profile:根据不同的环境配置文件(如dev、prod等),来决定Bean是否生效。
- @ControllerAdvice:用于定义全局的异常处理、数据预处理等,配合
@ExceptionHandler注解可处理控制器中的异常。
事务管理注解
- @Transactional:这个注解用于开启事务管理。
- rollbackFor属性:像你提到的
@Transactional(rollbackFor = Exception.class),这里rollbackFor指定了在遇到Exception类型及其子类异常时,事务要进行回滚。比如在一个转账操作中,如果出现任何异常(比如余额不足等自定义异常或者系统运行时异常),就回滚整个事务,确保数据的一致性。 - noRollbackFor属性:与
rollbackFor相反,它指定遇到哪些异常时事务不进行回滚。 - propagation属性:定义事务的传播行为。例如
Propagation.REQUIRED(默认值),表示如果当前没有事务,就新建一个事务,如果已经存在一个事务中,就加入到这个事务中。Propagation.REQUIRES_NEW则表示每次都新建一个新事务,并暂停当前事务。
- rollbackFor属性:像你提到的
测试相关注解
- @SpringBootTest:用于对Spring Boot应用进行集成测试。它会启动整个Spring应用上下文,让你可以测试各个组件之间的交互。
- @MockBean:在测试中创建一个模拟的Bean,用于替换真实的Bean。比如在测试Service层时,如果它依赖于一个外部的DAO层,而你不想真的去调用DAO层的数据库操作,就可以用
@MockBean来创建一个模拟的DAO Bean,设置其返回值,从而专注于测试Service层的业务逻辑。 - @SpyBean:与
@MockBean类似,但@SpyBean会保留被模拟Bean的部分真实行为。例如,你只想模拟Bean中的某个方法,而其他方法还是按原逻辑执行,就可以用@SpyBean。
切面编程(AOP)注解
- @Aspect:标识一个类为切面类,切面类包含了切点和通知。
- @Pointcut:定义切点,切点指定了哪些方法会被切面拦截。比如
@Pointcut("execution(* com.example.demo.service.*.*(..))")表示拦截com.example.demo.service包下所有类的所有方法。 - @Before:前置通知,在目标方法执行前执行。比如可以在方法执行前进行权限检查。
- @After:后置通知,在目标方法执行后执行,无论方法是否抛出异常。
- @AfterReturning:返回通知,在目标方法正常返回后执行,可以获取到方法的返回值进行一些处理。
- @AfterThrowing:异常通知,在目标方法抛出异常时执行。
配置绑定注解
- @ConfigurationProperties(prefix = “xxx”):将配置文件中以指定前缀开头的属性,批量绑定到一个Java类上。例如配置文件中有
server.port,你可以创建一个类,用@ConfigurationProperties(prefix = "server"),然后定义port字段,Spring Boot会自动将server.port的值绑定到这个字段上。
异步处理注解
- @EnableAsync:在配置类上使用,开启异步处理功能。
- @Async:标注在方法上,表明该方法是异步执行的。比如有一个耗时的任务,标记为
@Async后,调用这个方法时不会阻塞主线程,而是在一个新的线程中执行。
