Spring注解文章链接

  1. https://blog.csdn.net/qq_29347295/article/details/78709511
  2. https://blog.csdn.net/xyh820/article/details/7303330/

注解分类

1、@controller: controller控制器层(注入服务) 2、@service : service服务层(注入dao) 3、@repository : dao持久层(实现dao访问) 4、@component: 标注一个类为Spring容器的Bean,(把普通pojo实例化到spring容器中,相当于配置文件中的

使用@Component,@Service,@Controller,@Repository注解的类,表示把这些类纳入到spring容器中进行管理,同时也是表明把该类标记为Spring容器中的一个Bean。

Compent注解

概述

带有Compent注解的类看为组件,当使用基于注解的配置和类路径扫描的时候,这些类就会被实例化。即当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

@component相当于配置文件中的 <bean id="" class=""/>)

作用:把普通pojo实例化到spring容器中,可以与AutoWirde搭配使用,不需要去application.xml文件中进行bean配置。
例如带有Compent注解的类在使用包扫描后将会被实例化,而不再需要我们手动去new出对象。

当我们在Spring中使用DI注入依赖时就需要用到该注解。
示例:https://www.yuque.com/yiquanchaoren-dvwhg/ey85gh/snqh46#677dad4d

包扫描:

  1. <context:component-scan base-package="包名">

源码

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Indexed
  5. public @interface Component {
  6. String value() default "";
  7. }

@Autowride注解

概述

@Autowired表示被修饰的类需要注入对象,spring会扫描所有被@Autowired标注的类,然后根据 类型 在ioc容器中找到匹配的类注入。

Controller注解

概述

@controller 控制器(注入服务)用于标注控制层组件

  • 用于标注控制层,相当于struts中的action层

源码

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Component
  5. public @interface Controller {
  6. @AliasFor(
  7. annotation = Component.class
  8. )
  9. String value() default "";
  10. }

Repository注解

概述

