首页 > 其他分享 >SpringBoot常用注解(超级详细,快快收藏)

SpringBoot常用注解(超级详细,快快收藏)

时间:2024-09-29 15:18:54浏览次数:8  
标签:缓存 SpringBoot 快快 Spring class 注解 方法 public

目录

(1)@SpringBootApplication

(2)@RestController

(3)@RequestMapping

(4)@GetMapping

(5)@PostMapping

(6)@PutMapping

(7)@DeleteMapping

(8)@RequestParam

(9)@PathVariable

(10)@RequestBody

(11)@ResponseBody

(12)@Autowired

(13)@Component

(14)@Service

(15)@Repository

(16)@Configuration

(17)@Value

(18)@Bean

(19)@Import

(20)@Conditional

(21)@Profile

(22)@PropertySource

(23)@Qualifier

(24)@ExceptionHandler

(25)@ResponseStatus

(26)@ControllerAdvice

(27)@CrossOrigin

(28)@Async

(29)@Cacheable

(30)@CacheEvict

(31)@CachePut

(32)@Transactional

失效场景

(33)@EnableTransactionManagement

(34)@EnableAspectJAutoProxy

(35)@Aspect

(36)@Pointcut

(37)@Before

(38)@After

(39)@Around

(40)@AfterReturning

(41)@AfterThrowing

(42)@Order

(43)@Slf4j

(44)@Data

(45)@NoArgsConstructor

(46)@AllArgsConstructor

作用:用于生成全参构造函数。

(47)@Builder

(48)@EqualsAndHashCode

(49)@ToString

(50)@Getter


(1)@SpringBootApplication


作用:这是一个组合注解,包括了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。用于标识SpringBoot应用程序的入口类。

@Configuration:指示这个类是一个配置类,它定义了一个或多个@Bean方法,用于创建和配置Spring应用程序上下文中的Bean。

@EnableAutoConfiguration:启用Spring Boot的自动配置机制,它会自动添加所需的依赖项和配置,以使应用程序能够运行。

@ComponentScan:指示Spring Boot扫描当前包及其子包中的所有@Component、@Service、@Repository和@Controller注解的类,并将它们注册为Spring Bean。

@SpringBootApplication注解通常被用于Spring Boot应用程序的入口类上,用于启动Spring Boot应用程序。它可以简化Spring应用程序的配置和启动过程。

用例:

@SpringBootApplication
public class MyApplication {

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


(2)@RestController


作用:与@Controller类似,但是@RestController会自动将返回值转换为JSON格式。

@RestController是Spring Framework 4.0版本引入的一个注解,它是@Controller和@ResponseBody的组合注解。它用于标注一个类,表示这个类是一个RESTful风格的控制器,可以处理HTTP请求并返回JSON/XML格式的响应。

@RestController注解用于替代原来的@Controller注解,它默认情况下会将控制器方法的返回值转换为JSON格式,并以HTTP响应的方式返回给客户端。如果需要返回XML格式的响应,可以使用其他注解,如@Produces和@Consumes。

用例:

@RestController
public class HelloController {

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


(3)@RequestMapping


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

用例:

@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删除用户
    }
}


(4)@GetMapping


作用:用于映射HTTP GET请求。

用例:

