springboot中的常用注解(一)

17 阅读7分钟

启动类相关

@SpringBootApplication

@SpringBootApplication 标注在类上,说明这是一个SpringBoot应用,且该类是启动类,是程序的入口

 @SpringBootApplication
 public class DiyApplication {
 ​
     public static void main(String[] args) {
         //Spring 应用启动起来  且返回值为 ioc容器
         SpringApplication.run(DiyApplication.class, args);
       //  ConfigurableApplicationContext ioc = SpringApplication.run(DiyApplication.class, args);
     }
 }

@ComponentScan

@ComponentScan用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。会被自动装配的注解包括@Controller、@Service、@Component、@Repository等等。

常用属性如下

  • basePackages:指定扫描路径,如果为空则以@ComponentScan注解的类所在的包为基本的扫描路径。只设置该属性时,属性名可以省略
  • basePackageClasses:指定具体扫描的类
  • includeFilters:指定满足Filter条件的类
  • excludeFilters:指定排除Filter条件的类
 @ComponentScan(basePackages = "com.sugar.pro.config")
 //省略写法
 @ComponentScan("com.sugar.pro.config")

配置相关

@Configuration

@Configuration注解用于定义配置类,该类中通常包含着用于配置Spring Bean的方法,相当于以前spring中的配置文件如:beans.xml文件

配合@Bean

@Configuration@Bean注解常一起使用用于创建自定义的Spring Bean(给容器注册组件),等同于@Component、@Controller、@Service等,同时这种方式默认也是单实例

 @Configuration
 public class AppConfig {
 ​
     @Bean 
     public MyService myService() {
         return new MyServiceImpl();
     }
   //以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
 ​
 }

接下来,我们可以使用@Autowired注解来注入这个Bean的实例对象到其他类中。例如:

 @Service
 public class MyController {
   
     @Autowired
     private MyService myService;
     // 使用myService进行其他操作
 ​
 }

扩展

@Configuration注解有个属性proxyBeanMethods,它的作用是在配置类中定义的Bean之间是否使用代理模式。

  • proxyBeanMethods = false时,Spring容器在初始化配置类中的Bean时,不会使用代理模式来创建Bean之间的依赖关系。这意味着如果一个Bean需要依赖另一个Bean,那么它将被直接注入,而不是通过代理对象进行注入。这种情况下,如果一个Bean修改了它所依赖的另一个Bean的属性或方法,那么这种修改会影响到所依赖的Bean的实例本身,可能导致不可预测的行为。
  • proxyBeanMethods = true时,Spring容器会使用代理模式来创建Bean之间的依赖关系。这意味着如果一个Bean需要依赖另一个Bean,那么它将被注入一个代理对象,而不是直接注入依赖的Bean本身。这种情况下,修改所依赖的Bean的属性或方法不会影响所依赖的Bean的实例本身,从而避免了不可预测的行为。

在调用上的体现则是:

  • Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
  • Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】

总结:@Configuration(proxyBeanMethods = false)表示在配置类中定义的Bean之间不使用代理模式,而是直接注入依赖的Bean本身。可能导致循环依赖。 组件依赖必须使用Full模式默认。其他默认是否Lite模式

该特性是springboot2, @since 5.2版本之后才有的特性,proxyBeanMethods的默认值为true

@ConfigurationProperties

它是Spring Boot中用于绑定配置文件属性到Java对象的注解。

使用@ConfigurationProperties注解可以将配置文件中的属性类中的字段进行绑定,从而将配置属性值注入到类中,这样就可以方便地通过修改配置文件来动态地修改程序的行为。

使用@ConfigurationProperties注解时,需要在注解中指定要绑定的配置属性前缀,例如:

 @Component
 @ConfigurationProperties(prefix = "hello")
 public class HelloProperties {
 ​
         private String name;
       // ...getter and setter methods
 ​
 }

配置文件:

 hello.name = cogar
     // 使用 注入的方式
     @Autowired
     HelloProperties helloProperties;
 ​
     @RequestMapping("/hello")
     public HelloProperties helloDemo(){
         System.out.println("logggggg");
         return helloProperties;
     }

