Spring注解文章链接
- https://blog.csdn.net/qq_29347295/article/details/78709511
- 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
包扫描:
<context:component-scan base-package="包名">
源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
String value() default "";
}
@Autowride注解
概述
@Autowired表示被修饰的类需要注入对象,spring会扫描所有被@Autowired标注的类,然后根据 类型 在ioc容器中找到匹配的类注入。
Controller注解
概述
@controller 控制器(注入服务)用于标注控制层组件
- 用于标注控制层,相当于struts中的action层
源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
Repository注解
概述
@repository(实现dao访问,被@Repository注解的POJO类表示DAO层实现
- 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.
源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
Service注解
概述
@Service本身是基于@Component注解的扩展,被@Service注解的POJO类表示Service层实现,从而见到该注解就想到Service层实现。
- 用于标注服务层,主要用来进行业务的逻辑处理
源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
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:
package cn.tedu.pojo;
public class Student {
private int id;
private String name;
private int age;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
public Student() {
}
public Student(int id, String name, int age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
}
普通方式创建pojo,需要提供get与set方法来进行私有成员变量的访问,在查看成员变量的值时需要提供重写的toString()方法,会导致大量代码冗余。
测试:
package cn.tedu.test;
import cn.tedu.pojo.Student;
import org.junit.jupiter.api.Test;
public class TestStudent {
@Test
public void get() {
Student student = new Student(123, "马钊", -120, "女");
System.out.println(student);
Student s = new Student();
s.setName("雨来");
s.setId(11);
s.setAge(123);
s.setSex("未知");
System.out.println(s.getId());
System.out.println(s.getName());
System.out.println(s.getAge());
System.out.println(s.getSex());
}
}
普通方式在使用pojo时,给pojo中的成员变量赋值时需要调用每个属性的set方法,再查看属性值时需要调用get方法。
使用Lombok依赖
创建pojo:
package cn.tedu.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data//get、set、toString、hashcode、equals
@NoArgsConstructor//无参构造
@AllArgsConstructor//全参构造
@Accessors(chain = true)//链式编程,默认关闭,需要使用chain开启
public class Teacher {
private Integer id;
private String name;
private Integer age;
private String sex;
}
使用Lombok提供的注解不需要创建每个属性的get与set方法,也不需要重写toString()方法,而是使用Data注解便可以获取这些成员变量的值。
测试:
package cn.tedu.test;
import cn.tedu.pojo.Teacher;
import org.junit.jupiter.api.Test;
public class TestTeacher {
@Test
public void test() {
Teacher teacher = new Teacher();//无参构造
Teacher t = new Teacher(100, "雨来", 122, "未知");//全参构造
System.out.println(t);//toString
//lombok提供的链式编程
teacher.setId(100).setName("马钊").setAge(-120).setSex("女");
System.out.println(teacher);
}
}
使用Lombok注解时,可以直接使用Lombok提供的链式编程来给私有属性赋值,不再去使用对象挨个调用set方法,而是直接一次性赋值完毕,极大的减少了代码冗余。
@RequestParam
注解
概述
接收的参数是来自requestHeader中,即请求头。通常用于GET请求
若变量名称和参数名称都相同,此时可以不用
@RequestParam
,但若变量名和参数名不同。或者不使用Spring Boot,可能需要进行特殊的编译时配置,否则参数名称实际上不会在编译后的字节码中。此时可以通过name属性配置
作用:将请求路径中的参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
语法:
@RequestParam(value="参数名" , name="" ,required="true/false", defaultValue=" ")
value
:为请求参数名,必须设置。name
:为value别名,不可与value
同时使用,作用等价于value。required
:表示请求的url中是否包含该参数,默认为true,若请求路径中不包含该参数,则会报错。defaultValue
:默认参数值,若设置了该值,required="true"
将会失效,自动改为false,表示若请求路径中没有传递该参数就是用设置的默认值。
源码
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
@PathVariable
注解
概述
使用RESTFul方式进行url参数传递,需要使用
@PathVariable
注解来获取请求路径中的的参数值。
作用:接收请求路径中占位符的值,可以将url中{xxx}占位符参数中的值绑定到控制层方法的形参中。
语法:
@PathVariable(value="参数名", name = "", required="")
@GetMapping("user/{ids}")
public List<Demo4User> getUserByIds(@PathVariable Integer[] ids) {
return demo4UserService.getUserByIds(ids);
}
value
:为请求路径中的参数名,若方法中形参与路径中参数名不同需要设置value。name
:与value作用相同