> 文章列表 > 21个常用注解

21个常用注解

21个常用注解

目录

1.@Slf4j

2.@Configuration

3.@WebServlet

4.@Controller

5.@ResponseBody

6.@ExceptionHandler(异常类型.class)

7.@ControllerAdvice

8.@Component

9.@Data

10.@Bean

11.@RestController

12.@RequestMapping

13.@Autowired

14.@GetMapping  @PostMapping

15.@DeleteMapping

16.@WebFilter

17.@Mapper

18.@Transactional

19.@EnableTransactionManagement

20.@ServletComponentScan

21.@SpringBootApplication


 

1.@Slf4j

@Slf4j:用于打日志信息

2.@Configuration

@Configuration:用于标记为配置类

3.@WebServlet

@WebServlet 注解:通过在 Servlet 类上使用 @WebServlet 注解,指定 Servlet 对应的 URL 映射和初始化参数等配置信息,并在容器启动时将其自动注册到 Servlet 容器中。

4.@Controller

注解:需要在 Spring 应用程序的配置类中显式地定义 Spring MVC 组件扫描路径,通过 @ComponentScan 或者 @SpringBootApplication 注解等机制,让 Spring 扫描带有 @Controller 注解的类,并将其纳入控制器层级管理中。

5.@ResponseBody

@ResponseBody是一个 Spring MVC 的注解,用于标记控制器方法的返回值将被转换为 HTTP 响应报文的消息体。简单地说,它用于将 Java 对象序列化为 JSON、XML 或其他格式,并填充到 HTTP Response 中,通常用于响应 RESTAPI 的请求结果。
具体来说,当用户请求一个资源时,Spring MVC 容器将调用对应的 Controller 方法,该方法执行完成后,通过配置的消息转换器将处理结果序列化为指定格式,最终封装在 HttpResponse 中返回给客户端。
需要注意的是,若进行集合类或者实体类数据转换时,我们可以使用 @RequestBody 将请求中的数据直接反序列化为 Java 对象,而 @ResponseBody 则将 Java 对象序列化为指定格式的数据流,以便客户端正常解析和接收。

6.@ExceptionHandler(异常类型.class)

@ExceptionHandler(SQLIntegrityConstraintViolationException.class) 是一个 Spring MVC 的注解,用于定义控制器方法中针对特定类型异常的全局异常处理逻辑。具体来说,它指定了当出现 SQLIntegrityConstraintViolationException 异常时所要执行的代码逻辑。
在业务开发中,我们经常需要对程序中可能出现的异常进行处理,例如数据库操作中的唯一性约束异常、空指针异常、权限拒绝异常等等。而使用 @ExceptionHandler 机制,能够帮助我们将通用的异常处理逻辑集中到一个地方,并简化代码编写和业务逻辑的处理。

7.@ControllerAdvice

@ControllerAdvice(annotations = {RestController.class, Controller.class}) 是一个 Spring MVC 的注解,用于声明一个 Controller 增强器(Controller Advice)。其中,annotations 属性指定了被增强的 Controller 类型集合。
具体来说,这段代码的含义是:声明一个 Controller 增强器,并将其应用于所有被 @RestController 或 @Controller 注解标记的 Controller 组件中。使用该注解的类中,可以定义各种类型的全局通知(Global Advice),例如异常处理、Restful 消息转换、数据校验、请求日志等,适用于整个应用程序的 Controller 层面的控制和变换。
注解 @ControllerAdvice 主要提供以下两种可选属性:
basePackages:设置扫描范围,只有匹配该表达式或者满足该规则的 Controller 组件会被增强;
assignableTypes:通过指定 Controller 组件的类型数组,只有继承或者实现这些类型的组件才会进行增强。
这些属性可以根据需要进行调整和补充,提供了很大的灵活性和可配置性。例如,我们可以使用 @ControllerAdvice(basePackages="com.example") 来针对项目中特定包下的所有 Controller 进行统一增强。
总之,在 Spring MVC 中,使用 @ControllerAdvice 注解可以有效地减少重复编码和冗余逻辑,提高代码的可维护性和扩展性。通过声明一个全局通知,我们可以在应用程序中统一处理各种异常、请求参数、日志信息等,实现了 AOP 的切面功能,同时简化了开发流程。