@RestController
@RequestMapping("/api")
public class UserController {

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

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


(5)@PostMapping


作用:用于映射HTTP POST请求。

用例:

@RestController
@RequestMapping("/api")
public class UserController {

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


(6)@PutMapping


作用:用于映射HTTP PUT请求。

用例:

@RestController
@RequestMapping("/api")
public class UserController {

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


(7)@DeleteMapping


作用:用于映射HTTP DELETE请求。

用例:

@RestController
@RequestMapping("/api")
public class UserController {

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

1. GET
作用:GET方法是向服务器请求获取指定资源的常用手段,如请求一个网页、图像、文件等。请求的结果应当是可缓存的,并且安全地重发请求不会产生副作用(除非资源本身会发生变化)。
请求格式:URL后面可以跟查询字符串,以问号(?)开始,通过key=value的形式传递参数,多个参数之间用&分隔。例如:https://example.com/api/data?key1=value1&key2=value2
安全性与隐私:因为GET请求的参数会显示在URL中,所以不宜用于传输敏感信息,搜索引擎也会索引这些URL,可能暴露数据。
缓存策略:GET请求的响应可以被缓存,以提高性能和减少带宽消耗。
 假设我们有一个天气预报API,想要获取北京的实时天气情况,可以发送如下GET请求:

GET /api/weather?location=beijing HTTP/1.1
Host: weather.example.com
请求URL中通过查询参数location传递了城市名"beijing",服务器收到请求后返回该城市的天气信息。

2. POST
作用:POST方法用于向服务器提交数据,让服务器进行处理,如创建新资源、更新现有资源或执行某个操作等。
请求格式:POST请求的数据通常放在请求体(Request Body)中,可以是表单数据(application/x-www-form-urlencoded或multipart/form-data)、JSON数据(application/json)等形式。
安全性:POST请求的数据不会显示在URL中,相对更安全,适用于提交敏感数据。
幂等性:理想情况下,POST方法不应该是幂等的,也就是说,多次执行相同的POST请求可能会有不同的结果,例如创建多个资源。但在实际应用中,特别是遵循RESTful原则的设计中,POST有时也可以用于幂等的操作,如支付订单,但严格来讲,这种场景更适合使用PUT或PATCH方法。
缓存策略:POST请求通常不会被缓存,以防止意外重复提交。
在一个博客平台,当用户发表一篇新文章时,会发送POST请求:

POST /api/posts HTTP/1.1
Host: blog.example.com
Content-Type: application/json
 
{
  "title": "My First Blog Post",
  "content": "This is the content of my first blog post...",
  "author": "John Doe"
}
请求体中包含了新文章的JSON数据,服务器接收到请求后将在数据库中创建这篇新文章。

3. PUT
作用:PUT方法用于替换服务器上的某一资源,如果资源存在,则更新资源;如果资源不存在,则创建新资源(取决于服务器是否支持)。
请求格式:PUT请求的请求体中必须包含完整的资源表示,服务器会根据请求体内容更新资源,或者用请求体内容创建新资源。
幂等性:PUT方法是幂等的,即无论请求多少次,只要请求体内容不变,服务器对资源的更改效果都是一样的。
缓存策略:PUT请求通常不应被缓存,但如果服务器确保了PUT操作的幂等性和可缓存性,那么在某些条件下是可以缓存的。
假设我们有一个用户资料管理API,当用户修改个人信息时,可以发送PUT请求更新用户资料:

PUT /api/users/123 HTTP/1.1
Host: account.example.com
Content-Type: application/json
 
{
  "name": "Jane Smith",
  "email": "[email protected]",
  "age": 30
}
请求URL标识了要更新的用户资源(ID为123),请求体中包含了更新后的用户信息,服务器会根据请求体内容更新该用户的资料。

4. DELETE
作用:DELETE方法用于请求服务器删除指定的资源。
请求格式:DELETE请求通常只需在URL中指定要删除的资源位置,请求体可选,但即使提供,很多服务器也不会处理。
幂等性:DELETE方法是幂等的,多次发送相同的DELETE请求至同一URL,服务器都会尝试删除该资源,但一旦资源被删除,后续请求将返回资源未找到(404 Not Found)。
缓存策略:与PUT方法相似,DELETE请求通常不应被缓存,但如果服务器确保了DELETE操作的幂等性和可缓存性,在特定条件下也可以考虑缓存。
在同个用户资料管理API中,管理员决定删除某个用户账号,可以发送DELETE请求:

DELETE /api/users/456 HTTP/1.1
Host: account.example.com
请求URL中指定了要删除的用户资源(ID为456),服务器接收到请求后会删除对应的用户账号及其关联数据。

总结起来,每种HTTP请求方法都有其特定的目的和行为准则,理解和正确使用它们是构建高效、可靠Web服务的关键。同时,注意HTTP方法的语义并非强制性的,服务器可根据自身需求实现不同的逻辑。

(8)@RequestParam


作用:用于获取请求参数的值。

用例:

@RestController
@RequestMapping("/api")
public class UserController {

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


(9)@PathVariable


作用:用于获取URL中的参数值。@PathVariable是Spring MVC框架中的一个注解,用于将HTTP请求路径中的变量绑定到控制器方法的参数上。

用例:

@RestController
@RequestMapping("/api")
public class UserController {

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

(10)@RequestBody


作用:用于将HTTP请求的主体转换为方法的参数。@RequestBody是Spring MVC框架中的一个注解,用于将HTTP请求体中的数据绑定到控制器方法的参数上。

用例:

@RestController
@RequestMapping("/api")
public class UserController {

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



(11)@ResponseBody


作用:用于将方法的返回值转换为HTTP响应的主体。@ResponseBody是Spring MVC框架中的一个注解,用于将控制器方法的返回值转换为HTTP响应体中的数据。

用例:

@RestController
public class UserController {

    @GetMapping("/users/{id}")
    @ResponseBody
    public User getUser(@PathVariable int id) {
        // 从数据库或其他地方获取用户数据
        User user = userService.getUserById(id);
        return user;
    }
}

@ResponseBody 的作用其实是将 java 对象转为 json 格式的数据。

@responseBody 注解的作用是将 controller 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到 response对象的 body 区,通常用来返回 JSON 数据或者是 XML 数据。
注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过 response 对象输出指定格式的数据。

@ResponseBody 是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用(也就是 AJAX)。

**注意:**在使用 @RequestMapping 后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

后台 Controller类中对应的方法:

// 接收 http://localhost:8080/video/user/login?usename=admin&password=123456
@RequestMapping("/login")
@ResponseBody
public Object login(String name, String password, HttpSession session) {
    user = userService.checkLogin(name, password);
    session.setAttribute("user", user);
    return new JsonResult(user);
}



如上面的登录后台代码可以改为:

// 接收 http://localhost:8080/video/user/login?usename=admin&password=123456
@RequestMapping("/login")
@ResponseBody
public Object login(@RequestBody User loginUuser, HttpSession session) {
    user = userService.checkLogin(loginUser);
    session.setAttribute("user", user);
    return new JsonResult(user);
}



@RequestBody 作用在形参列表上时,用于将前台发送过来固定格式的数据(xml 格式或者 json 等)封装为对应的 JavaBean 对象,
封装时使用到的一个对象是系统默认配置的,由 HttpMessageConverter 进行解析,然后封装到形参上。

(12)@Autowired


作用:用于自动装配Spring容器中的Bean。

用例:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

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


(13)@Component


作用:用于标识一个类是Spring容器中的组件。@Component是Spring框架中的一个通用注解,用于标注一个类作为Spring Bean。

用例:

@Component
public class UserServiceImpl implements UserService {

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

(14)@Service


作用:用于标识一个类是Spring容器中的服务组件。@Service是Spring框架中的一个注解,用于标注一个类作为服务类(Service)。

用例:

@Service
public class UserServiceImpl implements UserService {

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


(15)@Repository


作用:用于标识一个类是Spring容器中的数据访问组件。@Repository是Spring框架中的一个注解,用于标注一个类作为数据访问对象(DAO)。

@Repository是属于Spring的注解。它用来标注访问层的类(Dao层),它表示一个仓库,主要用于封装对于数据库的访问。其实现方式与@Component注解相同,只是为了明确类的作用而设立。
即@Repository是@Component注解的一个派生品,与@Service和@Controller都可以理解为@Component注解的扩展。他们的作用都是在类上实例化bean,并把当前类对象的实现类交给spring容器进行管理。

换句话说,@Repository注解修饰哪个类表明这个类具有对数据库CRUD的功能,用在持久层的接口上。

用例:

@Repository
public class UserRepositoryImpl implements UserRepository {

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

(16)@Configuration


作用:用于标识一个类是Spring的配置类。@Configuration是Spring框架中的一个注解,用于标注一个类作为配置类。

用例:

@Configuration
public class AppConfig {

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

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

(17)@Value

作用:用于获取配置文件中的属性值。@Value是Spring框架中的一个注解,用于将配置文件中的属性值注入到Bean对象中。

用例:

@Component
public class MyComponent {

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

