SpringBoot 常用的 50 个注解

SpringBoot

1. @SpringBootApplication

代码作用

这是一个组合注解,包含了 @Configuration@EnableAutoConfiguration@ComponentScan 三个注解。用于标识 Spring Boot 应用程序的入口类,简化 Spring 应用程序的配置和启动过程。

代码用例

1
2
3
4
5
6
7
@SpringBootApplication
public class MyApplication {

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

代码分析

  • @SpringBootApplication 注解标注在 MyApplication 类上,表明这是 Spring Boot 应用的入口类。
  • main 方法中调用 SpringApplication.run(MyApplication.class, args) 来启动 Spring Boot 应用程序。

2. @RestController

代码作用

@Controller 类似,是 @Controller@ResponseBody 的组合注解,用于标注一个类为 RESTful 风格的控制器,会自动将返回值转换为 JSON 格式,可处理 HTTP 请求并返回 JSON/XML 格式的响应。

代码用例

1
2
3
4
5
6
7
8
@RestController
public class HelloController {

@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}

代码分析

  • @RestController 注解标注在 HelloController 类上,表明该类是一个 RESTful 风格的控制器。
  • hello 方法使用 @GetMapping 注解映射 /hello 请求,返回的字符串会自动转换为 JSON 格式响应给客户端。

3. @RequestMapping

代码作用

是 Spring MVC 框架中的核心注解,用于映射 HTTP 请求和控制器方法之间的关系,可用于类级别和方法级别,指定请求 URL 和 HTTP 方法(GET、POST、PUT、DELETE 等)。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@RestController
@RequestMapping("/api")
public class UserController {

@GetMapping("/users")
public List<User> getUsers() {
// 获取用户列表
}

@PostMapping("/users")
public void createUser(@RequestBody User user) {
// 创建新用户
}

@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
// 根据 ID 获取用户信息
}

@PutMapping("/users/{id}")
public void updateUser(@PathVariable Long id, @RequestBody User user) {
// 更新用户信息
}

@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) {
// 根据 ID 删除用户
}
}

代码分析

  • @RequestMapping("/api") 注解在类级别,指定该控制器处理的请求路径以 /api 开头。
  • 各个方法上的 @GetMapping@PostMapping@PutMapping@DeleteMapping 等注解进一步细化了请求的 URL 和 HTTP 方法。

4. @GetMapping

代码作用

用于映射 HTTP GET 请求,是 @RequestMapping(method = RequestMethod.GET) 的快捷方式。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
@RequestMapping("/api")
public class UserController {

@GetMapping("/users")
public List<User> getUsers() {
// 获取用户列表
}

@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
// 根据 ID 获取用户信息
}
}

代码分析

  • 两个 @GetMapping 注解分别映射 /api/users/api/users/{id} 的 GET 请求,分别用于获取用户列表和根据 ID 获取用户信息。

5. @PostMapping

代码作用

用于映射 HTTP POST 请求,是 @RequestMapping(method = RequestMethod.POST) 的快捷方式。

代码用例

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/api")
public class UserController {

@PostMapping("/users")
public void createUser(@RequestBody User user) {
// 创建新用户
}
}

代码分析

  • @PostMapping("/users") 注解映射 /api/users 的 POST 请求,用于创建新用户。
  • @RequestBody 注解将 HTTP 请求体中的数据绑定到 User 对象。

6. @PutMapping

代码作用

用于映射 HTTP PUT 请求,是 @RequestMapping(method = RequestMethod.PUT) 的快捷方式。

代码用例

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/api")
public class UserController {

@PutMapping("/users/{id}")
public void updateUser(@PathVariable Long id, @RequestBody User user) {
// 更新用户信息
}
}

代码分析

  • @PutMapping("/users/{id}") 注解映射 /api/users/{id} 的 PUT 请求,用于更新指定 ID 的用户信息。
  • @PathVariable 注解获取 URL 中的 id 参数,@RequestBody 注解将请求体数据绑定到 User 对象。

7. @DeleteMapping

代码作用

用于映射 HTTP DELETE 请求,是 @RequestMapping(method = RequestMethod.DELETE) 的快捷方式。

代码用例

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/api")
public class UserController {

@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) {
// 根据 ID 删除用户
}
}

代码分析

  • @DeleteMapping("/users/{id}") 注解映射 /api/users/{id} 的 DELETE 请求,用于删除指定 ID 的用户。
  • @PathVariable 注解获取 URL 中的 id 参数。

8. @RequestParam

代码作用

用于获取请求参数的值,将 HTTP 请求中的参数绑定到控制器方法的参数上。

代码用例

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/api")
public class UserController {

@GetMapping("/users")
public List<User> getUsers(@RequestParam("page") int page, @RequestParam("size") int size) {
// 分页获取用户列表
}
}

代码分析

  • @RequestParam("page")@RequestParam("size") 分别获取请求参数 pagesize 的值,并将其绑定到方法的 pagesize 参数上。

9. @PathVariable

代码作用

用于将 HTTP 请求路径中的变量绑定到控制器方法的参数上。

代码用例

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/api")
public class UserController {

@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
// 根据 ID 获取用户信息
}
}

