Spring Boot的常用注解

未来的框架趋势是“约定大于配置”,代码的封装会更加严密。开发人员会将更多的精力放在代码的整体优化和业务逻辑上,所以注解式编程会被更加广泛地使用。那么什么是注解?Spring Boot的常用注解有哪些?

什么是注解?

注解(annotations)是来定义一个类、属性或一些方法,以便程序能被编译处理。它相当于一个说明文件,告诉应用程序某个被注解的类或属性是什么,要怎么处理。注解可以用于标注包、类、方法和变量等。比如在《初识Spring Boot》一文中新建工程中的HelloWorldController类文件标注HelloWorldController类使用的@RestController注解。

@RestController
public class HelloWorldController {
  ……
}

常用注解

使用在类名上的注解

@RestController

它用于返回JSON、XML等数据,但不能反悔HTML页面。相当于注解@ResponseBody和@Controller合在一起的作用。

@Controller

它用于标注控制器层,在MVC开发模式中代表C(控制器)。所以@Controller主要用于构建MVC模式的程序。

以下两段代码是等效的。

@RestController
public class Demo{
  @RequestMapping("/demoUrl")
  public String Hello() throws Exception {
    return "Hello World!";
  }
}
@Controller
public class Demo{
  @RequestMapping("/demoUrl")
  @ResponseBody
  public String Hello() throws Exception {
    return "Hello World!";
  }
}

@Service

它用于声明一个业务处理类(实现非接口类),用于标注服务层,处理业务逻辑。

比如,想要处理关于产品的一些功能(增删改查)

/**
* Description: 实现处理关于产品的功能
*/
@Service
public class ProductServiceImpl implements ProductService {
  ……
}

@Repository

它用于标注数据访问层,即DAO层(也有叫Mapper层)。它表示一个仓库,主要用于封装对于数据库的访问。换句话说,@Repository注解修饰哪个类表明这个类具有对数据库CRUD的功能,用在持久层的接口上。

比如,通过产品名称,查找某个产品。

@Repository
public interface ProductRepository {
  ProductEntity findProductByProductName(String productName)
}

@Component

它用于把普通POJO(Plain Ordinary Java Objects,简单的Java对象)实例化到Spring容器中,当类不属于注解@Controller和@Service等时,就可以使用注解@Component来标注这个类。它可配合CommandLineRunner使用,以便在程序启动后执行一些基础任务。

@Configuration

它用于标注配置类,并且可以由Spring容器自动处理。它作为Bean(Bean,指任何被 Spring 加载生成出来的对象)的载体,用来指示一个类声明、一个或多个@Bean方法,在运行时为这些Bean生成BeanDefinition和服务请求。

@Resource

它用于装配Bean,也可以写在字段上或Setter方法上。

public class DemoController {
  @Resource
  private ProductRepository productRepository;

  ……
}

@Autowired

它表示被修饰的类需要注入对象。Spring会扫描所有被@autowired标注的类,然后根据类型在IoC容器中找到匹配的类进行注入。被@Autowired注解后的类不需要再导入文件。

@RequestMapping

它用来处理请求地址映射,用在类或方法上。如果用在类上,则表示类中的所有响应请求的方法都是以该地址作为父路径的。该注解有6个属性。

  • Params:指定Request中必须包含某些参数值,才让该方法处理。
  • Headers:指定Request中必须包含某些指定的header值,才能让该方法处理请求。
  • Value:指定请求的实际地址,指定的地址可以是URI Template模式。
  • Method:指定请求的Method类型,如GET、POST、PUT、DELETE等。
  • Consumes:指定处理请求的提交内容类型Content-Type,如“application/json,text/html”。
  • Produces:指定返回的内容类型。只有当Request请求头中的Accept类型中包含该指定类型时才返回。

@Transactional

它可以用在接口、接口方法、类及类方法上。

但Spring不建议在接口或者接口方法上使用该注解,因为该注解只有在使用基于接口的代理时才会生效。如果异常被捕获(try { } catch { })了,则事务就不回滚了。如果想让事务回滚,则必须再往外抛出异常(try { } catch { throw Exception })。

@Qualifier

它的意思是“合格者”,用于标注哪一个实现类才是需要注入的。需要注意的是,@Qualifier的参数名称为被注入的类中的注解@Service标注的名称。

@Qualifier常和@Autowired一起使用,如以下代码:

@Autowired
@Qualifier("productService")

@EnableAutoConfiguration

可用在入口类或普通类类名上,用来提供自动配置。

@SpringBootApplication

常用在入口类上,用来启动入口类Application。

@EnableScheduling

可用在入口类或普通类类名上,用来开启计划任务。Spring通过@Scheduled支持多种类型的计划任务,包含cron、fixDelay、fixRate等。

@EnableAsync

