项目常用注解

一、@Slf4j

@Slf4j是用作日志输出的,一般会在项目每个类的开头加入该注解,如果不写下面这段代码,并且想用log

private final Logger logger = LoggerFactory.getLogger(当前类名.class);

就可以用@Slf4来代替;这样就省去这段很长的代码。 直接可以在代码中使用log.info()来打印日志

如果不写注解就要使用上面这行代码定义一个logger对象,然后使用logger.info()来打印日志,用了注解默认的对象log和未用注解自己定义的logger是一样的

二、@Api

使用在类上,表明是swagger资源,@API拥有两个属性:value、tags,源码如下

//If tags is not used,this value will be used to set the tag for the operations described by this resource. Otherwise, the value will be ignored.
 String value() default "";

 //Tags can be used for logical grouping of operations by resources or any other qualifier.
 String[] tags() default {""};

生成的api文档会根据tags分类,直白的说就是这个controller中的所有接口生成的接口文档都会在tags这个list下;tags如果有多个值,会生成多个list,每个list都显示所有接口

@Api(tags = "列表1")
@Api(tags = {"列表1","列表2"})
value的作用类似tags,但是不能有多个值
三、@Validated

@Validation是一套帮助我们继续对传输的参数进行数据校验的注解,通过配置Validation可以很轻松的完成对数据的约束

@Validated作用在类、方法和参数上

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {
    Class<?>[] value() default {};
}

错误的状态码

返回的响应码推荐使用400 bad request.

注意:

String a = "  ";
int length = a.length();
System.out.println(length);

运行结果:2

所有参数注解含义

@Valid:没有分组的功能。

@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上

@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制

@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上

两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能
原文链接:https://blog.csdn.net/qq_32352777/article/details/108424932

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Valid {
}
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {
    Class<?>[] value() default {};
}

四、@DateTimeFormat和@JsonFormat

@DateTimeFormat用在项目传参数时将指定字符串形式的日期形式转换为Date形式的日期

@JsonFormat用在项目中从数据库中查到的日期时间,防止返回后变成时间戳形式,所以此注解加载数据库表对应的实体类的日期属性上,同时为了使日期不会应时区发生改变,需要加timezone = "GMT+8"表示东八区,否则会按照国际标准时间进行转换,两者相差8小时

此注解也可以转换成不同的形式,可以深究

示例:

public class DateVo {
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date date;//参数传递
}

表示将pattern模式的string类型的日期形式传递位pattern模式的Date类型日期(没问题),必须传pattern类型的String类型,否则会报错

五、@Controller和@RestController

@Controller必须配合模版来使用,用来响应页面,在项目中减少使用

@RestController注解由@Controller 与@ResponseBody组成,以前需要使用这两个注解配合返回json,现在合在一起,在项目中直接使用@RestController注解

六、@RequestMapping

此注解用来配置url,配置在类上时,这个注解会应用到类中的所有方法上,配置在方法上时对类级别上的@RequestMapping的补充,所以需要先配置类然后配置方法,但是方法在项目中最好使用Get,Post,Update,Delete对象的请求方式(在方法上用@RequestMapping会被骂的吆)

七、@RequestBody

主要作用是用来接受前端传来的json中的数据(请求体中的数据)

原理:将此注解所作用参数类对象(就是方法中参数前面,不过这个参数一般位类对象)接受http请求中的请求体中的参数,会根据json中的key来匹配参数实体类中的属性,若key匹配成功,会调用类中的set方法将对应的value值赋给对应的属性,补充:json中空串"",String接受为"",其他类型接受为null,value没有时,不需要再json中写key,如果写了key,必须写value,没有可以写null或者""

八、@RequestParam

用来将请求参数绑定到控制器的方法参数上,语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
 
value:参数名(url中的参数名必须与value一致)
 
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。required为false,不包含该参数不会报错,有就显示出来
 
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值

九、@Autowired

作用:完成自动装配,可以作用于类成员变量,方法及构造函数上(最常用是类常量),会自动再容器中查找对应的bean,并装配给该对象的属性

@Autowired由Spring提供,只按照byType注入

@Autowired只有一个属性required,默认值为true,为true时,找不到就抛异常,为false时,找不到就赋值为null

@Autowired按类型查找,如果该类型的bean不唯一,则抛出异常;可通过组合注解解决@Autowired()@Qualifier("baseDao")

十、@Resource

与@Autowired一样,可以实现自动装配

有两个常用属性name、type,所以分4种情况

  • 指定name和type:通过name找到唯一的bean,找不到抛出异常;如果type和字段类型不一致,也会抛出异常
  • 指定name:通过name找到唯一的bean,找不到抛出异常
  • 指定type:通过tpye找到唯一的bean,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException
  • 都不指定:通过字段名作为key去查找,找到则赋值;找不到则再通过字段类型去查找,如果不唯一,则抛出异常NoUniqueBeanDefinitionException
  • 详情可以点击一下看看大佬详细的解决方法,里面有多个bean出现的情况以及注解的详细使用

