SpringBoot常用注解整理(详细)

简介: SpringBoot常用注解整理(详细)

前言

大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫


适合人群

  • 学完Java基础
  • 想通过Java快速构建web应用程序
  • 想学习或了解SpringBoot

大佬可以绕过 ~


背景

本节给大家讲讲 Java的SpringBoot框架, 之前我们学习的都是java的基础知识和底层提供的一些能力,我们日常工作都是在写接口。在我们在产品开发中,一般我们都会选择比较稳定的框架来帮我们加速开发,不会自己去造轮子,而在java众多框架中,spring框架表现的非常好,大部分公司都会首选它作为开发框架,而至今,大部分企业都是以springboot来构建项目了~


情景回顾

距离上期更新至今已经有一段时间了,由于最近较忙,没有时间去更新,后边有空就会及时更新。上期我们实现了一个简单的hello world请求,为了使项目更加规范,我对目录做了一些修改,后续的实战教程中会一直沿用这个项目,代码也会不断更新。最近github可能会被墙,所以我把源码放到了国内gitee上


往期内容


项目源码(持续更新⭐️)


配置讲解

Banner配置

我们先从控制台说起,我们在运行的时候,控制台会进行一些初始化的操作,然后你还会看到Springboot的Logo, 我想换掉这个logo怎么做呢?


我们只需要在resources目录下新建一个banner.txt就可以了,它会自定替换这个文本里的文案,给个全网都在使用的文案:

_ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
           佛祖保佑       永无BUG
博客地址: https://www.qiucheng.top
复制代码


然后我们重新Run一下, 发现启动的时候文案就被替换了,其实它是由一个属性控制的,我们点开 SpringApplication会发现

private Banner banner;
复制代码


我们也可以关闭它, 默认源码是显示的

private Banner.Mode bannerMode = Banner.Mode.CONSOLE;
复制代码


我们在启动类上加上就可以关闭了

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        // 关闭 banner
        app.setBannerMode(Banner.Mode.OFF);
        app.run(args);
    }
}
复制代码


Server 配置

全局配置文件默认都是在application.yml里,前期我们就先从简单的配置入手,后边用到再讲

server:
  port: 8080 # 设置应用端口,默认是8080
  tomcat:
    max-threads: 800 # 设置最大线程数
    uri-encoding: UTF-8
  servlet:
    # 这个是添加请求前缀
    context-path: /api
复制代码


我们改完之后重启一下,发现原来的请求/hello找不到了,变成了 /api/hello,关于前缀的问题,其实还是挺重要的。如果我们细化到版本,我们可以在指定控制器类上加入@RequestMapping("/v1), 比如现在想要请求 /api/v1/hello

@RestController
@RequestMapping("/v1")
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "Hello World!";
    }
}
复制代码


自定义配置

如果我想在application.yml里写入自定义配置怎么办?

app:
  name: ${spring.name}
  version: "1.0"  
复制代码


在配置文件中可以使用 ${}继承属性值,配置好了,怎么在代码中获取它们呢?使用 @Value("${xxx.xxx}")

@RestController
@RequestMapping("/v1")
public class HelloController {
    @Value("${app.name}")
    private String name;
    @Value("${app.version}")
    private String version;
    @RequestMapping("/hello")
    public String hello(){
        return "Hello World!" + name + version;
    }
}
复制代码


现在这么使用可以,如果我这个配置属性相当多怎么办,难不成一个个@Value吗?显然不行,所以也提供了另一种全局配置,首先我们要修改一下我们的pom.xml添加如下, 不然会报错

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
    </dependency>
复制代码


添加一个Config

@ConfigurationProperties(prefix="app") # 设置前缀
public class AppConfig {
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getVersion() {
        return version;
    }
    public void setVersion(String version) {
        this.version = version;
    }
    private String name;
    private String version;
}
复制代码


修改启动类:

@EnableConfigurationProperties({AppConfig.class})
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        // 关闭 banner
        app.setBannerMode(Banner.Mode.OFF);
        app.run(args);
    }
}
复制代码


