Spring Boot 是一款十分盛行的 Java 结构,其注解用法杂乱而丰富。 在介绍 Spring Boot 的注解之前,咱们需求先了解 Spring 结构中的 AOP(面向切面编程)概念。 Spring 的 AOP 可以帮助开发者完成一些非事务功用的代码,如日志记录、性能监控等。这些功用可以通过界说一个 Aspect(切面) 类来完成。

在 Spring Boot 中,除了常规的 AOP 注解外,还有以下几类注解,这也是我看到一个脑图后的一点点收获,想要自己也可以总结总结所用到的注解,常记定能有所感悟。

  1. 核心注解
  2. 原型注解
  3. SpringBoot注解
  4. SpringCloud注解
  5. 缓存注解
  6. 测验注解
  7. 数据库拜访注解
  8. JPA注解
  9. SpringMVC跟REST注解
  10. 大局反常处理注解

Spring Boot 开发离不开这些注解,快来学习啦!
接下来咱们将别离介绍这几类注解及其运用办法。

一、核心注解

@Configuration

@Configuration 注解可以被用来符号一个类,表明这个类是一个 Bean 装备类。在装备类中,咱们可以运用其他 Bean 的界说和依靠,甚至可以运用 @Autowired@Value 注解将其他 Bean 注入到当时的 Bean 中。下面是一个简略的例子:

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

@Autowired

@Autowired 注解可以将一个 Bean 主动注入到当时类中。默认情况下,@Autowired 的匹配规则是根据类型进行匹配。如果有多个类型相同的 Bean,可以运用 @Qualifier 进行限定。

@Component
public class MyController {
    private final MyService myService;
    @Autowired
    public MyController(MyService myService) {
        this.myService = myService;
    }
}

@Value

@Value 注解用于从装备文件或环境变量中获取值,可以注入 String、int、long、double、boolean 等类型。运用 ${} 可以引证装备文件中的特点,运用 $() 可以引证系统环境变量。

例如:

@Component
public class MyComponent {
    @Value("${my.config.property}")
    private String configProperty;
    @Value("$MY_ENV_VAR")
    private String envVar;
}

@Bean

@Bean 注解用于界说一个 Bean,将其加入到 Spring 容器中。通常在 @Configuration 类中运用。可以指定该 Bean 的称号、效果域、相关依靠等。