Springboot笔记<4>@Autowired和@Resource的区别 - aixueforever - 博客园 (cnblogs.com)

十一、@Value

1、@Value(“xiaoxiong”)

直接将字符串"xiaoxiong"赋值给属性,如果属性类型不是String,或无法进行类型转换,则报错

2、@Value("$ {xiaoxiong}")

将会把{}中的字符当做key从Properties文件或者配置文件中找出对应的Value赋值给属性

3、@Value(”#{xiaoxiong}")

会将#{}中的字符串当做Spring表达式进行解析,Spring会把xiaoxiong当做beanName,并从Spring容器中找到对应的Bean,如果找到则进行属性注入,没有找到则报错

4、@ConfigurationProperties(prefix = "spring")

该注解有一个prefix属性,通过指定的前缀,绑定配置文件中的配置,该注解可以放在类上,也可以放在方法上,当将该注解作用于方法上时,如果想要有效的绑定配置,那么该方法需要有@Bean注解且所属Class需要有@Configuration注解。

创建类Animal:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Animal {
    private String name;
    private Integer id;
}

在配置文件中配置:

animal:
  name: hhhh
  id: 1222

在配置类中使用注解获取配置文件中的元素: 

@Configuration
public class AnimalConfig {
    @ConfigurationProperties(prefix = "animal")
    @Bean
    public Animal config1(){
        return new Animal();
    }
}

在测试类中测试:

   @Autowired
    Animal animal;
    @Test
    public void Test1(){
        System.out.println(animal);
    }

}

结果:

不要在实体类上面使用@Component,不然依赖注入的对象属性为null;所以切记@Component合@Bean不可以同时出现,这两个注解都是将类交给spring容器管理;

@ConfigurationProperties 的 POJO类的命名比较严格,因为它必须和prefix的后缀名要一致, 不然值会绑定不上, 特殊的后缀名是“driver-class-name”这种带横杠的情况,在POJO里面的命名规则是 下划线转驼峰 就可以绑定成功,所以就是 “driverClassName”

注意到一个这个注解特别重要的知识点:只有这个逐渐是2容器中的组件,才能使用容器提供的@ConfigurationProperties功能,这就是为什么类上面要加注解@Component和配置类中使用这个注解必须加上@Bean

spring.datasource.url=jdbc:mysql://127.0.0.1:8888/test?useUnicode=false&autoReconnect=true&characterEncoding=utf-8
spring.datasource.username=root spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
@Data
@Component
@ConfigurationProperties(prefix = "spring")
public class DatasourcePro {
    Map<String,String> datasource = new HashMap<>();
}
测试结果:
 @Autowired
    DatasourcePro datasourcePro;
    @Test
    public void Test2() {
        System.out.println(datasourcePro);
    }
DatasourcePro(datasource={type=com.alibaba.druid.pool.DruidDataSource, driver-class-name=com.mysql.jdbc.Driver, url=jdbc:mysql://127.0.0.1:8888/test?useUnicode=false&autoReconnect=true&characterEncoding=utf-8, username=root spring.datasource.password=root})

spring:
  url: jdbc
  username: root
@Value("${spring.datasource.url}")
    String url;
    @Value("${spring.url}")
    String url1;
    @Test
    public void Test3(){
        System.out.println(url);
        System.out.println(url1);
    }

运行结果如下:

jdbc:mysql://127.0.0.1:8888/test?useUnicode=false&autoReconnect=true&characterEncoding=utf-8
jdbc

@ PropertySource:加载指定的配置文件,(多与注解@ConfigurationPropertes,但是经常还是不会用到)

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "spring")
public class DatasourcePro {
    Map<String,String> datasource = new HashMap<>();
}

@SpringBootApplication

@SpringBootApplication注解是SpringBoot最核心,最基础的注解。表示一个配置类,该类申明一个或多个@Bean方法,并且还出发自动配置合组件扫描。这是一个便捷注释,等效于同时声明:@Configuration,@EnableAutoConfiguration和@ComponentScan三个注解:

@Configuration该注解表示一个类声明了一个或多个@Bean方法,并且可以由Spring容器进行处理,已在运行时为这些bean生成bean定义和服务请求。

@EnableAutoConfiguration启用Spring Application Context的自动配置,尝试猜测和配置您可能需要的bean。通常根据您的类路径和定义的bean来应用自动配置类。例如:如果您在类路径上具有tomca-embedded.jar,则可能需要TomcatServletWebServerDactory(除非已定义自己的ServletWebServerDactory)。

@ComponentScan配置组件稻苗指令以与@Configuration一起使用,提供与 Spring XML <contextcomponent-scan> 元素并行的支持。可以指定 basePackageClasses() 或 basePackages()(或其别名 value())来定义要扫描的特定程序包。如果未定义特定的程序包,则将从声明此批注的类的程序包中进行扫描。

持续更新中。。。


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值