可用在入口类或者普通类类名上,用来开启异步注解功能。

@ComponentScan

可用在入口类或普通类类名上,用来扫描组件,可自动发现和装配一些Bean。它根据定义的扫描路径,把符合扫描规则的类装配到Spring容器中,告诉Spring哪个包(package)的类会被Spring自动扫描并且装入IoC容器。它对用XML配置中的元素。可以通过basePackages等属性来细粒度地定制自动扫描的范围,默认会从声明@ComponentScan所在类的包进行扫描。

@Aspec

可用在入口类或普通类类名上,标注切面,可以用来配置事物、日志、权限验证,在用户请求时做一些处理等。

@ControllerAdvice

用在普通类类名上,包含@Component,可以被扫描到。统一处理异常。

使用在方法上的注解

@RequestBody

常用来处理application/json、application/xml等Content-Type类型的数据,意味着HTTP消息是JSON/XML格式,通过@RequestBody将请求体中的字符串绑定到相应的Bean上,也可以将其分别绑定到对应的字符串上。

@RequestMapping("/post")
public void demoPost(@RequestBody String name) {
  system.out.print("接收到的name参数值为:",name)
}

@PathVariable

用于获取路径中的参数

@Bean

它代表产生一个Bean,并交给Spring管理。用于封装数据,一般有Setter、Getter方法。在MVC模型中,对应的是M(模型层)

@ResponseBody

它的作用是通过转换器将控制器中方法返回的对象转换为指定的格式,然后写入Response对像的body区。它常用来返回JSON/XML格式的数据。使用此注解后,数据直接写入输入流中,不需要进行视图渲染。

原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/java/spring-boot-common-annotations.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
上一篇 2024年6月23日
下一篇 2019年6月18日

相关推荐

  • Java自学之内部类

    内部类是一种常见的嵌套结构,利用这样的结构使得内部类可以与外部类共存,并且方便地进行私有操作的访问。 内部类基本概念 内部类(内部定义普通类、抽象类、接口的统称)是指一种嵌套的结构…

    2020年12月14日
    1.4K
  • spring4.x学习之用户登录与注册

    在之前的文章中我已经把后端工程项目创建好了,接下来就是编写项目了。 首先,我先创建一个数据库。数据库使用的是MySQL,数据库管理工具用的是Navicat。 打开数据库管理工具Na…

    2019年3月21日
    2.0K
  • Java自学之数组

    在Java中数组是一组相关变量的集合,属于引用数据类型。 定义 数组引用传递分析 数组属于引用数据类型,在数组使用时需要通过关键字new开辟堆内存空间,一块堆内存空间也可以同时被多…

    2020年11月26日
    1.2K
  • Java自学之类结构扩展

    面向对象中的核心组成是类与接口,在项目中会利用【包】进行一组相关类的管理,这样适合于程序代码的部分更新,也更加符合面向对象封装性的概念,同时合理地使用封装也可以方便地实现实例化对象…

    2020年12月10日
    1.3K
  • spring boot练习篇之用户登录系统【接口篇】

    写在前面 抛弃JSP,只做纯粹的前后端分离项目。 作为一个资深前端工作者,想要转JavaWeb开发,无论是书籍,还是网上视频、资料,竟然没有一篇能清楚明白地讲解怎样搭建一个前后端分…

    2021年5月25日
    1.6K
  • Java自学之抽象类与接口

    面向对象程序设计中,类继承的主要作用的扩充已有类的功能。子类可以根据自己的需要选择是否要覆写父类中的方法,所以一个设计完善的父类是无法对子类做出任何强制性的覆写约定。为了解决这样的…

    2020年12月7日
    1.2K
  • spring4.x学习之创建工程

    断断续续学习Java有两三个月了,目前还是处于入门阶段。关于java及spring那些的设计理念方面的理论知识,不花费大量精力及时间是看不懂的(至少对于我这么一个前端转后端的初学者…

    2019年3月19日
    1.8K
  • Java自学之I/O编程

    I/O(Input/Output,输入/输出)可以实现数据的读取与写入操作,Java针对I/O操作的实现提供了java.io工具包,此包的核心组成由File类、InputStrea…

    2020年12月21日
    1.2K
  • JAVA学习之多线程知识点整理

    1、什么是进程?什么是线程? 进程是一个应用程序。线程是一个进程中的执行场景或者执行单元。一个进程可以启动多个线程。进程之间内存独立不共享。同一个进程中的线程之间,堆内存和方法区内…

    2020年6月19日
    1.2K
  • Java自学之String类

    在实际项目开发中,String是一个必须使用的程序类,可以说是项目的核心组成类。在Java程序里所有的字符串都要求使用【’‘】进行定义,同时也可以利用【+】实现字符串的连接处理。 …

    2020年11月30日
    1.4K