    // 其他方法
}
这个类使用@Component注解标注,表示这个类是一个Spring Bean,可以被其他的Spring Bean自动装配。

在属性级别上,@Value注解指定了需要注入的属性值,这个属性值可以通过${...}的方式引用配置文件中的属性值。

在这个例子中,MyComponent类中的myProperty属性使用@Value注解指定了需要注入的属性值,Spring会自动将配置文件中名为my.property的属性值注入到这个属性中。

@Value注解用于注入配置文件中的属性值,使得开发者可以方便地从配置文件中获取属性值,并将其注入到Bean对象中。同时,使用@Value注解还可以方便地处理不同环境下的配置文件,如开发环境和生产环境的配置文件。

@Value注解是Spring框架中比较常用的注解之一,可以让开发者更加专注于业务逻辑的实现,而不必关心属性值的获取和注入细节。

(18)@Bean


作用:用于将一个方法返回的对象注册到Spring容器中。@Bean是Spring框架中的一个注解,用于将一个方法返回的对象注册为一个Spring Bean。

用例:

@Configuration
public class AppConfig {

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

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

(19)@Import


作用:用于导入其他配置类或Bean。

用例:

@Configuration
@Import({AppConfig1.class, AppConfig2.class})
public class AppConfig {

    // 其他方法
}


(20)@Conditional


作用:用于根据条件判断是否创建Bean或执行配置。

用例:

@Configuration
public class AppConfig {

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

    // 其他方法
}

(21)@Profile


作用:用于指定配置的环境,如开发环境、测试环境或生产环境。

为了多环境开发,Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能,比如数据源组件的配置,不同开发环境连接的数据源可能会不同,就可以使用@Profile注解进行配置,根据环境动态切换数据源组件。

@Profile:指定组件在哪个环境下才能被注册到容器中,不指定则任何环境都能注册这个组件,加了环境标识的bean,只有这个环境被激活的时候才能注册到容器

二、实例分析
就以数据源配置为例,不同环境数据源的配置往往不同,如何使用@Profile注解在不同环境下进行数据源的注册呢,通过实例来进行分析。

【1】@Profile环境搭建

// 启动测试类
@Test
public void TestMain() {
    // 创建IOC容器
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
    String[] namesForType = applicationContext.getBeanNamesForType(DataSource.class);
    for (String string : namesForType) {
        System.out.println(string);
    }
    // applicationContext.close();
}
 
// 配置类
@Configuration
public class AppConfig {
 
    // 测试环境
    // @Profile("test")
    @Bean("testDataSource")
    public DataSource dataSourceTest() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("806188");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/vhr");
        dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
        return dataSource;
    }
 
    // 开发环境
    // @Profile("dev")
    @Bean("devDataSource")
    public DataSource dataSourceDev() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("806188");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/vhr");
        dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
        return dataSource;
    }
 
    // 生产环境
    // @Profile("pro")
    @Bean("proDataSource")
    public DataSource dataSourcePro() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("806188");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/vhr");
        dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
        return dataSource;
    }
}


可以看到,在配置类中,有不同的数据源配置,分别是测试环境、开发环境、生产环境,我们可以通过@Profile注解来指定注入哪种环境,当不指定则任何环境都能注册这个组件,也就是上面代码,运行测试类,输出结果如下,三个数据源组价都进行了注入:

将数据源使用@Profile注解进行标识,也就是将上面代码三个@Profile注解打开,此时因为没有激活注册环境,所以这个三个数据源都不能被注入。

(22)@PropertySource


作用:用于指定配置文件的位置。@PropertySource是Spring框架中的一个注解,用于指定一组属性文件的位置,从而可以在Spring应用程序中使用这些属性。

用例:

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {

    @Autowired
    private Environment environment;

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

    // 其他方法
}


这个类使用@Configuration注解标注,表示这个类是一个配置类,用于配置应用程序的Bean对象。

在类级别上,使用@PropertySource注解可以指定一个属性文件的位置。在这个例子中,使用@PropertySource注解指定了一个名为application.properties的属性文件,它位于classpath下。

在方法级别上,使用@Bean注解标注方法,表示这个方法返回一个Bean对象。在这个例子中,使用Environment对象从属性文件中读取属性值,并将这些属性值传递给UserService实例的构造方法。

@PropertySource注解用于指定一组属性文件的位置,使得开发者可以在Spring应用程序中使用这些属性。同时,使用Environment对象可以方便地读取属性文件中的属性值,并将这些属性值传递给Bean对象的构造方法或属性。

@PropertySource注解是Spring框架中比较常用的注解之一,可以让开发者更加灵活地管理和配置Spring Bean。

(23)@Qualifier

作用:用于指定注入的Bean的名称。

@Qualifier注解可以区分具有相同类型的多个Bean,用于明确指定要注入的Bean的名称或限定符。通过为要注入的Bean添加 @Qualifier注解,你可以告诉Spring应该使用哪个Bean,以解决Spring框架中依赖注入时的歧义性问题。

假设我们有一个名为"UserService"的服务接口,有多个实现类可以用于不同的业务逻辑。现在,我们需要在另一个类中注入"UserService",但由于有多个实现类可用,我们需要明确指定要注入的具体实现类。

示例代码如下:

public interface UserService {
    void performAction();
}

@Component
@Qualifier("implementationA")
public class UserServiceImplA implements UserService {
    public void performAction() {
        System.out.println("Performing action with UserServiceImplA");
    }
}

@Component
@Qualifier("implementationB")
public class UserServiceImplB implements UserService {
    public void performAction() {
        System.out.println("Performing action with UserServiceImplB");
    }
}

@Component
public class UserClient {
    @Autowired
    @Qualifier("implementationA")
    private UserService userService;