@repository(实现dao访问,被@Repository注解的POJO类表示DAO层实现

  • 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.

源码

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Component
  5. public @interface Repository {
  6. @AliasFor(
  7. annotation = Component.class
  8. )
  9. String value() default "";
  10. }

Service注解

概述

@Service本身是基于@Component注解的扩展,被@Service注解的POJO类表示Service层实现,从而见到该注解就想到Service层实现。

  • 用于标注服务层,主要用来进行业务的逻辑处理

源码

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Component
  5. public @interface Service {
  6. @AliasFor(
  7. annotation = Component.class
  8. )
  9. String value() default "";
  10. }

Lombok依赖

常用注解

1. @Getter与@Setter注解

作用于类中,生成所有成员变量的get与set方法,作用与成员变量上,可以设定访问权限以及是否懒加载等作用。 生成的方法默认为public,若要修改方法修饰符可以设置AccessLevel的值,示例:**_@Getter(access = AccessLevel.PROTECTED)_**

2. @ToString注解

作用于类,覆盖默认的toString()方法,默认按顺序打印类名称及每个字段,可以通过of属性限定显示某些字段,使用exclude属性排除某些字段,示例:**_@ToString(exclude = "id")_** / **_@ToString(exclude = {"id","name"})_**。 若有继承的父类,可以设置callSupper让其调用父类的toString()方法。示例: **_@ToString(callSuper = true)_**

3. @EqualsAndHashCode注解

作用于类,覆盖默认的equals()与hashCode()方法。使用所有非静态和非transient字段。可以使用exclude参数来排除字段,或者使用parameter参数命名这些字段来准确指定使用的字段。

4. 构造函数注解

  • @NoArgsConstructor,作用于类,生成无参构造方法,当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null。对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。
  • @RequiredArgsConstructor,作用于类,生成含参构造
  • @AllArgsConstructor,作用于类,生成全参构造

5. @AllArgsConstructor注解

生成全参构造容器

6. @Data注解

作用于类,是Lombok中的注解的集合,包括@ToString,@EqualsAndHashCode ,@Getter ,@Setter ,@RequiredArgsConstructor。

7. @Accessors注解

@Accessors 主要用于控制生成的getter和setter
主要参数介绍

  • fluent boolean值,默认为false。此字段主要为控制生成的getter和setter方法前面是否带get/set
  • chain boolean值,默认false。如果设置为true,setter返回的是此对象,方便链式调用方法
  • prefix 设置前缀 例如:@Accessors(prefix = “abc”) private String abcAge 当生成get/set方法时,会把此前缀去掉

8. @Synchronized

给方法加上同步锁

示例:

普通方式:

创建pojo:

  1. package cn.tedu.pojo;
  2. public class Student {
  3. private int id;
  4. private String name;
  5. private int age;
  6. private String sex;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. public void setAge(int age) {
  23. this.age = age;
  24. }
  25. public String getSex() {
  26. return sex;
  27. }
  28. public void setSex(String sex) {
  29. this.sex = sex;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Student{" +
  34. "id=" + id +
  35. ", name='" + name + '\'' +
  36. ", age=" + age +
  37. ", sex='" + sex + '\'' +
  38. '}';
  39. }
  40. public Student() {
  41. }
  42. public Student(int id, String name, int age, String sex) {
  43. this.id = id;
  44. this.name = name;
  45. this.age = age;
  46. this.sex = sex;
  47. }
  48. }

普通方式创建pojo,需要提供get与set方法来进行私有成员变量的访问,在查看成员变量的值时需要提供重写的toString()方法,会导致大量代码冗余。
测试:

  1. package cn.tedu.test;
  2. import cn.tedu.pojo.Student;
  3. import org.junit.jupiter.api.Test;
  4. public class TestStudent {
  5. @Test
  6. public void get() {
  7. Student student = new Student(123, "马钊", -120, "女");
  8. System.out.println(student);
  9. Student s = new Student();
  10. s.setName("雨来");
  11. s.setId(11);
  12. s.setAge(123);
  13. s.setSex("未知");
  14. System.out.println(s.getId());
  15. System.out.println(s.getName());
  16. System.out.println(s.getAge());
  17. System.out.println(s.getSex());
  18. }
  19. }

普通方式在使用pojo时,给pojo中的成员变量赋值时需要调用每个属性的set方法,再查看属性值时需要调用get方法。

使用Lombok依赖

创建pojo:

  1. package cn.tedu.pojo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import lombok.experimental.Accessors;
  6. @Data//get、set、toString、hashcode、equals
  7. @NoArgsConstructor//无参构造
  8. @AllArgsConstructor//全参构造
  9. @Accessors(chain = true)//链式编程,默认关闭,需要使用chain开启
  10. public class Teacher {
  11. private Integer id;
  12. private String name;
  13. private Integer age;
  14. private String sex;
  15. }

使用Lombok提供的注解不需要创建每个属性的get与set方法,也不需要重写toString()方法,而是使用Data注解便可以获取这些成员变量的值。

测试:

  1. package cn.tedu.test;
  2. import cn.tedu.pojo.Teacher;
  3. import org.junit.jupiter.api.Test;
  4. public class TestTeacher {
  5. @Test
  6. public void test() {
  7. Teacher teacher = new Teacher();//无参构造
  8. Teacher t = new Teacher(100, "雨来", 122, "未知");//全参构造
  9. System.out.println(t);//toString
  10. //lombok提供的链式编程
  11. teacher.setId(100).setName("马钊").setAge(-120).setSex("女");
  12. System.out.println(teacher);
  13. }
  14. }

使用Lombok注解时,可以直接使用Lombok提供的链式编程来给私有属性赋值,不再去使用对象挨个调用set方法,而是直接一次性赋值完毕,极大的减少了代码冗余。

@RequestParam注解

概述

接收的参数是来自requestHeader中,即请求头通常用于GET请求

若变量名称和参数名称都相同,此时可以不用@RequestParam,但若变量名和参数名不同。或者不使用Spring Boot,可能需要进行特殊的编译时配置,否则参数名称实际上不会在编译后的字节码中。此时可以通过name属性配置

作用:将请求路径中的参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)

语法:

  1. @RequestParam(value="参数名" , name="" ,required="true/false", defaultValue=" ")

value:为请求参数名,必须设置。
name:为value别名,不可与value同时使用,作用等价于value。
required:表示请求的url中是否包含该参数,默认为true,若请求路径中不包含该参数,则会报错。
defaultValue:默认参数值,若设置了该值,required="true"将会失效,自动改为false,表示若请求路径中没有传递该参数就是用设置的默认值。

源码

  1. @Target(ElementType.PARAMETER)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface RequestParam {
  5. @AliasFor("name")
  6. String value() default "";
  7. @AliasFor("value")
  8. String name() default "";
  9. boolean required() default true;
  10. String defaultValue() default ValueConstants.DEFAULT_NONE;
  11. }

@PathVariable注解

概述

使用RESTFul方式进行url参数传递,需要使用@PathVariable注解来获取请求路径中的的参数值。

作用:接收请求路径中占位符的值,可以将url中{xxx}占位符参数中的值绑定到控制层方法的形参中。

语法:

  1. @PathVariable(value="参数名", name = "", required="")
  2. @GetMapping("user/{ids}")
  3. public List<Demo4User> getUserByIds(@PathVariable Integer[] ids) {
  4. return demo4UserService.getUserByIds(ids);
  5. }

value:为请求路径中的参数名,若方法中形参与路径中参数名不同需要设置value。
name:与value作用相同