@Configuration
public class AppConfig {
    @Bean(name = "myService", scope = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public MyService myService() {
        return new MyServiceImpl();
    }
}

@ComponentScan

@ComponentScan 注解用于扫描包中的组件(包含 Bean、Controller 等),将这些组件加入到 Spring 容器中。

@Configuration
@ComponentScan(basePackages = { "com.example" })
public class AppConfig {
}

@EnableAutoConfiguration

@EnableAutoConfiguration 注解可以主动装备 Spring Boot 应用程序。在启用该注解时,Spring Boot 将根据类路径和装备文件中的信息来尝试猜想并装备应用程序。

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

二、原型注解

@Scope

@Scope 注解用于设置 Bean 的效果域,包含 Singleton、Prototype、Request、Session 等。默认情况下,Bean 是 Singleton 的。

@Configuration
public class AppConfig {
    @Bean(name = "myService")
    @Scope( ConfigurableBeanFactory.SCOPE_PROTOTYPE )
    public MyService myService() {
        return new MyServiceImpl();
    }
}

@Lazy

@Lazy 注解用于符号一个 Bean 延迟初始化。当容器从 XML 文件、Java 装备类或其他方式加载时,不会创立这个 Bean。

@Configuration
public class AppConfig {
    @Bean(name = "myService")
    @Lazy
    public MyService myService() {
        return new MyServiceImpl();
    }
}

@DependsOn

@DependsOn 注解用于标识 Bean 之间的依靠联系。在容器发动时,先创立 @DependsOn 注解中指定的 Bean,再创立当时 Bean。

@Configuration
public class AppConfig {
    @Bean(name = "myService")
    public MyService myService() {
        return new MyServiceImpl();
    }
    @Bean(name = "myController")
    @DependsOn("myService")
    public MyController myController() {
        return new MyController(myService());
    }
}

三、SpringBoot注解

@SpringBootApplication

@SpringBootApplication 注解是一个组合注解,等价于一起运用 @Configuration@EnableAutoConfiguration@ComponentScan 注解。它用于符号主类,并告知 Spring Boot 发动该应用程序。

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

@RestController

@RestController 注解表明控制器中所有办法都回来 JSON 格式数据。它是 Spring MVC 中 @Controller 注解的扩展。下面是一个简略的例子:

@RestController
public class MyController {
    @GetMapping("/greeting")
    public String greeting() {
        return "Hello, world!";
    }
}

@RequestMapping

@RequestMapping 注解用于映射 HTTP 恳求。可以运用 value 特点指定 URL 映射,运用 method 特点指定恳求办法。

@RestController
@RequestMapping("/api")
public class MyController {
    @GetMapping("/greeting")
    public String greeting() {
        return "Hello, world!";
    }
}

@GetMapping

@GetMapping 注解等同于 @RequestMapping(method = RequestMethod.GET),用于映射 HTTP GET 恳求。

@RestController
@RequestMapping("/api")
public class MyController {
    @GetMapping("/greeting")
    public String greeting() {
        return "Hello, world!";
    }
}

@PostMapping

@PostMapping 注解等同于 @RequestMapping(method = RequestMethod.POST),用于映射 HTTP POST 恳求。

@RestController
@RequestMapping("/api")
public class MyController {
    @PostMapping("/greeting")
    public String greeting() {
        return "Hello, world!";
    }
}

@PutMapping

@PutMapping 注解等同于 @RequestMapping(method = RequestMethod.PUT),用于映射 HTTP PUT 恳求。

@RestController
@RequestMapping("/api")
public class MyController {
    @PutMapping("/greeting")
    public String greeting() {
        return "Hello, world!";
    }
}

@DeleteMapping

@DeleteMapping 注解等同于 @RequestMapping(method = RequestMethod.DELETE),用于映射 HTTP DELETE 恳求。

@RestController
@RequestMapping("/api")
public class MyController {
    @DeleteMapping("/greeting")
    public String greeting() {
        return "Hello, world!";
    }
}

@RequestParam

@RequestParam 注解用于将恳求参数映射到办法的参数中。可以运用 value 特点指定参数名,运用 required 特点指定是否必填,运用 defaultValue 特点指定默认值。

@RestController
@RequestMapping("/api")
public class MyController {
    @GetMapping("/greeting")
    public String greeting(@RequestParam("name") String name) {
        return "Hello, " + name + "!";
    }
}

@PathVariable

@PathVariable 注解用于将 URL 中的占位符映射到办法的参数中。可以运用 value 特点指定占位符称号。

@RestController
@RequestMapping("/api")
public class MyController {
    @GetMapping("/{name}")
    public String greeting(@PathVariable("name") String name) {
        return "Hello, " + name + "!";
    }
}

@RequestBody

@RequestBody 注解用于从恳求体中获取数据。通常用于处理 POST、PUT 恳求。

@RestController
@RequestMapping("/api")
public class MyController {
    @PostMapping("/greeting")
    public String greeting(@RequestBody GreetingRequest request) {
        return "Hello, " + request.getName() + "!";
    }
}
public class GreetingRequest {
    private String name;
    // getters and setters
}

@ResponseBody

@ResponseBody 注解表明该办法回来的成果直接输出到响应体中。

@RestController
@RequestMapping("/api")
public class MyController {
    @GetMapping("/greeting")
    @ResponseBody
    public String greeting() {
        return "Hello, world!";
    }
}

@ResponseStatus

@ResponseStatus 注解用于指定恳求处理完成后的状态码。

@RestController
@RequestMapping("/api")
public class MyController {
    @GetMapping("/greeting")
    @ResponseStatus(HttpStatus.OK)
    public String greeting() {
        return "Hello, world!";
    }
}

@ExceptionHandler

@ExceptionHandler 注解用于处理恳求抛出的反常。

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(IllegalArgumentException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorResult handleIllegalArgumentException(IllegalArgumentException ex) {
        return new ErrorResult(ex.getMessage());
    }
}
public class ErrorResult {
    private String message;
    public ErrorResult(String message) {
        this.message = message;
    }
    // getters and setters
}

四、SpringCloud注解

@EnableDiscoveryClient

@EnableDiscoveryClient 注解用于启用服务发现功用。运用该注解后,应用程序可以将自己注册到 Eureka 服务器,并从中获取其他实例的信息。

@SpringBootApplication
@EnableDiscoveryClient
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

@LoadBalanced

@LoadBalanced 注解用于符号 RestTemplate Bean,以启用负载均衡功用。在运用 REST 恳求时,RestTemplate 将根据服务名主动挑选一个可用的实例。

@Configuration
public class AppConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@FeignClient

@FeignClient 注解用于界说一个 Feign 客户端。Feign 是一款用于简化 HTTP API 客户端的东西,它支持声明式 REST 客户端。运用 @FeignClient 注解后,咱们可以通过接口来调用具有相同功用的微服务。

@FeignClient(name = "my-service")
public interface MyServiceClient {
    @GetMapping("/greeting")
    String greeting();
}

五、缓存注解

@Cacheable

@Cacheable 注解表明办法的成果应该被缓存起来,下次调用该办法时,如果参数和之前相同,则回来缓存成果。

@Service
public class MyService {
    @Cacheable("greetingCache")
    public String greeting(String name) {
        return "Hello, " + name + "!";
    }
}

@CachePut

@CachePut 注解表明办法的成果应该被缓存起来,下次调用该办法时,不会回来缓存成果,而是重新计算成果并缓存起来。

@Service
public class MyService {
    @CachePut("greetingCache")
    public String greeting(String name) {
        return "Hello, " + name + "!";
    }
}

@CacheEvict

@CacheEvict 注解表明办法履行后从缓存中删去指定项。

@Service
public class MyService {
    @CacheEvict("greetingCache")
    public void clearGreetingCache() {
    }
}

六、测验注解

@SpringBootTest

@SpringBootTest 注解用于测验 Spring Boot 应用程序。它会创立一个完整的 Spring 应用程序上下文,并在测验期间运用它。

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class MyControllerTest {
    @Autowired
    private TestRestTemplate restTemplate;
    @Test
    public void testGreeting() {
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("/api/greeting", String.class);
        assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(responseEntity.getBody()).isEqualTo("Hello, world!");
    }
}

@MockBean

@MockBean 注解用于模拟一个 Bean 的完成。在测验过程中,可以运用 Mockito.when() 等办法来指定一些行为。

@SpringBootTest
public class MyServiceTest {
    @Autowired
    private MyService myService;
    @MockBean
    private MyRepository myRepository;
    @Test
    public void testFindById() {
        Mockito.when(myRepository.findById(1L)).thenReturn(Optional.of(new MyEntity()));
        MyEntity entity = myService.findById(1L);
        assertThat(entity).isNotNull();
        Mockito.verify(myRepository).findById(1L);
    }
}

七、数据库拜访注解

@Transactional

@Transactional 注解用于指定一个办法需求在事务中履行。默认情况下,只有 RuntimeException 会触发事务回滚。

@Service
public class MyService {
    @Autowired
    private MyRepository myRepository;
    @Transactional
    public void save(MyEntity entity) {
        myRepository.save(entity);
    }
}

@Repository

@Repository 注解用于符号数据拜访层,表明这个类是一个数据仓库

@Repository
public interface MyRepository extends JpaRepository<MyEntity, Long> {
}

@Entity

@Entity 注解用于符号实体类,表明这个类是一个 JPA 实体。它与数据库中的表相对应。

@Entity
@Table(name = "my_entity")
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // getters and setters
}