    public void doSomething() {
        userService.performAction();
    }
}

(24)@ExceptionHandler


作用:用于处理异常。

用例:

@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注解标注,表示这个类是一个全局异常处理器。在方法级别上,使用@ExceptionHandler注解可以指定一个方法来处理控制器中抛出的异常。

在这个例子中,使用@ExceptionHandler注解指定了一个名为handleException的方法,它处理所有类型的异常。当控制器中抛出异常时,会调用这个方法,并将异常对象作为参数传递给这个方法。

在这个方法中,使用ModelAndView对象来封装错误信息,并将视图名称设置为error。最后,返回这个ModelAndView对象,将错误信息显示到用户界面上。

@ExceptionHandler注解用于处理控制器中抛出的异常,使得开发者可以根据需要灵活地处理异常。同时,使用@ControllerAdvice注解可以将这个异常处理器应用于所有的控制器中。

@ExceptionHandler注解是Spring框架中比较常用的注解之一,可以让开发者更加灵活地处理控制器中的异常。

(25)@ResponseStatus


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

用例:

@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();
    }
}

(26)@ControllerAdvice


作用:用于全局处理异常。

@ControllerAdvice是Spring框架中的一个注解,用于定义全局控制器通知。

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

用例:

@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注解标注,表示这个类是一个全局控制器通知。在方法级别上,使用@ModelAttribute注解标注方法,表示这个方法会在所有控制器方法执行前执行,用于将当前登录用户信息添加到模型中。

使用@InitBinder注解标注方法,表示这个方法会在所有控制器方法执行前执行,用于注册自定义的属性编辑器。

使用@ExceptionHandler注解标注方法,表示这个方法会在控制器中抛出异常时执行,用于处理控制器方法中抛出的异常。

@ControllerAdvice注解用于定义全局控制器通知,使得开发者可以在所有控制器方法执行前、执行后或抛出异常时执行一些额外的逻辑处理。同时,使用@ModelAttribute注解可以将一些公共的模型数据添加到模型中,使用@InitBinder注解可以注册自定义的属性编辑器,使用@ExceptionHandler注解可以处理控制器方法中抛出的异常。

@ControllerAdvice注解是Spring框架中比较常用的注解之一,可以让开发者更加灵活地定义全局控制器通知。

(27)@CrossOrigin


作用:用于解决跨域问题。

@CrossOrigin是Spring框架中的一个注解,用于解决跨域资源共享(CORS)问题。

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

用例:
 

@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注解标注,表示这个类是一个RESTful风格的控制器。在类级别上,使用@RequestMapping注解指定控制器处理的请求路径为/api。同时,使用@CrossOrigin注解可以指定允许跨域访问的域名和HTTP方法。

在这个例子中,使用@CrossOrigin注解指定允许来自http://localhost:8080域名的GET和POST请求访问该控制器中的方法。这意味着,在http://localhost:8080域名下的网页可以通过XMLHttpRequest对象发送GET和POST请求,访问该控制器中的方法。

@CrossOrigin注解用于解决跨域资源共享(CORS)问题,使得开发者可以更加灵活地控制允许跨域访问的域名和HTTP方法。它是一种简单但非常有效的解决方案,可以使得前端开发者更加轻松地开发跨域应用程序。

@CrossOrigin注解是Spring框架中比较常用的注解之一,可以让开发者更加灵活地解决跨域资源共享(CORS)问题。

(28)@Async


作用:用于将方法标记为异步执行。

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

用例:

@Service
public class UserService {

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

这个类使用@Service注解标注,表示这个类是一个服务。在方法级别上,使用@Async注解标注方法,表示这个方法需要异步执行。

在这个例子中,getUserDetailsAsync方法使用@Async注解标注,表示这个方法需要异步执行。查询用户信息的操作在异步线程中执行,不会阻塞主线程。同时,这个方法返回一个CompletableFuture对象,表示异步执行的结果。

@Async注解用于异步执行方法,可以提高应用程序的响应性能。它是一种简单但非常有效的解决方案,可以使得开发者更加轻松地编写并发应用程序。

@Async注解是Spring框架中比较常用的注解之一,可以让开发者更加灵活地异步执行方法。需要注意的是,异步执行的方法必须在一个独立的线程中执行,因此需要使用线程池来管理异步线程的执行。

(29)@Cacheable


作用:用于缓存方法的返回值。

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

用例:

@Service
public class UserService {

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

这个类使用@Service注解标注,表示这个类是一个服务。在方法级别上,使用@Cacheable注解标注方法,表示这个方法返回的结果可以被缓存起来。

在这个例子中,getUser方法使用@Cacheable注解标注,表示这个方法的返回结果可以被缓存起来。查询用户信息的操作在第一次执行时会被执行,返回结果会被缓存到名为"userCache"的缓存中。下次执行getUser方法时,如果缓存中已经存在这个结果,就直接从缓存中获取结果,不需要再次执行查询操作。

@Cacheable注解用于缓存方法的返回结果,可以提高应用程序的执行效率。它是一种简单但非常有效的解决方案,可以使得开发者更加灵活地使用缓存来优化应用程序的性能。

@Cacheable注解是Spring框架中比较常用的注解之一,可以让开发者更加轻松地使用缓存来提高应用程序的性能。需要注意的是,使用缓存需要考虑缓存的生命周期和缓存的一致性,必要时需要使用缓存失效机制和缓存更新机制来维护缓存的一致性。

(30)@CacheEvict


作用:用于清除缓存。

@CacheEvict是Spring框架中的一个注解,用于清空缓存中的数据。

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

用例:

@Service
public class UserService {

