参考:https://www.cnblogs.com/wl20200316/p/12579982.html
控制层:
@Controller:用于定义控制器类,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping。
@RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。
@Autowired:自动导入依赖的bean
@GetMapping是Spring4.3提供的新注解,它是一个组合注解,等价于@RequestMapping(method = RequestMethod.Get ),用于简化开发,注意:@RequestMapping如果没有指定请求方式,将接收Get、Post、Head、Options等所有的请求方式.同理还有@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping等
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML
@Controller
@RequestMapping("/test")
public class TestController{
@Autowired
private TestServiceImpl serviceImpl;
@GetMapping("/getAll")
@ResponseBody
public RestResponse getAllList(){
return RestResponse.ok(serviceImpl.getAllList(),"success");
}
}
@Data注解为类提供读写功能,从而不用写get、set方法;会为类提供 equals()、hashCode()、toString() 方法。。
@Mapper
一般用在接口上
添加了@Mapper注解之后这个接口在编译时会生成相应的实现类
@Mapper
public interface UserDAO {
@Select("select * from user where name = #{name}")
User find(String name);
@Select("select * from user where name = #{name} and pwd = #{pwd}")
/**
* 对于多个参数来说,每个参数之前都要加上@Param注解,
* 要不然会找不到对应的参数进而报错
*/
User login(@Param("name")String name, @Param("pwd")String pwd);
}
@MapperScan
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
@Configuration使用
用@Configuration注释类表明其主要目的是作为bean定义的源
@Configuration类允许通过调用同一类中的其他@Bean方法来定义bean之间的依赖关系
@Configuration 保证了配置类的内部方法之间依赖调用时都从容器中获取bean.
/**
* 说明:此处@Configuration 注解的作用,
* 1、使配置类变成了full类型的配置类,spring在加载Appconfig的时候,Appconfig由普通类型转变为cglib代理类型 ,
* 2、在 @Bean method中使用,是单例的,不会创建对个对象
*/
@Bean Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
SpringIOC 容器管理一个或者多个bean,这些bean都需要在@Configuration注解下进行创建,在一个方法上使用@Bean注解就表明这个方法需要交给Spring进行管理。
@FeignClient注解被@Target(ElementType.TYPE)修饰,表示FeignClient注解的作用目标在接口上.
其他注解:
@Data注解为类提供读写功能,从而不用写get、set方法;会为类提供 equals()、hashCode()、toString() 方法。。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
String staticConstructor() default "";
}
@Target源码:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Target {
ElementType[] value();
}
public enum ElementType {
TYPE, //拼起的 ElementType.TYPE : 应用在类、接⼝(包括注解类型)或枚举上
FIELD,// :应用在字段上(包括枚举常量)
METHOD,// :应用在⽅法上
PARAMETER,// :应用在参数上
CONSTRUCTOR,// :应用在构造⽅法上
LOCAL_VARIABLE,// :应用在局部变量上
ANNOTATION_TYPE,// :应用在注解上
PACKAGE,// :应用在包上(极少使⽤)
TYPE_PARAMETER,// :1.8新增 应用于类型变量
TYPE_USE,// :1.8新增 应用于任何使用类型的语句中
private ElementType() {}
}
@Retention :⽤于描述注解的⽣命周期,表示需要在什么级别(在源代码中(SOURCE)、类文件中(CLASS)或者运行时(RUNTIME)。)保存该注解,即保留的时间⻓短。
@Retention 源码:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Retention {
RetentionPolicy value();
}
RetentionPolicy 是一个枚举类型,它定义了被 @Retention 修饰的注解所支持的保留级别:
public enum RetentionPolicy {
SOURCE,//此注解类型的信息只会记录在源文件中,编译时将被编译器丢弃,也就是说不会被编译到字节码中
CLASS,//编译器将注解记录在类文件中,但不会加载到JVM中。如果一个注解声明没指定范围,则系统默认值就是Class
RUNTIME;//注解信息会保留在源文件、类文件中,在执行的时也加载到Java的JVM中,因此可以反射性的读取。
private RetentionPolicy() {
}
}
@DefaultValue("John")
private String name;
@DefaultValue("25")
private int age;
我们使用了一个DefaultValue
注解来设置实体类字段的默认值。然后,在实体类的构造方法中,我们使用反射获取所有字段,并找到带有DefaultValue
注解的字段。然后,使用反射设置注解中指定的值给字段。
下面是DefaultValue
注解的定义:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface DefaultValue {
String value() default "";
}
使用该注解时,只需要在实体类的字段上添加@DefaultValue("默认值")
即可。
使用示例:
public static void main(String[] args) {
Entity entity = new Entity();
System.out.println(entity.getName()); // 输出:John
System.out.println(entity.getAge()); // 输出:25
}