代码分析

  • @PathVariable 注解将 URL 中的 {id} 参数绑定到方法的 id 参数上,用于根据 ID 获取用户信息。

10. @RequestBody

代码作用

用于将 HTTP 请求的主体转换为方法的参数,将请求体中的数据绑定到控制器方法的参数上。

代码用例

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/api")
public class UserController {

@PostMapping("/users")
public User createUser(@RequestBody User user) {
// 创建用户
}
}

代码分析

  • @RequestBody 注解将 HTTP 请求体中的 JSON 或 XML 数据转换为 User 对象,并传递给 createUser 方法。

11. @ResponseBody

代码作用

用于将方法的返回值转换为 HTTP 响应的主体,将控制器方法的返回值转换为响应体中的数据。

代码用例

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/api")
public class UserController {

@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
// 根据 ID 获取用户信息
}
}

代码分析

  • 由于 @RestController@Controller@ResponseBody 的组合注解,所以这里方法的返回值 User 对象会自动转换为 JSON 格式的响应体返回给客户端。

12. @Autowired

代码作用

用于自动装配 Spring 容器中的 Bean,根据类型进行依赖注入。

代码用例

1
2
3
4
5
6
7
8
@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserRepository userRepository;

// 实现 UserService 接口中的方法
}

代码分析

  • @Autowired 注解标注在 userRepository 字段上,Spring 会自动从容器中查找类型为 UserRepository 的 Bean 并注入到该字段。

13. @Component

代码作用

是 Spring 框架中的通用注解,用于标注一个类作为 Spring Bean,让 Spring 容器自动扫描并管理该类。

代码用例

1
2
3
4
5
@Component
public class UserServiceImpl implements UserService {

// 实现 UserService 接口中的方法
}

代码分析

  • @Component 注解标注在 UserServiceImpl 类上,表明该类是一个 Spring Bean,会被 Spring 容器扫描并注册。

14. @Service

代码作用

用于标注一个类作为服务类(Service),是 @Component 的一种特殊形式,用于表示业务逻辑层的组件。

代码用例

1
2
3
4
5
@Service
public class UserServiceImpl implements UserService {

// 实现 UserService 接口中的方法
}

代码分析

  • @Service 注解标注在 UserServiceImpl 类上,表明该类是一个服务类,负责处理业务逻辑,会被 Spring 容器扫描并注册。

15. @Repository

代码作用

用于标注一个类作为数据访问对象(DAO),是 @Component 的一种特殊形式,用于表示数据访问层的组件。

代码用例

1
2
3
4
5
@Repository
public class UserRepositoryImpl implements UserRepository {

// 实现 UserRepository 接口中的方法
}

代码分析

  • @Repository 注解标注在 UserRepositoryImpl 类上,表明该类是一个数据访问对象,负责与数据库交互,会被 Spring 容器扫描并注册。

16. @Configuration

代码作用

用于标注一个类作为配置类,该类中可以定义一个或多个 @Bean 方法,用于创建和配置 Spring 应用程序上下文中的 Bean。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class AppConfig {

@Bean
public UserService userService() {
return new UserServiceImpl();
}

@Bean
public UserRepository userRepository() {
return new UserRepositoryImpl();
}
}

代码分析

  • @Configuration 注解标注在 AppConfig 类上,表明该类是一个配置类。
  • @Bean 注解的 userServiceuserRepository 方法分别返回 UserServiceUserRepository 的实例,这些实例会被注册到 Spring 容器中。

17. @Value

代码作用

用于将配置文件中的属性值注入到 Bean 对象中,支持从配置文件中读取属性值并赋值给类的字段。

代码用例

1
2
3
4
5
6
7
8
@Component
public class MyComponent {

@Value("${my.property}")
private String myProperty;

// 其他方法
}

代码分析

  • @Component 注解标注在 MyComponent 类上,表明该类是一个 Spring Bean。
  • @Value("${my.property}") 注解将配置文件中名为 my.property 的属性值注入到 myProperty 字段。

18. @Bean

代码作用

用于将一个方法返回的对象注册到 Spring 容器中,通常在配置类中使用,方法的返回值会被作为一个 Bean 注册到容器中。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class AppConfig {

@Bean
public UserService userService() {
return new UserServiceImpl();
}

@Bean
public UserRepository userRepository() {
return new UserRepositoryImpl();
}
}

代码分析

  • @Configuration 注解标注在 AppConfig 类上,表明该类是一个配置类。
  • @Bean 注解的 userServiceuserRepository 方法分别返回 UserServiceUserRepository 的实例,这些实例会被注册到 Spring 容器中。

19. @Import

代码作用

用于导入其他配置类或 Bean,将其他配置类的 Bean 定义合并到当前配置类中。

代码用例

1
2
3
4
5
6
@Configuration
@Import({AppConfig1.class, AppConfig2.class})
public class AppConfig {

// 其他方法
}

代码分析

  • @Configuration 注解标注在 AppConfig 类上,表明该类是一个配置类。
  • @Import 注解导入 AppConfig1AppConfig2 两个配置类,将它们的 Bean 定义合并到 AppConfig 中。

20. @Conditional

代码作用

用于根据条件判断是否创建 Bean 或执行配置,只有当条件满足时,被注解的 Bean 才会被创建。

代码用例