获取它, 使用 @Autowired 注入Bean, 这里也建议大家在创建对象的时候不要 new了,尽量给Spring容器来管理

@RestController
@RequestMapping("/v1")
public class HelloController {
    @Value("${app.name}")
    private String name;
    @Value("${app.version}")
    private String version;
    @Autowired
    private AppConfig appConfig;
    @RequestMapping("/hello")
    public String hello(){
        return "Hello World!" + name + version;
    }
    @RequestMapping("/hello1")
    public String hello1(){
        return "Hello World!" + appConfig.getName() + appConfig.getVersion();
    }
}
复制代码


关于 @Component & @Configuration & @Service

其实这三者都有共通性,从字面意思讲各尽其职,有更好的语义化,我们通常编写配置类会使用 @Configuration, 编写业务类会使用,比如封装第三方工具类等。

@Service, 编写容器类使用 @Component, 它们都可以使用 @Autowired自动注入Bean, 下边给大家简单演示一下


@Component

@Component
public class App {
    @Value("${app.name}")
    private String name;
    @Value("${app.version}")
    private String version;
    public String getName() {
        return name;
    }
    public String getVersion() {
        return version;
    }
}
复制代码


@Configuration

@Component
public class App {
    @Value("${app.name}")
    private String name;
    @Value("${app.version}")
    private String version;
    public String getName() {
        return name;
    }
    public String getVersion() {
        return version;
    }
}
复制代码


@Service

这个用法稍微跟上边不大一样,通常作用到实现类上,我们规范一点,先定义一个接口

public interface HelloService {
    void hello();
}
复制代码


实现类:

@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public void hello() {
        System.out.println("hello service");
    }
}
复制代码


使用:

@RestController
@RequestMapping("/v1")
public class HelloController {
    @Value("${app.name}")
    private String name;
    @Value("${app.version}")
    private String version;
    @Autowired
    private AppConfig appConfig;
    @Autowired
    private HelloService HelloService;
    @RequestMapping("/hello")
    public String hello(){
        return "Hello World!" + name + version;
    }
    @RequestMapping("/hello1")
    public String hello1(){
        return "Hello World!" + appConfig.getName() + appConfig.getVersion();
    }
    @RequestMapping("/hello2")
    public String hello2(){
        HelloService.hello();
        return "Hello World!";
    }
}
复制代码

以上三者通常作用于类上,那有没有作用在方法上的呢?


@Bean

@Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring 容器时,只能通过 @Bean 来实现。这里以线程池为例

@Configuration
public class ThreadPoolConfig {
    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(4);
        executor.setMaxPoolSize(16);
        executor.setQueueCapacity(80);
        executor.setKeepAliveSeconds(120);
        executor.setThreadNamePrefix("thread-pool-");
        return executor;
    }
}
复制代码

我们可以看出非常的灵活, 可以实现自定义的东西


@Resource

除了@Autowire, 还有@Resource也可以用来装配bean,都可以用于字段或setter方法

  • @Autowire 默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许 null 值,可以设置它的 required 属性为 false
  • @Resource 默认按名称装配,当找不到与名称匹配的 bean 时才按照类型进行装配。名称可以通过 name 属性指定,如果没有指定 name 属性,当注解写在字段上时,默认取字段名,当注解写在 setter 方法上时,默认取属性名进行装配。
  • @Autowire@Qualifier配合使用效果和@Resource一样

提到 @Qualifier,那就给大家讲一下


@Qualifier

我们都知道接口它的实现可以是多个类,这就造成了如果是多个实现类,在使用@Autowire的时候,我注入的是哪个实现呢?所以我们加上@Qualifier可以告诉Spring容器,我使用这个实现类,光说抽象,我们实现一下:


添加一个实现类:

@Service("Hello1ServiceImpl")
public class Hello1ServiceImpl implements HelloService {
    @Override
    public void hello() {
        System.out.println("Hello1ServiceImpl");
    }
}
复制代码


修改控制器:

@RestController
@RequestMapping("/v1")
public class HelloController {
    @Autowired
    @Qualifier("Hello1ServiceImpl")
    private HelloService HelloService;
    @RequestMapping("/hello2")
    public String hello2(){
        HelloService.hello();
        return "Hello World!";
    }
}
复制代码