8.@Component

@Component是 Spring 中的一个注解,用于标注某个类为 Spring 组件。被 @Component 标注的类会被 Spring 容器检测到并装配到 Spring 应用上下文中。
@Component 的作用主要有两点:
1. 被 @Component 标注的类会被 Spring 容器检测到,在容器中创建Bean实例。
2. @Component 通常用于标注服务层或数据层的类,表明这是一个可重用模块。
@Component 有几个更具体的子注解:
- @Repository:用于标注数据访问组件,也就是DAO组件。
- @Service:用于标注服务层组件,主要用于业务逻辑层。
- @Controller:用于标注控制层组件,主要用于接受用户输入并调用业务层和数据层。
所以,这几个注解的关系可以表示为:
- @Component
  - @Repository
  - @Service
  - @Controller

9.@Data

@Data注解的主要作用是自动生成类的 getter、setter、equals、hashCode、toString 方法。它可以极大地简化实体类的开发。
具体来说,使用 @Data 注解的好处有:
1. 简化实体类的开发。不需要手动编写 getter、setter、equals、hashCode、toString 等方法,大大减少代码量。
2. 统一的方法命名和编写方式。@Data 生成的方法遵循统一的 Java Bean 规范,命名和编写方式标准统一,提高程序的可读性和一致性。
3. 正确实现 equals 和 hashCode。@Data 会根据实体类的属性值自动生成正确的 equals 和 hashCode 方法,方便使用实体类作为 Map 等集合的键。
4. toString 方法详细输出属性。自动生成的 toString 方法会输出所有属性值,方便调试和日志输出。
5. 简化测试用例编写。简单的实体类使用 @Data 注解后,可以不必在测试用例中编写 assertEquals、assertHashCode 等方法进行验证,省去许多重复劳动。
举个例子,一个普通的实体类:
java
public class User {
    private String name;
    private Integer age;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    // 省略其它方法

使用 @Data 注解后:
java
@Data
public class User {
    private String name;
    private Integer age;
}
这样,User 类就自动拥有了:
- getName() 和 setName() 方法
- getAge() 和 setAge() 方法 
- equals(Object) 方法 
- hashCode() 方法
- toString() 方法
- 等等
所以,@Data 的作用就是自动生成实体类的 getter、setter、equals、hashCode、toString 方法,极大地简化实体类的开发,提高开发效率和程序质量。
当然,@Data 注解也有一定的缺点,在某些情况下手动编写方法会更为合适。但对绝大多数简单实体类来说,@Data 注解都是极为实用的。

10.@Bean

@Bean注解用来标注方法,表明这个方法会产生一个 Bean,这个 Bean 会被 AnnotationConfigApplicationContext 或 AnnotationBeanDefinitionReader 解析并加载到 Spring 容器中。
@Bean 注解的方法通常在 Spring 的配置类中,也可以在常规的类中。当在配置类中时,该方法将返回一个 Bean 实例,该实例将注册到 Spring 容器中。
@Bean 注解的常见用法有:
1. 当需要增加第三方库中的组件到 Spring 容器中时。可以编写一个方法,使用 @Bean 将第三方组件实例化并加载到 Spring 容器中。
2. 当需要自定义一些bean的时候,也可以通过@Bean的方式声明和加载bean。
3. 在测试类中使用 @Bean 可以轻松地加载 bean,实现测试用例。

11.@RestController

@RestController注解是 Spring 4 中引入的,它是 @Controller 和 @ResponseBody 的组合注解。
@Controller 注解用于标识这是一个控制器类,处理 web 请求。
@ResponseBody 用于标识方法返回的值直接作为 web 响应的响应体,不需要去解析任何视图。
所以,@RestController 注解的类中的方法会直接将返回的值作为 web 响应的响应体。

12.@RequestMapping

@RequestMapping注解用于映射 web 请求(例如 GET、POST 等)到控制器处理方法上。它的主要作用是:
1. 用于匹配 URL。可以指定 URL 的路径、参数、头信息等,当请求匹配时会调用相应的处理方法。
2. 用于匹配 HTTP 方法。可以指定 GET、POST、PUT、DELETE 等方法,从而只有请求方法匹配时才会调用该处理方法。
3. 可以添加此注解在类或方法上,用于指定一组映射关系的公共部分。
@RequestMapping 支持的自定义参数有:
- value:指定 URL 路径,必须属性。例如 @RequestMapping("/user")
- method:指定 HTTP 方法,例如 @RequestMapping(value="/user", method=RequestMethod.GET)
- params:指定 URL 中必须包含某些参数,例如 @RequestMapping(value="/user", params="id")
- headers:指定 HTTP 请求头必须包含某些值,例如 @RequestMapping(value="/user", headers="content-type=application/json") 
- consumes:指定能接收的 MIME 类型,例如 @RequestMapping(value="/user", consumes="application/json")
- produces:指定返回的 MIME 类型,例如 @RequestMapping(value="/user", produces="application/json")
举个例子:
java
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String getUser(@PathVariable("id") Integer id) {
        // 获取id用户
    }
    