1
2
3
4
5
6
7
8
9
10
11
@Configuration
public class AppConfig {

@Bean
@Conditional(DatabaseTypeCondition.class)
public UserRepository userRepository() {
return new UserRepositoryImpl();
}

// 其他方法
}

代码分析

  • @Configuration 注解标注在 AppConfig 类上,表明该类是一个配置类。
  • @Conditional(DatabaseTypeCondition.class) 注解表示只有当 DatabaseTypeCondition 条件满足时,userRepository Bean 才会被创建。

21. @Profile

代码作用

用于指定配置的环境,如开发环境、测试环境或生产环境,根据不同的环境激活不同的 Bean。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
public class AppConfig {

@Bean
@Profile("dev")
public UserService userServiceDev() {
return new UserServiceDevImpl();
}

@Bean
@Profile("prod")
public UserService userServiceProd() {
return new UserServiceProdImpl();
}

// 其他方法
}

代码分析

  • @Configuration 注解标注在 AppConfig 类上,表明该类是一个配置类。
  • @Profile("dev") 注解表示 userServiceDev Bean 只在开发环境下激活,@Profile("prod") 注解表示 userServiceProd Bean 只在生产环境下激活。

22. @PropertySource

代码作用

用于指定配置文件的位置,让 Spring 应用程序可以使用这些配置文件中的属性。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {

@Autowired
private Environment environment;

@Bean
public UserService userService() {
return new UserServiceImpl(environment.getProperty("userService.name"));
}

// 其他方法
}

代码分析

  • @Configuration 注解标注在 AppConfig 类上,表明该类是一个配置类。
  • @PropertySource("classpath:application.properties") 注解指定了配置文件 application.properties 的位置。
  • 通过 Environment 对象可以读取配置文件中的属性值,并传递给 UserService 实例的构造方法。

23. @Qualifier

代码作用

用于指定注入的 Bean 的名称,当存在多个相同类型的 Bean 时,通过名称来区分并注入指定的 Bean。

代码用例

1
2
3
4
5
6
7
8
9
@Component
public class UserServiceImpl implements UserService {

@Autowired
@Qualifier("userRepositoryImpl")
private UserRepository userRepository;

// 其他方法
}

代码分析

  • @Component 注解标注在 UserServiceImpl 类上,表明该类是一个 Spring Bean。
  • @Autowired 注解用于自动装配 UserRepository 类型的 Bean,@Qualifier("userRepositoryImpl") 注解指定要注入的 Bean 名称为 userRepositoryImpl

24. @ExceptionHandler

代码作用

用于处理异常,在控制器中指定一个方法来处理特定类型的异常。

代码用例

1
2
3
4
5
6
7
8
9
10
11
@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception ex) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("errorMessage", ex.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}

代码分析

  • @ControllerAdvice 注解标注在 GlobalExceptionHandler 类上,表明该类是一个全局异常处理器。
  • @ExceptionHandler(Exception.class) 注解指定 handleException 方法处理所有类型的异常,将异常信息封装到 ModelAndView 对象中并返回。

25. @ResponseStatus

代码作用

用于指定异常的HTTP响应状态码。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Controller  
public class UserController {
@GetMapping("/user/{id}")
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public UserDetails getUserDetails(@PathVariable("id") Long id) {
// 查询用户信息
UserDetails userDetails = userService.getUserDetails(id);
if (userDetails == null) {
throw new UserNotFoundException("User not found");
}
return userDetails;
}

@ExceptionHandler(UserNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
public String handleUserNotFoundException(UserNotFoundException ex) {
return ex.getMessage();
}
}

代码分析

  • @ResponseStatus(HttpStatus.OK) 注解标注在 getUserDetails 方法上,指定该方法正常返回时的HTTP响应状态码为 OK
  • @ResponseStatus(HttpStatus.NOT_FOUND) 注解标注在 handleUserNotFoundException 方法上,指定当处理 UserNotFoundException 异常时的HTTP响应状态码为 NOT_FOUND

26. @ControllerAdvice

代码作用

用于全局处理异常。@ControllerAdvice是Spring框架中的一个注解,用于定义全局控制器通知。在Spring MVC框架中,控制器通知是一些特殊的组件,它们可以在控制器方法执行前、执行后或抛出异常时执行一些额外的逻辑处理。使用@ControllerAdvice注解可以定义全局控制器通知,它可以应用于所有的控制器。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@ControllerAdvice  
public class GlobalControllerAdvice {

@ModelAttribute("currentUser")
public User getCurrentUser() {
// 获取当前登录用户信息
User currentUser = userService.getCurrentUser();
return currentUser;
}

@InitBinder
public void initBinder(WebDataBinder binder) {
// 注册自定义的属性编辑器
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}

@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception ex) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("errorMessage", ex.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}

代码分析