    @Cacheable("userCache")
    public User getUser(Long id) {
        // 查询用户信息
        User user = userRepository.getUser(id);
        return user;
    }
    
    @CacheEvict("userCache")
    public void clearCache() {
        // 清空缓存
    }
}

这个类使用@Service注解标注,表示这个类是一个服务。在方法级别上,使用@Cacheable注解标注getUser方法,表示这个方法的返回结果可以被缓存起来。同时,使用@CacheEvict注解标注clearCache方法,表示这个方法会清空名为"userCache"的缓存。

在这个例子中,getUser方法使用@Cacheable注解标注,表示这个方法的返回结果可以被缓存起来。查询用户信息的操作在第一次执行时会被执行,返回结果会被缓存到名为"userCache"的缓存中。下次执行getUser方法时,如果缓存中已经存在这个结果,就直接从缓存中获取结果,不需要再次执行查询操作。

当调用clearCache方法时,@CacheEvict注解会清空名为"userCache"的缓存,下次执行getUser方法时,就需要重新查询数据并缓存起来。

@CacheEvict注解用于清空缓存中的数据,可以使得开发者更加灵活地控制缓存的生命周期和缓存的一致性。它是一种简单但非常有效的解决方案,可以使得开发者更加轻松地使用缓存来提高应用程序的性能。

@CacheEvict注解是Spring框架中比较常用的注解之一,可以让开发者更加灵活地控制缓存的生命周期和缓存的一致性。需要注意的是,清空缓存需要谨慎操作,必要时需要考虑缓存的失效机制和缓存更新机制来维护缓存的一致性。

 

(31)@CachePut


作用:用于更新缓存中的数据。

@CachePut是Spring框架中的一个注解,用于更新或添加缓存中的数据。

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

用例:

@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注解标注,表示这个类是一个服务。在方法级别上,使用@Cacheable注解标注getUser方法,表示这个方法的返回结果可以被缓存起来。同时,使用@CachePut注解标注updateUser方法,表示这个方法会更新或添加名为"userCache"的缓存。

在这个例子中,getUser方法使用@Cacheable注解标注,表示这个方法的返回结果可以被缓存起来。查询用户信息的操作在第一次执行时会被执行,返回结果会被缓存到名为"userCache"的缓存中。下次执行getUser方法时,如果缓存中已经存在这个结果,就直接从缓存中获取结果,不需要再次执行查询操作。

当调用updateUser方法时,@CachePut注解会更新或添加名为"userCache"的缓存,下次执行getUser方法时,就可以从缓存中获取更新后的用户信息。

@CachePut注解用于更新或添加缓存中的数据,可以使得开发者更加灵活地控制缓存的生命周期和缓存的一致性。它是一种简单但非常有效的解决方案,可以使得开发者更加轻松地使用缓存来提高应用程序的性能。

@CachePut注解是Spring框架中比较常用的注解之一,可以让开发者更加灵活地控制缓存的生命周期和缓存的一致性。需要注意的是,更新或添加缓存需要谨慎操作,必要时需要考虑缓存的失效机制和缓存更新机制来维护缓存的一致性。

(32)@Transactional

作用:用于指定事务的范围。既可以在方法上使用,也可以直接在类上使用。

 

在某些业务场景下,如果一个请求中,需要同时写入多张表的数据或者执行多条sql,为了保证操作的原子性(要么同时成功,要么同时失败),避免数据不一致的情况,我们一般都会用到事务;Spring框架下,我们经常会使用@Transactional注解来管理事务;

本篇介绍Spring的事务注解@Transactional相关的知识,包括事务简介、事务隔离级别、Spring声明式事务实现原理、事务的传播行为、@Transactional的用法及注意事项等,属于Spring的常用注解之一,

原子性(Atomicity): 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

一致性(Consistency): 事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。

隔离性(Isolation): 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

持久性(Durability): 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

1.3.2 隔离规则

事务的隔离级别是指若干个并发的事务之间的隔离程度,它定义了一个事务可能受其他并发事务影响的程度;多个事务并发运行,可能会导致以下的问题:

脏读(Dirty reads)—— 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。

不可重复读(Nonrepeatable read)—— 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

幻读(Phantom read)—— 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

为了避免事务并发状态下脏读、不可重复读、幻读的产生,Spring中定义了五种隔离规则:

1. @Transactional(isolation = Isolation.DEFAULT)
   "使用后端数据库默认的隔离级别 对于MYSQL来说就是可重复读"
 
1. @Transactional(isolation = Isolation.READ_UNCOMMITTED)
   "是最低的隔离级别,允许读取尚未提交的数据变更(会出现脏读,不可重复读),基本不使用"
 
2. @Transactional(isolation = Isolation.READ_COMMITTED)
   "允许读取并发事务已经提交的数据(会出现不可重复读和幻读)"
 
3. @Transactional(isolation = Isolation.REPEATABLE_READ)
   "事物开启后,对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改(会出现幻读)"
 
4. @Transactional(isolation = Isolation.SERIALIZABLE)
   "最高的隔离级别,完全服从ACID的隔离级别,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的"
说明:

事务隔离级别为ISOLATION_READ_UNCOMMITTED时,写数据只会锁住相应的行;
事务隔离级别为可ISOLATION_REPEATABLE_READ时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读;
事务隔离级别为ISOLATION_SERIALIZABLE时,读写数据都会锁住整张表;
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也就越大;


回滚规则

事务回滚规则定义了哪些异常会导致事务回滚而哪些不会;默认情况下,只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚,而在遇到检查型异常时不会回滚; 但是可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚,并且相反,还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常;

事务超时

为了使应用程序很好地运行,事务不能运行太长的时间,因为事务可能涉及对后端数据库的锁定,会占用数据库资源;事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束;

是否只读

如果在一个事务中所有关于数据库的操作都是只读的,也就是说,这些操作只读取数据库中的数据,而并不更新数据, 这个时候我们应该给该事务设置只读属性,这样可以帮助数据库引擎优化事务,从而提升数据库读写效率;

失效场景

介绍几种常见的事务实效的场景,这里引用一张图来说明;

事例:

    @Transactional(rollbackFor = Exception.class)
    public void aFunction() {
        //todo: 数据库操作A(增,删,该)
        aInnerFunction(); // 调用内部没有添加@Transactional注解的函数
    }
 
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void aInnerFunction() {
        //todo: 操作数据B(做了增,删,改 操作)
        throw new RuntimeException("函数执行有异常!");
    }

 

 

(33)@EnableTransactionManagement

作用:用于启用事务管理功能。

(34)@EnableAspectJAutoProxy


作用:用于启用AOP功能。

@EnableAspectJAutoProxy是Spring框架中的一个注解,用于启用自动代理功能,以便使用AOP(面向切面编程)进行编程。

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

用例:

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {

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

这个类使用@Configuration注解标注,表示这个类是一个配置类。同时,在类级别上使用@EnableAspectJAutoProxy注解标注,表示这个配置类需要启用自动代理功能。

在这个例子中,我们定义了一个MyAspect类来实现某些功能的切面编程。为了让Spring框架能够自动为我们生成代理对象,我们需要将MyAspect类加入到Spring容器中,并且使用@Bean注解标注。另外,我们还定义了一个UserService类来实现某些业务功能。

@EnableAspectJAutoProxy注解用于启用自动代理功能,可以使得开发者更加方便地使用AOP来实现某些功能。它是一种简单但非常有效的解决方案,可以让开发者更加轻松地使用切面编程来提高应用程序的性能和可维护性。

@EnableAspectJAutoProxy注解是Spring框架中比较常用的注解之一,可以让开发者更加方便地使用AOP来实现某些功能。需要注意的是,AOP的使用需要谨慎操作,必要时需要考虑AOP的切面逻辑、切入点和通知类型等来维护应用程序的性能和可维护性。

(35)@Aspect


作用:用于定义切面。

@Aspect是Spring框架中的一个注解,用于标识一个类为切面类,从而可以在该类中定义切面逻辑以实现AOP(面向切面编程)。

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

用例:

@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注解标识,表示这个类是一个切面类。同时,我们还使用@Component注解标识这个类,以便Spring框架能够自动将它加入到Spring容器中。

在这个例子中,我们定义了一个MyAspect类来实现某些功能的切面编程。在这个类中,我们定义了两个通知类型,即@Before和@After,分别表示在目标方法执行前和执行后执行某些操作。这些通知类型的执行条件是通过切入点表达式来定义的。

@Aspect注解用于标识一个类为切面类,可以使得开发者更加方便地使用AOP来实现某些功能。它是一种简单但非常有效的解决方案,可以让开发者更加轻松地使用切面编程来提高应用程序的性能和可维护性。

@Aspect注解是Spring框架中比较常用的注解之一,用于标识一个类为切面类。需要注意的是,AOP的使用需要谨慎操作,必要时需要考虑切入点、通知类型和切面顺序等来维护应用程序的性能和可维护性。

(36)@Pointcut


作用:用于定义切点。

@Pointcut是Spring框架中的一个注解,用于定义一个切入点,从而可以在该切入点上定义通知类型以实现AOP(面向切面编程)。

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

用例:

@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注解标识,表示这个类是一个切面类。同时,我们还使用@Component注解标识这个类,以便Spring框架能够自动将它加入到Spring容器中。

在这个例子中,我们定义了一个MyAspect类来实现某些功能的切面编程。在这个类中,我们使用@Pointcut注解定义了一个切入点,即userServicePointcut()方法。在这个切入点上,我们定义了两个通知类型,即@Before和@After,分别表示在目标方法执行前和执行后执行某些操作。

@Pointcut注解用于定义一个切入点,可以使得开发者更加方便地使用AOP来实现某些功能。它是一种简单但非常有效的解决方案,可以让开发者更加轻松地使用切面编程来提高应用程序的性能和可维护性。

@Pointcut注解是Spring框架中比较常用的注解之一,用于定义一个切入点。需要注意的是,AOP的使用需要谨慎操作,必要时需要考虑切入点、通知类型和切面顺序等来维护应用程序的性能和可维护性。

(37)@Before


作用:用于在方法执行前执行通知。

@Before是Spring框架中的一个注解,用于定义在目标方法执行前执行的通知类型,以实现AOP(面向切面编程)。

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

用例:

@Aspect
@Component
public class MyAspect {

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



(38)@After


作用:用于在方法执行后执行通知。

@After是Spring框架中的一个注解,用于定义在目标方法执行后执行的通知类型,以实现AOP(面向切面编程)。

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

用例:

@Aspect
@Component
public class MyAspect {

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


(39)@Around


作用:用于在方法执行前后执行通知。

@Around是Spring框架中的一个注解,用于定义在目标方法执行前后执行的通知类型,以实现AOP(面向切面编程)。

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

用例:

@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;
    }
}



(40)@AfterReturning


作用:用于在方法返回结果后执行通知。

@AfterReturning是Spring框架中的一个注解,用于定义在目标方法返回结果后执行的通知类型,以实现AOP(面向切面编程)。

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

用例:

@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);
    }
}



(41)@AfterThrowing


作用:用于在方法抛出异常后执行通知。

@AfterThrowing是Spring框架中的一个注解,用于定义在目标方法抛出异常后执行的通知类型,以实现AOP(面向切面编程)。

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

用例:

@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);
    }
}



(42)@Order


作用:用于指定切面的执行顺序。

@Order是Spring框架中的一个注解,用于定义切面的执行顺序。

在Spring框架中,如果有多个切面类需要对同一个方法进行切面处理,那么这些切面类的执行顺序可能会影响到最终的结果。为了控制这些切面类的执行顺序,我们可以使用@Order注解来定义它们的执行顺序。

@Order注解可以应用在切面类上,用于指定切面执行的顺序。它的参数为一个整数,数值越小表示优先级越高,数值相同时按照类名的自然顺序进行排序。

用例:

@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.");
    }
}

(43)@Slf4j


作用:用于简化日志记录。

@Slf4j是Lombok框架中的一个注解,用于在Java类中自动生成日志记录器。

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

使用@Slf4j注解非常简单,只需要在Java类中添加这个注解即可。在使用时,我们可以直接使用log变量来记录日志,而不需要再引入其他的日志框架

用例:

@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.");
    }
}

