3.1 注解

在程序开发的过程中,注解是无处不在的。但是,注解又不是必需的;换言之,在不使用注解的情况下,也能够开发程序。只不过,掌握注解能够帮助程序开发人员深入理解框架,进而提高程序开发的效率。那么,什么是注解呢?注解的作用又有哪些呢?

3.1.1 注解的概念及其应用

在给出注解的概念之前,须明确什么是元数据。所谓元数据,指的是用于描述数据的数据。下面结合某个配置文件里的一行信息,举例说明什么是元数据。

    <string name="app_name">AnnotionProject</string>

上述信息中的数据“app_name”是用于描述数据AnnotionProject的。也就是说,数据“app_name”就是元数据。那么,什么是注解呢?注解又被称作标注,是一种被加入源码的具有特殊语法的元数据。需要特别说明的是:

 注解仅仅是元数据,和业务逻辑无关。

 虽然注解不是程序本身,但是可以对程序做出解释。

 应用程序中的类、方法、变量、参数、包等程序元素都可以被注解。

理解了“什么是注解”后,再来了解一下在应用程序中注解的应用体现在哪些方面:

 在编译时进行格式检查。例如,如果被@Override标记的方法不是父类的某个方法,编译器就会报错。

 减少配置。依据代码的依赖性,使用注解替代配置文件。

 减少重复工作。在程序开发的过程中,通过注解减少对某个方法的调用次数。

3.1.2 Spring Boot的常用注解及其标注位置

Spring Boot是一个支持海量注解的框架,其自带的常用注解如表3.1所示。关于这些注解的具体用法,会在本书后面的章节中予以详细介绍。

表3.1 Spring Boot的常用注解

这些注解的编码位置是非常灵活的。当注解用于标注类、成员变量和方法时,注解的编码位置既可以在成员变量的上边,例如:

    @Autowired
    private String name;

又可以在成员变量的左边,例如:

    @Autowired private String name;

在Spring Boot的常用注解中,需特别说明的是,使用@RequestParam能够标注方法中的参数。例如:

    @RequestMapping("/user")
    @ResponseBody
    public String getUser(@RequestParam Integer id) {
        return "success";
    }

3.1.3 使用@SpringBootApplication标注启动类

使用注解能够启动一个Spring Boot项目,这是因为在每一个Spring Boot项目中都有一个启动类(主类),并且启动类必须被@SpringBootApplication注解标注,进而能够调用用于启动一个Spring Boot项目的SpringApplication.run()方法。

在第2章中编写的第一个Spring Boot项目中,com.mr包下的MyFirstSpringBootProjectApplication类就是该项目的启动类,其代码如下:

    package com.mr;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;

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

@SpringBootApplication注解虽然重要,但使用起来非常简单,因为这个注解是由多个功能强大的注解整合而成的。打开@SpringBootApplication注解的源码可以看到它被很多其他注解标注,其中最核心的3个注解分别是:

 @SpringBootConfiguration注解:让项目采用基于Java注解的配置方式,而不是传统的XML文件配置。当然,如果程序开发人员写了传统的XML配置文件,Spring Boot也是能够读取这些XML文件并识别里面的内容的。

 @EnableAutoConfiguration注解:开启自动配置。这样Spring Boot在启动时就可以自动加载所有配置文件和配置类了。

 @ComponentScan注解:启用组件扫描器。这样项目才能自动发现并创建各个组件的Bean,包括Web控制器(@Controller)、服务(@Service)、配置类(@Configuration)和其他组件(@Component)。

注意

一个项目可以有多个启动类,但这样的代码毫无意义。一个项目应该只使用一次@SpringBootApplication注解。

@SpringBootApplication有一个使用要求:只能扫描底层包及其子包中的代码。底层包就是启动类所在的包。如果启动类在com.mr包下,其他类应该写在com.mr包或其子包中,否则无法被扫描器找到,就等同于无效代码。例如在图3.1和图3.2中,Controller类所在的位置可以被扫描到。而在图3.3和图3.4中,Controller类的位置就无法被扫描到了。

图3.1 Controller类在com.mr的子包中

图3.2 Controller类与启动类在同一个包中

图3.3 Controller类不在com.mr的子包中

图3.4 Controller类不在任何包中