  • @ControllerAdvice 注解标注在 GlobalControllerAdvice 类上,表明该类是一个全局控制器通知。
  • @ModelAttribute("currentUser") 注解标注的 getCurrentUser 方法会在所有控制器方法执行前执行,用于将当前登录用户信息添加到模型中。
  • @InitBinder 注解标注的 initBinder 方法会在所有控制器方法执行前执行,用于注册自定义的属性编辑器。
  • @ExceptionHandler(Exception.class) 注解指定 handleException 方法处理所有类型的异常,将异常信息封装到 ModelAndView 对象中并返回。

27. @CrossOrigin

代码作用

用于解决跨域问题。@CrossOrigin是Spring框架中的一个注解,用于解决跨域资源共享(CORS)问题。跨域资源共享是浏览器安全策略的一部分,它限制了浏览器在不同域名之间发送和接收HTTP请求。使用@CrossOrigin注解可以指定允许跨域访问的域名和HTTP方法。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
@RestController  
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:8080", methods = {RequestMethod.GET, RequestMethod.POST})
public class ApiController {

@GetMapping("/users")
public List<User> getUsers() {
// 查询用户信息
List<User> users = userService.getUsers();
return users;
}
}

代码分析

  • @RestController 注解标注在 ApiController 类上,表明该类是一个RESTful风格的控制器。
  • @RequestMapping("/api") 注解在类级别,指定该控制器处理的请求路径以 /api 开头。
  • @CrossOrigin(origins = "http://localhost:8080", methods = {RequestMethod.GET, RequestMethod.POST}) 注解指定允许来自 http://localhost:8080 域名的 GETPOST 请求访问该控制器中的方法。

28. @Async

代码作用

用于将方法标记为异步执行。在Spring框架中,如果一个方法需要执行一些比较耗时的操作,如果这个方法是在主线程中执行,就会导致主线程被阻塞,用户界面无法响应用户的操作。使用@Async注解可以将这个方法的执行异步化,让主线程继续执行其他任务,提高应用程序的响应性能。

代码用例

1
2
3
4
5
6
7
8
9
10
@Service  
public class UserService {

@Async
public CompletableFuture<UserDetails> getUserDetailsAsync(Long id) {
// 查询用户信息
UserDetails userDetails = userRepository.getUserDetails(id);
return CompletableFuture.completedFuture(userDetails);
}
}

代码分析

  • @Service 注解标注在 UserService 类上,表明该类是一个服务。
  • @Async 注解标注在 getUserDetailsAsync 方法上,表示这个方法需要异步执行,查询用户信息的操作在异步线程中执行,不会阻塞主线程,且该方法返回一个 CompletableFuture 对象,表示异步执行的结果。

29. @Cacheable

代码作用

用于缓存方法的返回值。在Spring框架中,如果一个方法的返回结果是固定的,而且这个方法的执行比较耗时,我们可以使用@Cacheable注解将这个方法的返回结果缓存起来,下次执行这个方法时直接从缓存中获取结果,避免重复执行。

代码用例

1
2
3
4
5
6
7
8
9
10
@Service  
public class UserService {

@Cacheable("userCache")
public User getUser(Long id) {
// 查询用户信息
User user = userRepository.getUser(id);
return user;
}
}

代码分析

  • @Service 注解标注在 UserService 类上,表明该类是一个服务。
  • @Cacheable("userCache") 注解标注在 getUser 方法上,表示这个方法的返回结果可以被缓存到名为 userCache 的缓存中。首次执行时查询用户信息并缓存结果,下次执行若缓存存在则直接获取,无需再次查询。

30. @CacheEvict

代码作用

用于清除缓存。@CacheEvict是Spring框架中的一个注解,用于清空缓存中的数据。在Spring框架中,如果一个方法的执行会导致缓存数据的失效,我们可以使用@CacheEvict注解将这个方法的缓存数据清空,这样下次执行这个方法时就会重新查询数据并缓存起来。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service  
public class UserService {

@Cacheable("userCache")
public User getUser(Long id) {
// 查询用户信息
User user = userRepository.getUser(id);
return user;
}

@CacheEvict("userCache")
public void clearCache() {
// 清空缓存
}
}

代码分析

  • @Service 注解标注在 UserService 类上,表明该类是一个服务。
  • @Cacheable("userCache") 注解标注的 getUser 方法,其返回结果会被缓存。
  • @CacheEvict("userCache") 注解标注的 clearCache 方法,会清空名为 userCache 的缓存,使得下次执行 getUser 方法时需重新查询并缓存数据。

31. @CachePut

代码作用

用于更新缓存中的数据。@CachePut是Spring框架中的一个注解,用于更新或添加缓存中的数据。在Spring框架中,如果一个方法的执行会导致缓存数据的更新或添加,我们可以使用@CachePut注解将这个方法的返回结果更新或添加到缓存中。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Service  
public class UserService {

@Cacheable("userCache")
public User getUser(Long id) {
// 查询用户信息
User user = userRepository.getUser(id);
return user;
}

@CachePut("userCache")
public User updateUser(Long id, User user) {
// 更新用户信息
User updatedUser = userRepository.updateUser(id, user);
return updatedUser;
}
}

代码分析