在这个例子中,我们定义了一个MyService类,并使用@Slf4j注解来自动生成日志记录器。然后,在doSomething()方法中,我们直接使用log变量来记录日志,而不需要再引入其他的日志框架。

需要注意的是,使用@Slf4j注解需要在编译器中安装Lombok插件,否则可能会出现编译错误。另外,虽然@Slf4j注解非常方便,但在实际应用中,我们还需要根据实际情况选择合适的日志框架,并编写相应的日志记录代码。

总之,@Slf4j是Lombok框架中的一个注解,可以在Java类中自动生成日志记录器,从而简化日志记录的过程。它是一种极为方便的解决方案,可以提高应用程序的可维护性和可读性。



(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等方法。

用例:

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
}



(45)@NoArgsConstructor


作用:用于生成无参构造函数。

@NoArgsConstructor是Lombok框架中的一个注解,用于自动生成一个无参构造方法。

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

使用@NoArgsConstructor注解非常简单,只需要在Java类上添加这个注解即可。在使用时,我们可以直接创建对象的实例,而不需要手动编写无参构造方法。

用例:

@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
}

在这个例子中,我们定义了一个User类,并使用@NoArgsConstructor注解来自动生成一个无参构造方法。然后,在其他的Java类中,我们可以直接创建User对象的实例,而不需要手动编写无参构造方法。

需要注意的是,使用@NoArgsConstructor注解需要在编译器中安装Lombok插件,否则可能会出现编译错误。另外,虽然@NoArgsConstructor注解非常方便,但在实际应用中,我们还需要根据实际情况选择合适的构造方法,并编写相应的代码。

总之,@NoArgsConstructor是Lombok框架中的一个注解,用于自动生成一个无参构造方法,从而简化Java开发的过程。它是一种极为方便的解决方案,可以提高应用程序的可维护性和可读性。



(46)@AllArgsConstructor


作用:用于生成全参构造函数。

@AllArgsConstructor是Lombok框架中的一个注解,用于自动生成一个全参构造方法。

在Java开发中,我们经常需要编写一些POJO类来表示数据结构。这些类通常包含一些成员变量,并且需要编写相应的构造方法。在某些情况下,我们可能需要编写一个全参构造方法,用于初始化所有成员变量。这个构造方法通常包含所有成员变量作为参数。为了简化这个过程,Lombok框架提供了一个@AllArgsConstructor注解,可以自动生成一个全参构造方法。

使用@AllArgsConstructor注解非常简单,只需要在Java类上添加这个注解即可。在使用时,我们可以直接创建对象的实例,并传入相应的参数,而不需要手动编写全参构造方法。

用例:

@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
}

在这个例子中,我们定义了一个User类,并使用@AllArgsConstructor注解来自动生成一个全参构造方法。然后,在其他的Java类中,我们可以直接创建User对象的实例,并传入相应的参数,而不需要手动编写全参构造方法。

需要注意的是,使用@AllArgsConstructor注解需要在编译器中安装Lombok插件,否则可能会出现编译错误。另外,虽然@AllArgsConstructor注解非常方便,但在实际应用中,我们还需要根据实际情况选择合适的构造方法,并编写相应的代码。

总之,@AllArgsConstructor是Lombok框架中的一个注解,用于自动生成一个全参构造方法,从而简化Java开发的过程。它是一种极为方便的解决方案,可以提高应用程序的可维护性和可读性。


(47)@Builder


作用:用于生成Builder模式的构造函数。

@Builder是Lombok框架中的一个注解,用于自动生成一个Builder模式的构造器。

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