@Id

@Id 注解用于符号主键字段。

@Entity
@Table(name = "my_entity")
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // getters and setters
}

@GeneratedValue

@GeneratedValue 注解用于指定主键的生成战略。

@Entity
@Table(name = "my_entity")
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // getters and setters
}

@Column

@Column 注解用于指定实体特点与数据库表列之间的映射联系。

@Entity
@Table(name = "my_entity")
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    // getters and setters
}

八、JPA注解

@EnableJpaRepositories

@EnableJpaRepositories 注解用于启用 Spring Data JPA 功用。它会主动装备 Spring Data JPA 相关的 Bean。

@SpringBootApplication
@EnableJpaRepositories
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

@Query

@Query 注解用于自界说查询语句。

@Repository
public interface MyRepository extends JpaRepository<MyEntity, Long> {
    @Query("select e from MyEntity e where e.name = :name")
    List<MyEntity> findByName(@Param("name") String name);
}

九、大局反常处理注解

@ControllerAdvice

@ControllerAdvice 注解用于界说一个大局反常处理类,用于捕获所有控制器中抛出的反常,进行一致处理。

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(HttpServletRequest request, Exception ex) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", ex);
        mav.addObject("url", request.getRequestURI());
        mav.setViewName("error");
        return mav;
    }
}

以上是 Spring Boot 中常见的注解和运用办法,终于干完了,虽然相关注解还有许多,今后一点一点充实这篇文章吧。