  • @Service 注解标注在 UserService 类上,表明该类是一个服务。
  • @Cacheable("userCache") 注解标注的 getUser 方法,其返回结果会被缓存。
  • @CachePut("userCache") 注解标注的 updateUser 方法,在更新用户信息后,会将返回的更新后的用户信息更新或添加到名为 userCache 的缓存中,以便下次 getUser 方法可获取最新缓存数据。

32. @Transactional

代码作用

用于启用事务管理功能。@Transactional是Spring框架中的一个注解,用于标识一个方法或类需要使用事务进行操作。在Spring框架中,如果一个方法需要对数据库进行操作,我们可以使用@Transactional注解来确保这个操作在一个事务中进行,从而保证操作的原子性、一致性、隔离性和持久性。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Service  
@Transactional
public class UserService {

@Autowired
private UserRepository userRepository;

public void createUser(User user) {
userRepository.save(user);
}

public void updateUser(Long id, User user) {
User existingUser = userRepository.findById(id);

if (existingUser != null) {
existingUser.setName(user.getName());
existingUser.setEmail(user.getEmail());
userRepository.save(existingUser);
}
}
}

代码分析

  • @Service 注解标注在 UserService 类上,表明该类是一个服务。
  • @Transactional 注解标注在类上,表示该类中的 createUserupdateUser 方法都需要使用事务进行操作,userRepository 的操作都在一个事务中进行,以保证操作的原子性、一致性、隔离性和持久性。

34. @EnableAspectJAutoProxy

代码作用

用于启用AOP功能。@EnableAspectJAutoProxy是Spring框架中的一个注解,用于启用自动代理功能,以便使用AOP(面向切面编程)进行编程。在Spring框架中,如果需要使用AOP来实现某些功能,我们可以使用@EnableAspectJAutoProxy注解来启用自动代理功能,从而在运行时自动为我们生成代理对象,以便进行切面编程。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration  
@EnableAspectJAutoProxy
public class AppConfig {

@Bean
public MyAspect myAspect() {
return new MyAspect();
}

@Bean
public UserService userService() {
return new UserService();
}
}

代码分析

  • @Configuration 注解标注在 AppConfig 类上,表明该类是一个配置类。
  • @EnableAspectJAutoProxy 注解标注在类上,表示这个配置类需要启用自动代理功能。
  • @Bean 注解标注的 myAspect 方法返回一个 MyAspect 实例,myAspect 类用于实现切面编程功能,@Bean 注解标注的 userService 方法返回一个 UserService 实例,用于实现业务功能。

35. @Aspect

代码作用

用于定义切面。@Aspect是Spring框架中的一个注解,用于标识一个类为切面类,从而可以在该类中定义切面逻辑以实现AOP(面向切面编程)。在Spring框架中,如果需要使用AOP来实现某些功能,我们可以使用@Aspect注解来标识一个类为切面类。在切面类中,我们可以定义切面逻辑,包括切入点、通知类型和切面顺序等,从而实现AOP编程的功能。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Aspect  
@Component
public class MyAspect {

@Before("execution(* com.example.UserService.*(..))")
public void beforeAdvice() {
System.out.println("Before advice is executed.");
}

@After("execution(* com.example.UserService.*(..))")
public void afterAdvice() {
System.out.println("After advice is executed.");
}
}

代码分析

  • @Aspect 注解标注在 MyAspect 类上,表明该类是一个切面类,@Component 注解用于将该类纳入Spring容器管理。
  • @Before("execution(* com.example.UserService.*(..))") 注解标注的 beforeAdvice 方法,定义了在 com.example.UserService 类中所有方法执行前执行的通知逻辑。
  • @After("execution(* com.example.UserService.*(..))") 注解标注的 afterAdvice 方法,定义了在 com.example.UserService 类中所有方法执行后执行的通知逻辑。

36. @Pointcut

代码作用

用于定义切点。@Pointcut是Spring框架中的一个注解,用于定义一个切入点,从而可以在该切入点上定义通知类型以实现AOP(面向切面编程)。在Spring框架中,如果需要使用AOP来实现某些功能,我们可以使用@Pointcut注解来定义一个切入点。在切入点上,我们可以定义切面逻辑,包括通知类型和切面顺序等,从而实现AOP编程的功能。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Aspect  
@Component
public class MyAspect {

@Pointcut("execution(* com.example.UserService.*(..))")
public void userServicePointcut() {}

@Before("userServicePointcut()")
public void beforeAdvice() {
System.out.println("Before advice is executed.");
}

@After("userServicePointcut()")
public void afterAdvice() {
System.out.println("After advice is executed.");
}
}

代码分析

  • @Aspect 注解标注在 MyAspect 类上,表明该类是一个切面类,@Component 注解用于将该类纳入Spring容器管理。
  • @Pointcut("execution(* com.example.UserService.*(..))") 注解标注的 userServicePointcut 方法定义了一个切入点,@Before("userServicePointcut()") 注解标注的 beforeAdvice 方法和 @After("userServicePointcut()") 注解标注的 afterAdvice 方法分别定义了在该切入点对应的目标方法执行前和执行后的通知逻辑。

37. @Before

代码作用

用于在方法执行前执行通知。@Before是Spring框架中的一个注解,用于定义在目标方法执行前执行的通知类型,以实现AOP(面向切面编程)。在Spring框架中,如果需要在目标方法执行前执行某些操作,我们可以使用@Before注解来定义一个通知类型。在这个通知类型中,我们可以编写自己的逻辑代码,从而实现AOP编程的功能。

代码用例

1
2
3
4
5
6
7
8
9
@Aspect  
@Component
public class MyAspect {

@Before("execution(* com.example.UserService.*(..))")
public void beforeAdvice() {
System.out.println("Before advice is executed.");
}
}

代码分析