这样就可以准确执行我们指定的实现类了


结束语

本期到这里就结束了,建议大家多动手实现一下,下期给大家讲解springboot的请求处理 ~ 如果觉得不错,点个赞呗 ~

相关文章
|
21天前
|
Java API 数据安全/隐私保护
掌握Spring Boot中的@Validated注解
【4月更文挑战第23天】在 Spring Boot 开发中,@Validated 注解是用于开启和利用 Spring 的验证框架的一种方式,特别是在处理控制层的输入验证时。本篇技术博客将详细介绍 @Validated 注解的概念和使用方法,并通过实际的应用示例来展示如何在项目中实现有效的数据验证
26 3
|
22天前
|
前端开发 Java 开发者
深入理解Spring Boot中的@Service注解
【4月更文挑战第22天】在 Spring Boot 应用开发中,@Service 注解扮演着特定的角色,主要用于标识服务层组件。本篇技术博客将全面探讨 @Service 注解的概念,并提供实际的应用示例,帮助开发者理解如何有效地使用这一注解来优化应用的服务层架构
78 1
|
22天前
|
Java 开发者 Spring
深入理解Spring Boot的@ComponentScan注解
【4月更文挑战第22天】在构建 Spring Boot 应用时,@ComponentScan 是一个不可或缺的工具,它使得组件发现变得自动化和高效。这篇博客将详细介绍 @ComponentScan 的基本概念、关键属性及其在实际开发中的应用。
30 4
|
23天前
|
Java 开发者 Spring
深入理解 Spring Boot 中的 @EnableAutoConfiguration 注解:概念与实践
【4月更文挑战第21天】在 Spring Boot 项目中,@EnableAutoConfiguration 注解是实现自动配置的核心,它可以根据项目的依赖和配置,自动地配置 Spring 应用程序中的 Bean
34 3
|
24天前
|
Java API 网络架构
深入理解 Spring Boot 中的 @RestController 注解:概念与实践
【4月更文挑战第20天】在现代Web开发中,创建RESTful服务已成为常态。Spring Boot通过提供@RestController注解,极大简化了REST API的开发过程。本篇博客旨在详细介绍@RestController的概念、优势以及在Spring Boot项目中的具体应用方法。
32 8
|
24天前
|
Java 开发者 Spring
Spring Framework 中的 @Autowired 注解:概念与使用方法
【4月更文挑战第20天】在Spring Framework中,@Autowired 注解是实现依赖注入(Dependency Injection, DI)的一种非常强大的工具。通过使用 @Autowired,开发者可以减少代码中的引用绑定,提高模块间的解耦能力
33 6
|
24天前
|
XML Java 数据库
探索 Spring Boot 中的 @Configuration 注解:核心概念与应用
【4月更文挑战第20天】在 Spring Boot 项目中,@Configuration 注解扮演了一个关键角色,它标识一个类作为配置源,这些配置用于定义和管理 Spring 应用程序中的 Bean
44 7
|
19天前
|
缓存 Java Sentinel
Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截
Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截
|
8天前
|
运维 Java 程序员
Spring5深入浅出篇:基于注解实现的AOP
# Spring5 AOP 深入理解:注解实现 本文介绍了基于注解的AOP编程步骤,包括原始对象、额外功能、切点和组装切面。步骤1-3旨在构建切面,与传统AOP相似。示例代码展示了如何使用`@Around`定义切面和执行逻辑。配置中,通过`@Aspect`和`@Around`注解定义切点,并在Spring配置中启用AOP自动代理。 进一步讨论了切点复用,避免重复代码以提高代码维护性。通过`@Pointcut`定义通用切点表达式,然后在多个通知中引用。此外,解释了AOP底层实现的两种动态代理方式:JDK动态代理和Cglib字节码增强,默认使用JDK,可通过配置切换到Cglib
|
4天前
|
JSON 前端开发 Java
【JAVA进阶篇教学】第七篇:Spring中常用注解
【JAVA进阶篇教学】第七篇:Spring中常用注解