    @RequestMapping(value = "/create", method = RequestMethod.POST, produces = "application/json")
    @ResponseBody
    public User createUser(@RequestBody User user) {
        // 创建用户
        return user;
    }
}
这里我们使用 @RequestMapping 指定了以下映射关系:
- GET /user/{id} 请求映射到 getUser 方法
- POST /user/create 请求,必须返回 application/json MIME 类型,映射到 createUser 方法
并且由于 @RequestMapping 注解可以在类级别使用,所以两个方法都继承了 /user 的 URL 路径。
所以,@RequestMapping 的主要作用就是将 web 请求映射到控制器的处理方法上,确定两个之间的对应关系。通过指定 URL、HTTP 方法、参数、头信息等可以精确地匹配 web 请求,从而调用相应的处理逻辑

13.@Autowired

@Autowired注解用于自动装配 bean。它可以对类成员变量、方法及构造器进行标注,完成自动装配的工作。
@Autowired 的作用主要有:
1. 自动注入 matching bean:根据类型(byType)或者名称(byName)进行自动装配。如果有多个候选 bean,则会按名称进行首选装配。
2. 默认优先按类型查找匹配的 bean。如果找到多个类型匹配的 bean,再会按名称查找。如果找到唯一名称匹配的 bean,会装配该 bean。如果都找不到,会报错。
3. 可以设置 @Qualifier 注解或 @Autowired 的 name 属性,指定要注入 bean 的名称。此时会按指定名称进行装配。
4. 支持装配数组、集合类型字段及容器(容器会递归装配里面的元素)。
@Autowired 的常见用法:
1. 构造器注入:
java
public class Foo {
    private final Bar bar;

    @Autowired
    public Foo(Bar bar) {
        this.bar = bar;
    }
}
2. 属性注入:
java
public class Foo {
    @Autowired
    private Bar bar;
}
3. 方法注入:
java 
public class Foo {
    private Bar bar;

    @Autowired
    public void setBar(Bar bar) {
        this.bar = bar;
    }
}
4. 指定名称装配:
java
public class Foo {
    @Autowired
    @Qualifier("bar1") 
    private Bar bar;
}
或者:
java
public class Foo {
    @Autowired(name="bar2")
    private Bar bar;

5. 装配 List、Map 等:
java
public class Foo {
    @Autowired
    private List<Bar> bars;
    