  • @Aspect 注解标注在 MyAspect 类上,表明该类是一个切面类,@Component 注解用于将该类纳入Spring容器管理。
  • @Before("execution(* com.example.UserService.*(..))") 注解标注的 beforeAdvice 方法,定义了在 com.example.UserService 类中所有方法执行前执行的通知逻辑,即打印 Before advice is executed.

38. @After

代码作用

用于在方法执行后执行通知。@After是Spring框架中的一个注解,用于定义在目标方法执行后执行的通知类型,以实现AOP(面向切面编程)。在Spring框架中,如果需要在目标方法执行后执行某些操作,我们可以使用@After注解来定义一个通知类型。在这个通知类型中,我们可以编写自己的逻辑代码,从而实现AOP编程的功能。

代码用例

1
2
3
4
5
6
7
8
9
@Aspect  
@Component
public class MyAspect {

@After("execution(* com.example.UserService.*(..))")
public void afterAdvice() {
System.out.println("After advice is executed.");
}
}

代码分析

  • @Aspect注解标注在MyAspect类上,表明该类是一个切面类。
  • @Component注解用于将MyAspect类纳入Spring容器管理。
  • @After("execution(* com.example.UserService.*(..))")注解标注的afterAdvice方法,定义了在com.example.UserService类中所有方法执行后执行的通知逻辑,即打印After advice is executed.

39. @Around

代码作用

用于在方法执行前后执行通知。@Around是Spring框架中的一个注解,用于定义在目标方法执行前后执行的通知类型,以实现AOP(面向切面编程)。在Spring框架中,如果需要在目标方法执行前后执行某些操作,我们可以使用@Around注解来定义一个通知类型。在这个通知类型中,我们可以编写自己的逻辑代码,从而实现AOP编程的功能。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
@Aspect  
@Component
public class MyAspect {

@Around("execution(* com.example.UserService.*(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Before advice is executed.");
Object result = joinPoint.proceed();
System.out.println("After advice is executed.");
return result;
}
}

代码分析

  • @Aspect注解标注在MyAspect类上,表明该类是一个切面类。
  • @Component注解用于将MyAspect类纳入Spring容器管理。
  • @Around("execution(* com.example.UserService.*(..))")注解标注的aroundAdvice方法,定义了在com.example.UserService类中所有方法执行前后的通知逻辑。在方法执行前打印Before advice is executed.,通过joinPoint.proceed()执行目标方法,在方法执行后打印After advice is executed.,并返回目标方法的执行结果。

40. @AfterReturning

代码作用

用于在方法返回结果后执行通知。@AfterReturning是Spring框架中的一个注解,用于定义在目标方法返回结果后执行的通知类型,以实现AOP(面向切面编程)。在Spring框架中,如果需要在目标方法返回结果后执行某些操作,我们可以使用@AfterReturning注解来定义一个通知类型。在这个通知类型中,我们可以编写自己的逻辑代码,从而实现AOP编程的功能。

代码用例

1
2
3
4
5
6
7
8
9
@Aspect  
@Component
public class MyAspect {

@AfterReturning(pointcut = "execution(* com.example.UserService.*(..))", returning = "result")
public void afterReturningAdvice(Object result) {
System.out.println("After returning advice is executed. Result is " + result);
}
}

代码分析

  • @Aspect注解标注在MyAspect类上,表明该类是一个切面类。
  • @Component注解用于将MyAspect类纳入Spring容器管理。
  • @AfterReturning(pointcut = "execution(* com.example.UserService.*(..))", returning = "result")注解标注的afterReturningAdvice方法,定义了在com.example.UserService类中所有方法返回结果后执行的通知逻辑。当目标方法返回结果时,将结果传递给afterReturningAdvice方法,并打印After returning advice is executed. Result is 以及结果内容。

41. @AfterThrowing

代码作用

用于在方法抛出异常后执行通知。@AfterThrowing是Spring框架中的一个注解,用于定义在目标方法抛出异常后执行的通知类型,以实现AOP(面向切面编程)。在Spring框架中,如果需要在目标方法抛出异常后执行某些操作,我们可以使用@AfterThrowing注解来定义一个通知类型。在这个通知类型中,我们可以编写自己的逻辑代码,从而实现AOP编程的功能。

代码用例

1
2
3
4
5
6
7
8
9
@Aspect  
@Component
public class MyAspect {

@AfterThrowing(pointcut = "execution(* com.example.UserService.*(..))", throwing = "ex")
public void afterThrowingAdvice(Exception ex) {
System.out.println("After throwing advice is executed. Exception is " + ex);
}
}

代码分析

  • @Aspect注解标注在MyAspect类上,表明该类是一个切面类。
  • @Component注解用于将MyAspect类纳入Spring容器管理。
  • @AfterThrowing(pointcut = "execution(* com.example.UserService.*(..))", throwing = "ex")注解标注的afterThrowingAdvice方法,定义了在com.example.UserService类中所有方法抛出异常后执行的通知逻辑。当目标方法抛出异常时,将异常对象传递给afterThrowingAdvice方法,并打印After throwing advice is executed. Exception is 以及异常信息。