使用@Builder注解非常简单,只需要在Java类上添加这个注解即可。在使用时,我们可以使用链式调用的方式设置对象的属性,并最终创建一个不可变的对象。

用例:

@Builder
public class User {
    private Long id;
    private String name;
    private Integer age;
}
在这个例子中,我们定义了一个User类,并使用@Builder注解来自动生成一个Builder模式的构造器。然后,在其他的Java类中,我们可以使用链式调用的方式设置User对象的属性,并最终创建一个不可变的对象。

需要注意的是,使用@Builder注解需要在编译器中安装Lombok插件,否则可能会出现编译错误。另外,虽然@Builder注解非常方便,但在实际应用中,我们还需要根据实际情况选择合适的构造方法,并编写相应的代码。

总之,@Builder是Lombok框架中的一个注解,用于自动生成一个Builder模式的构造器,从而简化Java开发的过程。它是一种极为方便的解决方案,可以提高应用程序的可维护性和可读性。

(48)@EqualsAndHashCode


作用:用于生成hashCode和equals方法。

@EqualsAndHashCode是Lombok框架中的一个注解,用于自动生成equals()和hashCode()方法。

在Java开发中,我们经常需要比较两个对象是否相等,并且需要根据对象的属性生成一个hashCode值。为了简化这个过程,Lombok框架提供了一个@EqualsAndHashCode注解,可以自动生成equals()和hashCode()方法。

使用@EqualsAndHashCode注解非常简单,只需要在Java类上添加这个注解即可。在使用时,Lombok会根据类的属性自动生成equals()和hashCode()方法。如果两个对象的所有属性都相等,那么它们的equals()方法返回true,并且它们的hashCode()方法返回相同的值。

用例:

@EqualsAndHashCode
public class User {
    private Long id;
    private String name;
    private Integer age;
}



(49)@ToString


作用:用于生成toString方法。

@ToString是Lombok框架中的一个注解,用于自动生成toString()方法。

在Java开发中,我们经常需要将对象转换为字符串,以便于输出或日志记录。为了简化这个过程,Lombok框架提供了一个@ToString注解,可以自动生成toString()方法。

使用@ToString注解非常简单,只需要在Java类上添加这个注解即可。在使用时,Lombok会根据类的属性自动生成toString()方法,这个方法将输出类的名称和所有属性的名称和值。如果需要排除某些属性,可以使用exclude属性来指定排除的属性。

用例:

@ToString(exclude = "password")
public class User {
    private Long id;
    private String name;
    private String password;
}


(50)@Getter


作用:用于生成getters方法。

@Getter是Lombok框架中的一个注解,用于自动生成getter方法。

在Java开发中,我们经常需要为类的属性编写getter和setter方法。为了简化这个过程,Lombok框架提供了一个@Getter注解,可以自动生成getter方法。

使用@Getter注解非常简单,只需要在Java类上添加这个注解即可。在使用时,Lombok会根据类的属性自动生成对应的getter方法。如果需要生成setter方法,可以使用@Setter注解。

用例:

@Getter
public class User {
    private Long id;
    private String name;
    private Integer age;
}

标签:缓存,SpringBoot,快快,Spring,class,注解,方法,public
From: https://blog.csdn.net/2301_80419036/article/details/142579198

相关文章

  • plt注解相关介绍及应用
    目录plt.annotate()plt.text()实战plt.annotate()plt.annotate()是Matplotlib中用于在图形中添加注释的函数。与plt.text()类似,plt.annotate()可以在指定的位置添加文本注释,并可以指定箭头和文本的样式、颜色、字体大小等属性。plt.annotate()函数的常用参数......
  • springboot+vue+elementui大文件分片上传
    工具类方法:/***大文件分片上传*@paramfileName文件名*@paramfile文件*@paramfileKey文件key*@paramshardIndex当前分片下标*@paramshardTotal分片总量*/publicstaticvoidbigUpload(StringfileNam......
  • mybatis基于注解、XML配置文件的形式来定义SQL语句
    一、mybatis基于注解定义SQL语句员工类@Data@NoArgsConstructor//无参@AllArgsConstructor//有参publicclassEmp{privateIntegerid;//idprivateStringusername;//用户名privateStringpassword;//密码privateStringname;//姓名privat......
  • SpringBoot+Docker +Nginx 部署前后端项目Hf
    部署SpringBoot项目(通关版)一、概述使用java-jar命令直接部署项目的JAR包和使用Docker制作镜像进行部署是两种常见的部署方式。以下是对这两种方式的概述和简要的优劣势分析:1.1、使用java-jar命令直接部署项目的JAR包概述:通过java-jar直接部署项目的JAR包是最简单直......
  • 海滨体育馆管理系统:SpringBoot实现技巧与案例
    2系统关键技术2.1JAVA技术Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译,任何地方都可以运行。除此之外,它还拥有简单的语法和实用的类库,......
  • 2024最新高分源码基于SpringBoot+Vue+uniapp的办事大厅政务预约系统(源码+lw+部署文档
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 2024最新高分源码基于SpringBoot+Vue+uniapp的网络办公系统(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 2024最新高分源码基于SpringBoot+Vue+uniapp的贫困认定管理平台(源码+lw+部署文档+讲
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 【Mybatis】Mybatis拦截器+注解,实现敏感数据自动加解密
    一:背景     今天,公司新要求对数据库的敏感数据进行加密,对手机号、身份证号、姓名等一些敏感数据进行加密处理,要求:    1.通过程序实现数据加密解密(快速便捷,尽量减少对原先代码的修改)    2.可以通过sql查询对数据进行解密(通过密钥直接对数据库......
  • 海滨体育馆管理系统:SpringBoot技术的应用
    1引言1.1课题背景当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计......