注意:直接通过关键字new创建的对象是无法将绑定的值是注入到对应属性上。或者说只有在Spring容器中的组件才能使用注入等强大的功能

注意

使用@ConfigurationProperties注解时,需要确保将其标记的类在Spring上下文中进行扫描。否则会报错。

通常可以使用以下两种方式

  • @EnableConfigurationProperties注解+ @ConfigurationProperties
  • @Component注解+@ConfigurationProperties
 @EnableConfigurationProperties(HelloProperties.class) 
 public class MyConfigAuto{
   
 }
 // 在对应的配置类上 使用该注解并设置对应class
 @ConfigurationProperties(prefix = "hello")
 public class MyConfig{
   
 }
 // 方式一
 @Component
 @ConfigurationProperties(prefix = "hello")
 public class MyConfig{
   
 }
 // 方式二

组件类

@Autowired

作用:它可以对类成员变量方法构造函数进行标注,完成自动装配的工作。在开发中用得最多的是在类成员变量上

关于类成员变量的自动装配,@Resource同样可以完成。

 @Service
 public class TestA {
     @Autowired
     private Person person;
 }
  • @Resource默认通过byName的方式实现,如果找不到对应的名称,则通过byType实现。
  • 而@Autowired则是通过byType的方式实现,并且必须要求这个对象存在。

@Component...等

它作用是将一个普通的Java类转化为Spring的组件。通过@Component注解标记的类会被Spring框架扫描并创建实例,以便在需要的地方进行依赖注入。

类似的注解还有一些,不过它们对于所属业务层有明确定义。

  • @Repository:用于标注持久层组件,也就是用于进行数据库相关操作的层
  • @Service:用于标注服务层组件,主要涉及一些复杂的逻辑。
  • @Controller:用于标注控制层组件,对应SpringMVC控制层,
  • @RestController:也是用于标注控制层,它是@Controller和@ResponseBody的组合。

数据解析相关

@RequestMapping

是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

类似的注解还有

  • @GetMapping = @RequestMapping(method = RequestMethod.GET)
  • @PostMapping = @RequestMapping(method = RequestMethod.POST)
  • @DeleteMapping = @RequestMapping(method = HttpMethod.DELETE)
  • @PutMapping = @RequestMapping(method = HttpMethod.PUT)

@RequestParam

用于获取请求中的参数值。认情况下,@RequestParam会根据参数的名称来匹配请求中的参数名。例如,如果方法参数为String name,则会尝试从请求中找到名为 "name" 的参数值。

@RequestParam:它用于从请求的URL参数中获取数据。但是它不能用于获取文件上传参数、大量参数或跨域请求中的参数。

  • @RequestParam只能处理字符串类型的参数
  • 该注解有三个属性:

    • value:value用来指定要传入值的名称
    • required:required用来指示参数是否必须含有;
    • defaultValue:指定参数的默认值。如果这个参数不存在,或者如果它的值为空,或者如果它的值不是有效的类型,将会使用这个默认值。
 @GetMapping("/users/{id}")
 public User getUser(@PathVariable("id") Long id, 
                     @RequestParam(value = "status", required = false, defaultValue = "active") String status) {
     return userService.getUserById(id, status);
 }

注意:如果前端传来的参数为Content-type: application/json,则使用@RequestParam无法获取,会报如下错误。 required string parameter ‘XXX‘is not present

@PathVariable

它用于从请求的URL路径中获取数据。它用于处理URL路径中的参数。

 @GetMapping("/user/{id}")
 public String getUser(@PathVariable("id") Integer id, @RequestParam("name") String name) {
     // 处理获取用户信息请求
     return "user " + id + " name " + name;
 }

在这个例子中,@PathVariable("id")用于从URL路径/users/{id}中的{id}部分获取值。

@RequestBody

它用于从请求的请求体中获取数据。

 @PostMapping("/users")
 public User createUser(@RequestBody User user) {
     return userService.createUser(user);
 }

上述例子中@RequestBody用于从请求体中获取User对象。

@ResponseBody

作用:返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。通常用来返回JSON数据或者是XML数据