42. @Order

代码作用

用于指定切面的执行顺序。@Order是Spring框架中的一个注解,用于定义切面的执行顺序。在Spring框架中,如果有多个切面类需要对同一个方法进行切面处理,那么这些切面类的执行顺序可能会影响到最终的结果。为了控制这些切面类的执行顺序,我们可以使用@Order注解来定义它们的执行顺序。@Order注解可以应用在切面类上,用于指定切面执行的顺序。它的参数为一个整数,数值越小表示优先级越高,数值相同时按照类名的自然顺序进行排序。

代码用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Aspect  
@Component
@Order(1)
public class MyAspect1 {

@Before("execution(* com.example.UserService.*(..))")
public void beforeAdvice() {
System.out.println("Before advice from MyAspect1 is executed.");
}
}

@Aspect
@Component
@Order(2)
public class MyAspect2 {

@Before("execution(* com.example.UserService.*(..))")
public void beforeAdvice() {
System.out.println("Before advice from MyAspect2 is executed.");
}
}

代码分析

  • @Aspect@Component注解分别标注在MyAspect1MyAspect2类上,表明这两个类都是切面类且被纳入Spring容器管理。
  • @Order(1)注解标注在MyAspect1类上,@Order(2)注解标注在MyAspect2类上,指定了MyAspect1的执行顺序优先于MyAspect2
  • 两个类中的@Before("execution(* com.example.UserService.*(..))")注解标注的beforeAdvice方法,定义了在com.example.UserService类中所有方法执行前的通知逻辑,分别打印各自的提示信息。

43. @Slf4j

代码作用

用于简化日志记录。@Slf4j是Lombok框架中的一个注解,用于在Java类中自动生成日志记录器。在Java开发中,日志记录是非常重要的一环,可以帮助我们更好地了解程序的运行情况,从而更好地进行调试和优化。通常情况下,我们需要手动引入日志框架(如Log4j、SLF4J等)并编写相应的日志记录代码。这些代码可能会比较繁琐,而且容易出现错误。为了简化这个过程,Lombok框架提供了一个@Slf4j注解,可以在Java类中自动生成日志记录器。使用@Slf4j注解非常简单,只需要在Java类中添加这个注解即可。在使用时,我们可以直接使用log变量来记录日志,而不需要再引入其他的日志框架。

代码用例

1
2
3
4
5
6
7
8
9
@Slf4j  
public class MyService {

public void doSomething() {
log.debug("This is a debug message.");
log.info("This is an info message.");
log.error("This is an error message.");
}
}

代码分析

  • @Slf4j注解标注在MyService类上,自动生成了日志记录器。
  • doSomething方法中,通过log变量直接调用debuginfoerror方法记录不同级别的日志信息,无需手动引入其他日志框架。需注意使用@Slf4j注解需要在编译器中安装Lombok插件,否则可能出现编译错误。

44. @Data

代码作用

用于自动生成JavaBean的getters、setters、toString、hashCode和equals方法。@Data是Lombok框架中的一个注解,可以自动生成Java类的getter、setter、equals、hashCode和toString等方法。在Java开发中,我们经常需要编写一些POJO类来表示数据结构。这些类通常包含一些成员变量,并且需要编写相应的getter、setter、equals、hashCode和toString等方法。这些方法通常是相似的,而且比较繁琐。为了简化这个过程,Lombok框架提供了一个@Data注解,可以自动生成这些方法。使用@Data注解非常简单,只需要在Java类上添加这个注解即可。在使用时,我们可以直接访问类的成员变量,并且可以自动生成相应的getter、setter、equals、hashCode和toString等方法。

代码用例

1
2
3
4
5
6
@Data  
public class User {
private Long id;
private String name;
private Integer age;
}

代码分析

  • @Data注解标注在User类上,Lombok会自动为该类的idnameage成员变量生成对应的gettersetter方法,同时生成equalshashCodetoString方法,简化了POJO类的编写。

45. @NoArgsConstructor

代码作用

用于生成无参构造函数。@NoArgsConstructor是Lombok框架中的一个注解,用于自动生成一个无参构造方法。在Java开发中,我们经常需要编写一些POJO类来表示数据结构。这些类通常包含一些成员变量,并且需要编写相应的构造方法。在某些情况下,我们可能需要编写一个无参构造方法,用于创建一个对象的实例。这个构造方法通常是简单的、无需参数的。为了简化这个过程,Lombok框架提供了一个@NoArgsConstructor注解,可以自动生成一个无参构造方法。使用@NoArgsConstructor注解非常简单,只需要在Java类上添加这个注解即可。在使用时,我们可以直接创建对象的实例,而不需要手动编写无参构造方法。

代码用例

1
2
3
4
5
6
@NoArgsConstructor  
public class User {
private Long id;
private String name;
private Integer age;
}

代码分析

  • @NoArgsConstructor注解标注在User类上,Lombok自动为User类生成了一个无参构造方法。这样在其他类中可以直接创建User对象的实例,无需手动编写无参构造方法,但使用该注解需要在编译器中安装Lombok插件,否则可能出现编译错误。

46. @AllArgsConstructor

代码作用