    @Autowired
    private Map<String, Bar> barMap;
}
所以,@Autowired 的作用就是自动装配 bean。它可以减少手动设置 bean 引用的代码量,使代码变得更加简洁。但同时,也要求相关 bean 必须符合自动装配要求(类型匹配或名称匹配),否则运行时会报错。

14.@GetMapping  @PostMapping

@GetMapping和 @PostMapping 注解是 Spring 4.3 引入的,它们是 @RequestMapping(method = RequestMethod.GET) 和 @RequestMapping(method = RequestMethod.POST) 的缩写。
@GetMapping 用于映射 GET 请求,@PostMapping 用于映射 POST 请求。这两个注解的功能与使用 @RequestMapping 指定 method = RequestMethod.GET 或 POST 是一致的,只是更加简洁。
举个例子:
java
@GetMapping("/user")
public String getUser() {
    // 返回user视图
}

@PostMapping("/user") 
public void createUser(User user) {
    // 创建用户
}
这里我们使用 @GetMapping 映射 GET /user 请求,@PostMapping 映射 POST /user 请求。
与 @RequestMapping 比较,@GetMapping 和 @PostMapping 更加简洁,能够让读者立即明确这是一个 GET 请求的映射还是 POST 请求的映射,增加了可读性。
除此之外,@GetMapping 和 @PostMapping 支持与 @RequestMapping 相同的属性,如:
- value:请求 URL,必需属性。例如 @GetMapping("/user")
- params:请求参数,例如 @GetMapping(value="/user", params="id") 
- headers:请求头,例如 @GetMapping(value="/user", headers="content-type=text/html")
- consumes:接收的 MIME 类型,例如 @PostMapping(value="/user", consumes="application/json")
- produces:返回的 MIME 类型,例如 @PostMapping(value="/user", produces="application/json")
所以,@GetMapping 和 @PostMapping 的作用主要是:
1. 简化 @RequestMapping 的书写,更加清晰和简洁。
2. @GetMapping 专门用于映射 GET 请求,@PostMapping 专门用于映射 POST 请求,明确请求方法的语义。 
3. 支持 @RequestMapping 相同的自定义参数,灵活地映射请求。
综上,@GetMapping 和 @PostMapping 是 Spring 4.3 引入的简化 @RequestMapping 书写的注解,用于更加清晰地映射 GET 和 POST 请求,增强代码可读性。二者的功能与使用 @RequestMapping 并指定 method = RequestMethod.GET 或 POST 是完全相同的。

15.@DeleteMapping

@DeleteMapping注解是 Spring 4.3 引入的,它是 @RequestMapping(method = RequestMethod.DELETE) 的缩写。
用于映射 DELETE 请求,和 @GetMapping、@PostMapping 一样,是 Spring 提供的简化 @RequestMapping 书写的注解。
@DeleteMapping 的用法与 @GetMapping 和 @PostMapping 非常相似,也支持相同的属性,主要作用是:
1. 简化 @RequestMapping 的书写,更加清晰和简洁。使用 @DeleteMapping 可以立即明确这是一个 DELETE 请求映射。
2. 支持与 @RequestMapping 相同的属性,如:
- value:请求 URL,必需属性。例如 @DeleteMapping("/user/{id}")
- params:请求参数,例如 @DeleteMapping(value="/user", params="id") 
- headers:请求头,例如 @DeleteMapping(value="/user", headers="content-type=text/html")
- etc.
举个例子:
java
@Controller 
public class UserController {
    @DeleteMapping("/user/{id}")
    public void deleteUser(@PathVariable("id") Integer id) {
        // 删除id用户
    }
}
这里我们使用 @DeleteMapping 映射 DELETE /user/{id} 请求到 deleteUser 方法。
所以,@DeleteMapping 的主要作用就是映射 DELETE 请求,与 @GetMapping、@PostMapping 一样,是 Spring 提供的简化 @RequestMapping 书写的注解。使用 @DeleteMapping 可以更清晰地表达请求方法的语义,增强代码可读性。
除此之外,@DeleteMapping 支持与 @RequestMapping 相同的所有属性,可以灵活地映射 DELETE 请求。
综上,@DeleteMapping 注解的作用主要是:
1. 简化 DELETE 请求映射的书写,更加清晰表达语义。 
2. 支持 @RequestMapping 的所有属性,灵活映射 DELETE 请求。

16.@WebFilter

@WebFilter注解用于定义 Servlet 过滤器。它可以标注在类上,将该类定义为过滤器类。
@WebFilter 支持以下属性:
- filterName:过滤器名称,可选。
- value:过滤器名称的别名,可选。
- urlPatterns:过滤器匹配的 URL 模式,必需。可以指定具体路径也可以使用通配符。
- servletNames:过滤器匹配的 Servlet 名称,可选。
- dispatchTypes:过滤器将要过滤的请求类型,可选。可填值有:
  - REQUEST
  - FORWARD
  - INCLUDE
  - ERROR
  - ASYNC
- initParams:过滤器初始化参数,可选。
- asyncSupported:是否支持异步操作,可选,默认为 true。
使用 @WebFilter 定义的过滤器类必须实现 javax.servlet.Filter 接口。
举个例子:
java
@WebFilter(filterName = "authFilter", urlPatterns = "/*")
public class AuthFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        // 判断请求是否需要登录
        if (req.getRequestURI().startsWith("/admin/")) {
            // 需要登录,判断是否登录
            if (req.getSession().getAttribute("user") == null) {
                // 未登录,重定向到登录页面
                ((HttpServletResponse) response).sendRedirect("/login");
            } else {
                // 已登录,继续过滤链
                chain.doFilter(request, response); 
            }
        } else {
            // 不需要登录,继续过滤链
            chain.doFilter(request, response);
        }
    }
}
这里我们定义了一个名为 authFilter 的过滤器,它会拦截 /* 路径下的所有请求。在过滤器逻辑中,我们判断若请求 /admin/ 下的资源,需要验证用户是否登录,若未登录会重定向到登录页面,否则继续向下执行过滤链。
所以,@WebFilter 注解的主要作用是:
1. 用于定义 Servlet 过滤器类。
2. 支持设置过滤器名称、匹配路径、初始化参数等。
3. 方便部署 Servlet 过滤器,无需在 web.xml 中进行 Filter 配置。
与 web.xml 配置过滤器相比,@WebFilter 注解具有以下优点:
1. 更简洁的配置方式。
2. 过滤器类与注解在一起,结构更清晰。
3. 依然可以在 web.xml 中配置与注解相关的过滤器,实现灵活配置。
综上,@WebFilter 注解用于简化和替代 web.xml 中的 Filter 配置,方便定义 Servlet 过滤器类,增强可读性。

17.@Mapper

@Mapper注解是一个 MyBatis 注解,用于标识 MyBatis 的 mapper class 类,用于 Mapper 接口体系编程。
使用该注解后,MyBatis 会自动解析 Mapper 接口中的方法,并在 Spring 启动时创建 Mapper 接口的代理对象来处理数据库操作。
@Mapper 支持的属性主要有:
- annotatedClasses:自动检测该接口所在包下的所有接口,将它们标记为 Mapper。
- value:指定要扫描的 Mapper 接口类。
使用 @Mapper 后,我们无需在 Spring 配置文件中使用 <mybatis-spring:scan /> 节点来配置需要扫描的 Mapper 了。
@Mapper 的常见用法:
1. 在 Mapper 接口上添加 @Mapper 注解:
java
@Mapper
public interface UserMapper {
    User findById(Integer id);
}
2. 可以在包上添加 @MapperScan 注解,自动扫描该包下的所有 Mapper:
java
@MapperScan("com.sample.mapper")
public class Application {
    // ...
}
3. 可以在 @MapperScan 中指定 value 属性扫描指定 Mapper:
java 
@MapperScan(value = {"com.sample.mapper1", "com.sample.mapper2"})
public class Application {
    // ...
}
4. 可以在 @Mapper 中指定 annotatedClasses 属性自动检测接口所在包下的所有 Mapper:
java
@Mapper(annotatedClasses = UserMapper.class)
public interface RoleMapper {
    // ... 
}
所以,@Mapper 的主要作用是:
1. 标识 MyBatis 的 Mapper 接口类。
2. 简化 MyBatis 与 Spring 集成的配置,无需在 Spring 配置文件中配置 <mybatis-spring:scan /> 节点。
3. 支持自动扫描包下的所有 Mapper 或指定需要扫描的 Mapper。
4. Spring 启动时会自动创建 Mapper 接口的代理对象,用于处理数据库操作。
与 <mybatis-spring:scan /> 相比,@Mapper 注解的配置更简洁,与 Mapper 接口类在一起,更直观。但同时也意味着 Mapper 配置变成了分散的,一定程度上降低了可维护性。
所以,@Mapper 主要用于简化 MyBatis 与 Spring 集成的配置,通过注解的方式来标识和扫描 MyBatis 的 Mapper 接口类。

18.@Transactional

@Transactional注解用于标注事务方法,用于声明事务属性信息。
当 Spring 组件扫描到使用 @Transactional 标注的方法时,会为其创建一个事务性代理对象。当该方法被调用时,事务会启动;当方法调用完成时,事务就会提交或回滚。
@Transactional 支持的属性主要有:
- value:指定事务管理器,默认使用 JdbcTransactionManager。
- propagation:事务传播行为,默认为 Propagation.REQUIRED。
- isolation:事务隔离级别,默认为 Isolation.DEFAULT。
- readOnly:是否只读事务,默认 false。
- timeout:事务超时时间,默认值为 -1(永不超时)。
- rollbackFor:出现指定异常后进行回滚,默认值为 Exception.class。
- rollbackForClassName:出现指定异常类名后进行回滚。
- noRollbackFor:出现指定异常不进行回滚,默认不设置。
- noRollbackForClassName:出现指定异常类名不进行回滚。
@Transactional 的常见用法:
1. 在 service 类或 service 方法上添加 @Transactional 注解:
java
@Service
public class UserService {
    @Transactional
    public void save(User user) {
        userDao.save(user);
        // ...
    }
}
2. 在 Controller 层调用 Service 方法:
java
@Autowired
private UserService userService;

@RequestMapping("/user/save")
public String save(User user) {
    userService.save(user);
    return "success"; 
}
3. 可以在类上加入 @Transactional,表示类中所有的方法都带有事务:
java
@Service
@Transactional
public class UserService {
    public void save(User user) {
        // ...
    }
    
    public void delete(Integer id) {
        // ...
    }
}
所以,@Transactional 的主要作用是:
1. 声明一个方法或者类需要使用事务。
2. 当该方法被调用时,会开启一个事务;当方法调用结束后,事务就会提交或回滚。
3. 支持设置事务传播行为、隔离级别、超时时间、回滚规则等。
4. 简化了事务的配置方式,与方法紧密相关联,结构清晰。
与 XML 配置事务相比,@Transactional 注解的优点是:
1. 简洁的配置方式,便于维护。
2. 事务规则与业务方法绑定,很清晰。
3. 还可以与 XML 配置结合使用,实现更灵活的事务控制。
综上,@Transactional 主要用于简化事务的声明和配置。它可以更清晰地把事务规则应用到具体业务方法上,增强代码的可读性。

19.@EnableTransactionManagement

@EnableTransactionManagement注解用于开启 Spring 的事务管理功能。它会自动扫描使用 @Transactional 注解的类,并为其生成事务增强代理来控制事务。
@EnableTransactionManagement 支持以下属性:
- proxyTargetClass:是否使用基于类的代理,默认 false,使用 JDK 动态代理。
- order:定义了事务增强器的顺序,值越低,优先级越高。
- mode:声明事务管理器的类型,可选值为 AdviceMode.PROXY、AdviceMode.ASPECTJ。默认为 PROXY。
使用 @EnableTransactionManagement 后,我们无需在 Spring 配置文件中配置 <tx:annotation-driven /> 元素来启用事务了。
@EnableTransactionManagement 的常见用法:
1. 在 Spring 配置类上添加注解:
java
@Configuration
@EnableTransactionManagement 
public class AppConfig {
    // ...
}
2. 然后就可以在 Service 类或方法上使用 @Transactional 注解声明事务了:
java
@Service
public class UserService {
    @Transactional
    public void save(User user) {
        // ...
    }

3. Spring 会自动为 @Transactional 标注的方法生成事务增强代理,用于控制事务。
所以,@EnableTransactionManagement 的主要作用是:
1. 启用 Spring 对 @Transactional 注解的解析功能。
2. 自动扫描使用了 @Transactional 的类,并为其生成事务增强代理。
3. 简化了事务管理的配置,无需在 Spring 配置文件中使用 <tx:annotation-driven /> 元素。
与 <tx:annotation-driven /> 相比,@EnableTransactionManagement 的优点是:
1. 配置更加简洁,与 Spring 配置类在一起,更易于维护。
2. 可以根据需要选择不同的 PlatfromTransactionManager 事务管理器。
3. 还可以与 XML 配置结合使用,实现更灵活的事务控制。
所以,@EnableTransactionManagement 的主要作用是启用 Spring 的注解驱动事务管理功能,自动解析 @Transactional 注解,为使用该注解的类生成事务增强代理。它可以简化事务管理的配置,使事务规则与代码更加贴近,易于维护。

20.@ServletComponentScan

@ServletComponentScan注解用于扫描 Servlet、Filter、Listener 组件,在 Spring 启动时自动部署到 Servlet 容器中。
它等同于在 Spring 配置文件中使用 <context:component-scan base-package="xxx" /> 元素来扫描 Servlet 组件,然后使用 ServletRegistrationBean 等手动将其部署至 Servlet 容器。
@ServletComponentScan 支持以下属性:
- basePackages:要扫描的包路径,如果不指定将从声明该注解的类所在包开始扫描。
- basePackageClasses:要扫描的包中的具体类,可以指定多个。
- excludeFilters:排除不需要扫描的类型,可以指定多次。
- includeFilters:指定需要扫描的类型,默认会扫描 @WebServlet、@WebFilter 和 @WebListener 注解的类型。
- servletBuilderRegistration:自定义 ServletRegistrationBean。
- filterBuilderRegistration:自定义 FilterRegistrationBean。
- listenerBuilderRegistration:自定义 ServletListenerRegistrationBean。
使用 @ServletComponentScan 后,我们无需在 Spring 配置文件中使用 <context:component-scan /> 和 ServletRegistrationBean 来配置和部署 Servlet 了。
@ServletComponentScan 的常见用法:
1. 在 Spring 配置类上使用 @ServletComponentScan:
java
@Configuration
@ServletComponentScan
public class WebConfig {
    // ...

2. 然后就可以使用 @WebServlet、@WebFilter 和 @WebListener 注解标注 Servlet、Filter 和 Listener 了:
java
@WebServlet("/user")
public class UserServlet extends HttpServlet {
    // ...
}

@WebFilter("/user/*")
public class UserFilter implements Filter {
    // ... 
}
3. Spring 启动时会自动扫描到使用了这些注解的组件,并将其部署到 Servlet 容器中。
所以,@ServletComponentScan 的主要作用是:
1. 自动扫描使用 @WebServlet、@WebFilter 和 @WebListener 注解的 Servlet、Filter 和 Listener。
2. Spring 启动时自动将扫描到的组件部署到 Servlet 容器中,无需手动配置 ServletRegistrationBean。 
3. 简化了 Servlet 组件的配置方式,使其可以通过注解完成部署,更加简洁。
与 <context:component-scan /> 和 ServletRegistrationBean 相比,@ServletComponentScan 的优点是:
1. 配置更加简洁,与 Spring 配置类在一起,结构清晰。
2. Servlet 组件的部署更加自动化,只需要添加注解即可。
3. 还可以与 XML 配置结合使用,实现更灵活的配置。
综上,@ServletComponentScan 的作用主要是自动扫描和部署使用标准注解(@WebServlet 等)定义的 Servlet、Filter 和 Listener 组件。它可以大大简化 Servlet 组件的配置方式,使其部署变得更加简便和自动化。

21.@SpringBootApplication

@SpringBootApplication注解是 Spring Boot 项目的核心注解,用于开启 Spring Boot 的自动配置。
它相当于使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解,作用如下:
- @Configuration:将当前类标注为 Spring 配置类。
- @EnableAutoConfiguration:开启 Spring Boot 的自动配置机制。
- @ComponentScan: 扫描当前包及其子包的被 @Controller、@Service、@Repository 等注解的 Bean,并注册到 Spring 容器中。
@SpringBootApplication 支持以下属性:
- exclude:排除不需要扫描的配置类或第三方库。
- scanBasePackages:指定需要扫描的包路径。
当一个类使用 @SpringBootApplication 注解后,就自动具有以上三个注解的功能。常见用法是在 Spring Boot 主类上使用该注解:
java
@SpringBootApplication  
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
使用 @SpringBootApplication 注解后的作用:
1. 启用 Spring Boot 的自动配置功能,加载自动配置类及相应 Bean。
2. 扫描被 @Controller、@Service、@Repository 等注解的 Bean,并注册到 Spring 容器。
3. 将当前类标注为配置类,并加载其中的配置信息。
所以,@SpringBootApplication 的主要作用是:
1. 开启 Spring Boot 的自动配置功能,简化 Spring 应用的配置。
2. 扫描指定包及其子包中的 Bean,并加载到 Spring 容器。
3. 标注当前类为配置类,读取其中的 Spring 相关配置。
与 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 分别使用相比,@SpringBootApplication 更加简洁,且明确其作用,使代码结构更清晰。
综上,@SpringBootApplication 注解是一个 Spring Boot 场景下的核心注解,它集成了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的功能,用于开启 Spring Boot 的自动配置机制,简化 Spring 应用的配置。