Spring Cloud中的注解
Spring Cloud是一个基于Spring Boot的云服务框架,它为构建分布式系统提供了一套简单易用的工具。Spring Cloud中定义了许多注解来帮助我们者更轻松地构建和配置微服务应用程序。以下是一些Spring Cloud中定义的常用注解的总结:
@EnableEurekaServer:
用于开启Eureka服务注册中心的支持。标注在主类上,表示当前应用是一个Eureka服务注册中心。
@EnableDiscoveryClient:
让当前应用注册到Eureka Server,从而使服务消费者能够找到。标注在主类上,表示当前应用需要注册到服务注册中心,并且可以发现其他服务。
@EnableCircuitBreaker / @EnableHystrix:
开启Hystrix断路器功能,用于处理分布式系统中的故障和延迟,增强系统的弹性。注意,随着Hystrix项目的停止维护,Spring Cloud现在推荐使用其他替代方案,如Resilience4j。
@EnableFeignClients:
开启Feign的支持,Feign是一个声明式的Web Service客户端,使得编写HTTP客户端变得更简单。标注在主类或配置类上,用于扫描和创建Feign客户端的代理。
@FeignClient:
标注在接口上,指定创建一个Feign客户端的详细信息,包括服务ID、URL等。通常与@EnableFeignClients一起使用。
@LoadBalanced:
标注在RestTemplate Bean上,表示开启客户端的负载均衡功能。这样,当从Eureka Server获取到服务提供者的多个实例时,能够均衡地分配请求。
@EnableZuulProxy:
开启Zuul代理的支持,Zuul是一个基于Netflix开源的API网关,提供了动态路由、监控、弹性、安全等功能。标注在主类上,表示当前应用将作为API网关使用。
@RibbonClient:
用于自定义Ribbon客户端的配置。Ribbon是一个客户端负载均衡器,它提供了对HTTP请求的控制,包括服务实例的选择策略等。通常与@LoadBalanced一起使用。
@RefreshScope:
当配置发生变化时,标记了@RefreshScope的Bean会进行刷新,重新加载配置。这对于动态刷新配置非常有用,尤其是在使用Spring Cloud Config时。
@HystrixCommand:
用于声明一个方法需要使用Hystrix断路器来包装。当调用该方法时,如果发生异常或超时,Hystrix会触发相应的回退逻辑。同样地,随着Hystrix的停止维护,开发者可能需要考虑其他替代方案。
@EnableConfigServer:
用于开启Spring Cloud Config Server的支持。标注在主类上,表示当前应用将作为配置服务器,提供外部化配置给其他微服务。
@SentinelResource:
如果你在使用阿里巴巴的Sentinel作为熔断器和限流器,那么这个注解将会很有用。它用于标注在需要保护的方法上,当该方法调用出现问题时(如超时、异常),Sentinel会根据配置进行熔断或限流。
@GatewayFilter 和 @GlobalFilter:
在使用Spring Cloud Gateway作为API网关时,这两个注解用于定义过滤器。@GatewayFilter用于定义针对特定路由的过滤器,而@GlobalFilter用于定义全局过滤器,应用于所有路由。
@StreamListener:
在使用Spring Cloud Stream进行消息驱动微服务开发时,这个注解用于标注方法,表示该方法是一个消息监听器,当接收到指定通道的消息时会被调用。注意,随着Spring Cloud Stream的发展,新的函数式编程模型(使用Java的Function、Consumer等接口)也逐渐成为推荐的使用方式。
@RefreshEndpoint 和 @RestartEndpoint:
这两个注解用于暴露端点,允许通过HTTP请求来刷新配置或重启应用。然而,请注意这些端点可能会暴露敏感操作,因此在使用时应谨慎考虑安全性。
需要注意的是,Spring Cloud是一个不断发展的项目,新的注解和功能可能会不断添加进来,同时一些注解和组件可能已经过时或被替代。因此,建议多去瞅瞅Spring Cloud的官方文档。
Spring中的注解
在Spring 5中,注解是框架的核心特性之一,用于简化配置、声明Bean和处理各种应用程序逻辑。以下是对Spring 5中一些常用注解的总结:
@ComponentScan:让Spring扫描到Configuration类并把它加入到上下文。
@Component:泛指组件,当组件不好归类时,可以使用这个注解进行标注。
@Repository:用于标注数据访问层的组件,即DAO(Data Access Object)层。
@Service:用于标注业务层组件。
@Controller:用于标注控制层组件(如struts中的action)。
@RestController:用于标注控制层组件,所有的方法都直接返回数据,不返回视图,一般配合@RequestMapping注解使用。
@RequestMapping:用于映射Web请求(如URL路径、HTTP方法等)到具体的方法上。
@Autowired:自动装配,byType方式。当有多个同一类型的Bean时,需要配合@Qualifier使用。
@Qualifier:当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。
@Resource(name=“name”,type=“type”):自动装配,byName方式。
@Value:注入Spring Boot application.properties配置的属性的值。
@ConfigurationProperties(prefix = “prefix”):将配置文件中以prefix为前缀的属性值自动绑定到对应的字段中。
@Profile:指定某个Bean在哪个环境配置下才会被注册到容器中。一般用在需要分环境的情况。
@Scope:设置Spring容器如何新建Bean实例。其常见的值有:Singleton(一个Bean容器中只存在一个实例,默认)、Prototype(每次调用新建一个实例)、Request(每次HTTP请求新建一个实例)、Session(一个HTTP Session存在一个实例)。
@PostConstruct和 @PreDestroy:这两个注解被用来修饰一个非静态的void方法,而且这个方法不能有抛出异常。
@PostConstruct注解的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。
@PreDestroy注解的方法会在服务器卸载Servlet的时候运行,同样也只会被服务器调用一次。
@Async:用于标注方法,表示该方法是一个异步方法。Spring会为该方法开启一个新的线程并异步执行该方法,通常与@EnableAsync一起使用。
@EnableAsync:开启异步任务支持,通常用在配置类上。
@Scheduled:用于标注方法,表示该方法是一个定时任务方法。Spring会根据该注解中的参数定时执行该方法,通常与@EnableScheduling一起使用。
@EnableScheduling:开启定时任务支持,通常用在配置类上。
@Transactional:用于标注方法或类,表示该方法或类中的公共方法需要进行事务管理。Spring会为该方法或类中的公共方法开启事务支持,并进行相关的事务管理。
@EnableTransactionManagement:开启注解式事务管理支持,通常用在配置类上。
@Bean:用于标注方法,表示该方法返回的对象需要被注册到Spring容器中。通常用在配置类中,用于定义和注册Bean。
@Primary:当存在多个同类型的Bean时,使用该注解标注的Bean会被优先注入。
@Lazy:用于标注Bean,表示该Bean的初始化可以被延迟到第一次使用时进行,而不是在Spring容器启动时立即进行。
@Import:用于导入其他的配置类,可以将多个配置类组合在一起使用。
@ImportResource:用于导入Spring的xml配置文件,让xml配置和注解配置可以混合使用。
@Conditional:条件注解,满足特定条件时,才会进行Bean的注册或配置类的加载。Spring Boot的自动配置大量使用了这个注解。
@Order 或 @Priority:用于定义Bean的执行顺序,值越小优先级越高。但请注意,@Order是Spring提供的注解,而@Priority是JSR-250规范中的注解,虽然它们的作用相似,但在某些情况下可能存在差异。
@DependsOn:定义Bean的依赖关系,让Spring容器在初始化某个Bean之前先初始化它所依赖的Bean。
@Lookup:用于方法上,表示该方法返回的对象不需要被Spring容器管理,每次调用该方法时都会返回一个新的对象实例。这通常用于原型作用域的Bean。
@EventListener:用于标注方法,表示该方法是一个事件监听器方法。Spring会在相应的事件发生时调用该方法。
@InitBinder:用于自定义数据绑定方法,通常用在Controller中,处理表单数据到JavaBean的绑定过程中的自定义转换和验证。
@ExceptionHandler:用于标注方法,该方法用于处理特定类型的异常,通常与@ControllerAdvice一起使用,提供全局异常处理。
@ControllerAdvice:用于标注类,该类包含@ExceptionHandler、@InitBinder和@ModelAttribute注解的方法,这些方法会应用到多个Controller上。
@ModelAttribute:用于方法参数上,表示该参数的值将会从模型(Model)中获取;或者用于方法上,表示该方法会在每个@RequestMapping方法之前被调用,用于初始化Web请求的一些共享数据。
@SessionAttributes:用于标注类,表示将模型中的某些属性存储到HttpSession中,以便在多个请求之间共享这些属性。
@RequestMapping的变种:
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping:这些是HTTP方法映射的简写形式,分别对应HTTP的GET、POST、PUT、DELETE、PATCH方法。
@PathVariable:用于获取URI模板变量(即URL中的占位符)的值。
@RequestParam:用于获取查询参数的值。
@RequestBody:用于读取HTTP请求的内容(如JSON),并将其反序列化为Java对象。
@ResponseBody:表示Controller的方法返回的结果直接写入HTTP response body中,一般用于返回JSON数据或者是XML数据。在Spring 4.0之后,可以使用@RestController替代@Controller和@ResponseBody的组合。
@ResponseStatus:用于标注异常类,表示当抛出该异常时,应该返回给客户端的HTTP状态码。
@HttpStatus:用于定义HTTP状态码的常量类。
@RequestHeader:用于获取HTTP请求头的值。
@CookieValue:用于获取HTTP请求中的Cookie值。
@RequestMethod:用于指定HTTP请求的方法类型,但通常更推荐使用@GetMapping、@PostMapping等更具体的注解。
@RequestPart:用于处理multipart/form-data类型的请求数据,常用于文件上传。
@Valid:用于验证Bean的属性是否符合约束条件,通常与JSR-303/JSR-380验证注解(如@NotNull、@Size等)一起使用。
@CrossOrigin:用于处理CORS(跨来源资源共享)的配置,可以定义哪些外部域可以访问当前资源。
这些注解涵盖了Spring MVC和Spring WebFlux中处理Web请求的大部分场景。Spring框架还提供了很多其他注解来处理AOP、事务管理、安全性、测试等方面的功能,上面列出的注解是在日常开发中常用的一些吧。
Spring Boot中的注解
Spring Boot是一个基于Spring的框架,旨在简化Spring应用的初始化和开发过程。它提供了大量的注解来自动配置和简化应用程序的开发。以下是Spring Boot框架中定义的一些常用注解的总结:
@SpringBootApplication:
这是Spring Boot的核心注解,通常标注在主类上。它实际上是一个复合注解,包括了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。
@SpringBootConfiguration:
标注在某个类上,表示这是一个Spring Boot的配置类,实际上它继承自@Configuration,因此也可以替代为@Configuration。
@EnableAutoConfiguration:
让Spring Boot根据类路径中的jar包、类,以及各种属性设置来自动配置项目。它会自动地为你配置好所需的Bean,无需手动配置。
@ComponentScan:
让Spring扫描到@Component、@Controller、@Service等注解的类,并将它们注册为Spring的Bean。如果不指定包路径,默认会扫描主类所在的包及其子包。
@ConfigurationProperties:
将配置文件中的属性绑定到一个Java对象上。通常需要与@Component或@Configuration一起使用,以便将对象注册到Spring容器中。
@PropertySource:
指定属性文件的路径,用于加载配置文件中的属性。通常与@ConfigurationProperties一起使用。
@Value:
注入Spring Boot application.properties中定义的属性值。可以直接将属性值注入到字段、构造函数参数或方法参数中。
@Profile:
指定某个Bean在特定的环境配置下才会被注册到容器中。可以用来实现不同环境下使用不同的配置或Bean。
@Conditional:
条件注解,当满足特定条件时,才会进行Bean的注册或配置类的加载。Spring Boot的自动配置大量使用了这个注解。
@Import:
用于导入其他的配置类,让多个配置类可以组合在一起使用。也可以用来导入一些特定的Bean定义。
@Component、@Service、@Repository、@Controller、@RestController:
这些都是Spring的注解,但在Spring Boot中同样适用。它们分别用于标注组件、业务层组件、数据访问层组件、控制器和RESTful风格的控制器。
@Autowired、@Qualifier、@Resource:
用于自动装配Bean的注解。@Autowired按类型装配,当有多个同类型的Bean时,可以使用@Qualifier指定Bean的名称。@Resource按名称装配,可以指定Bean的名称。
@RequestMapping及其变种(@GetMapping、@PostMapping、@PutMapping、@DeleteMapping等):
用于映射Web请求到具体的方法上。可以指定URL路径、HTTP方法等信息。
@PathVariable、@RequestParam、@RequestBody、@ResponseBody:
用于处理Web请求和响应的注解。分别用于获取URL模板变量的值、获取查询参数的值、读取请求体和写入响应体。
@ExceptionHandler、@ControllerAdvice:
用于全局异常处理的注解。可以定义全局的异常处理方法,无需在每个Controller中都定义。
@Lob:用于标注字段,表示该字段将映射到数据库的大对象类型,如BLOB或CLOB。
@Transactional:用于标注方法或类,表示该方法或类中的所有public方法都需要在一个事务中执行。如果标注在类上,则类中的所有public方法都会继承该事务属性。
@EnableJpaRepositories:用于开启JPA仓库的支持,并指定扫描的包路径。它会自动扫描指定包路径下的接口,并为这些接口创建代理实现类。
@EnableTransactionManagement:用于开启Spring的事务管理支持。通常与@Transactional一起使用,以确保事务的正确执行。
@EnableCaching:用于开启Spring的缓存支持。它会自动配置一个合适的缓存管理器,并允许你使用注解如@Cacheable、@CacheEvict等来定义缓存行为。
@EnableScheduling:用于开启Spring的计划任务支持。它允许你使用@Scheduled注解来定义计划任务。
@EnableAsync:用于开启Spring的异步方法支持。它允许你使用@Async注解来定义异步方法,这些方法将在单独的线程中执行。
@EnableWebMvc:在Spring Boot应用程序中,这个注解通常不需要显式添加,因为Spring Boot已经自动配置了WebMvc的相关内容。但在某些情况下,你可能需要自定义WebMvc的配置,此时可以使用这个注解。
@EnableWebFlux:用于开启Spring WebFlux的支持,这是Spring的反应式编程模型。它允许你使用反应式编程风格来处理Web请求。
@EnableConfigurationProperties:让Spring Boot能够识别和处理@ConfigurationProperties注解的类。通常与@ConfigurationProperties一起使用,以便将配置文件中的属性绑定到Java对象上。
@RestControllerAdvice:是@ControllerAdvice和@ResponseBody的组合注解,用于全局处理RESTful API的异常和数据绑定。它可以结合@ExceptionHandler、@InitBinder和@ModelAttribute等注解使用。
@RequestMappingHandlerAdapter 和 @RequestMappingHandlerMapping:这两个注解不是直接用于标注代码,而是Spring MVC内部使用的关键组件。它们负责处理请求映射和请求处理的相关逻辑。在大多数情况下,你不需要直接与这些组件打交道,但了解它们的存在和职责有助于更好地理解Spring MVC的工作原理。
综上所述,Spring、Spring Boot和Spring Cloud共同构成了一个完整且强大的Java企业级应用开发生态。它们通过注解的方式提供了丰富的功能和灵活性,使得开发者能够更加高效地构建、部署和管理复杂的应用系统。无论是传统的单体应用还是现代的微服务架构,Spring家族都能提供强大的支持和便捷的开发体验。