用于生成全参构造函数。@AllArgsConstructor是Lombok框架中的一个注解,用于自动生成一个全参构造方法。在Java开发中,我们经常需要编写一些POJO类来表示数据结构。这些类通常包含一些成员变量,并且需要编写相应的构造方法。在某些情况下,我们可能需要编写一个全参构造方法,用于初始化所有成员变量。这个构造方法通常包含所有成员变量作为参数。为了简化这个过程,Lombok框架提供了一个@AllArgsConstructor注解,可以自动生成一个全参构造方法。使用@AllArgsConstructor注解非常简单,只需要在Java类上添加这个注解即可。在使用时,我们可以直接创建对象的实例,并传入相应的参数,而不需要手动编写全参构造方法。

代码用例

1
2
3
4
5
6
@AllArgsConstructor  
public class User {
private Long id;
private String name;
private Integer age;
}

代码分析

  • @AllArgsConstructor注解标注在User类上,Lombok自动为User类生成了一个包含idnameage三个参数的全参构造方法。在其他类中创建User对象实例时,可以直接传入对应参数,无需手动编写全参构造方法,但需安装Lombok插件,否则可能编译出错。

47. @Builder

代码作用

用于生成Builder模式的构造函数。@Builder是Lombok框架中的一个注解,用于自动生成一个Builder模式的构造器。在Java开发中,我们经常需要编写一些POJO类来表示数据结构。这些类通常包含一些成员变量,并且需要编写相应的构造方法。在某些情况下,我们可能需要编写一个Builder模式的构造器,用于方便地创建对象实例。Builder模式是一种创建对象的设计模式,它可以通过链式调用的方式设置对象的属性,并最终创建一个不可变的对象。为了简化这个过程,Lombok框架提供了一个@Builder注解,可以自动生成一个Builder模式的构造器。使用@Builder注解非常简单,只需要在Java类上添加这个注解即可。在使用时,我们可以使用链式调用的方式设置对象的属性,并最终创建一个不可变的对象。

代码用例

1
2
3
4
5
6
@Builder  
public class User {
private Long id;
private String name;
private Integer age;
}

代码分析

  • @Builder注解标注在User类上,Lombok自动为User类生成了Builder模式的构造器。这样在其他类中创建User对象时,可以通过链式调用的方式设置idnameage等属性,最终创建一个不可变的User对象,但使用该注解需安装Lombok插件,否则可能编译失败。

48. @EqualsAndHashCode

代码作用

用于生成hashCode和equals方法。@EqualsAndHashCode是Lombok框架中的一个注解,用于自动生成equals()和hashCode()方法。在Java开发中,我们经常需要比较两个对象是否相等,并且需要根据对象的属性生成一个hashCode值。为了简化这个过程,Lombok框架提供了一个@EqualsAndHashCode注解,可以自动生成equals()和hashCode()方法。使用@EqualsAndHashCode注解非常简单,只需要在Java类上添加这个注解即可。在使用时,Lombok会根据类的属性自动生成equals()和hashCode()方法。如果两个对象的所有属性都相等,那么它们的equals()方法返回true,并且它们的hashCode()方法返回相同的值。

代码用例

1
2
3
4
5
6
@EqualsAndHashCode  
public class User {
private Long id;
private String name;
private Integer age;
}

代码分析

  • @EqualsAndHashCode注解标注在User类上,Lombok会根据User类的idnameage成员变量自动生成equalshashCode方法。当比较两个User对象时,会根据这些属性判断是否相等并生成相应的hashCode值。

49. @ToString

代码作用

用于生成toString方法。@ToString是Lombok框架中的一个注解,用于自动生成toString()方法。在Java开发中,我们经常需要将对象转换为字符串,以便于输出或日志记录。为了简化这个过程,Lombok框架提供了一个@ToString注解,可以自动生成toString()方法。使用@ToString注解非常简单,只需要在Java类上添加这个注解即可。在使用时,Lombok会根据类的属性自动生成toString()方法,这个方法将输出类的名称和所有属性的名称和值。如果需要排除某些属性,可以使用exclude属性来指定排除的属性。

代码用例

1
2
3
4
5
6
@ToString(exclude = "password")  
public class User {
private Long id;
private String name;
private String password;
}

代码分析

  • @ToString(exclude = "password")注解标注在User类上,Lombok会自动为User类生成toString方法。生成的toString方法会输出类名以及idname属性的名称和值,由于使用了exclude = "password",所以password属性不会在toString方法的输出中出现。

50. @Getter

代码作用

用于生成getters方法。@Getter是Lombok框架中的一个注解,用于自动生成getter方法。在Java开发中,我们经常需要为类的属性编写getter和setter方法。为了简化这个过程,Lombok框架提供了一个@Getter注解,可以自动生成getter方法。使用@Getter注解非常简单,只需要在Java类上添加这个注解即可。在使用时,Lombok会根据类的属性自动生成对应的getter方法。如果需要生成setter方法,可以使用@Setter注解。

代码用例

1
2
3
4
5
6
@Getter  
public class User {
private Long id;
private String name;
private Integer age;
}

代码分析

  • @Getter注解标注在User类上,Lombok会自动为User类中的private Long idprivate String nameprivate Integer age属性生成对应的getter方法,如getId()getName()getAge(),从而避免了手动编写这些方法的繁琐过程。