package com.xueyou.demo;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Configuration
@Profile(value = "dev")
@Component
public class Chinese implements MoveFactor {
@Override
public void speak() {
System.out.println("我是中国人");
}
}
此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name@JsonProperty("name")
import com.fasterxml.jackson.annotation.JsonProperty;
public class Student {
@JsonProperty("name")
private String trueName;
public String getTrueName() {
return trueName;
}
public void setTrueName(String trueName) {
this.trueName = trueName;
}
}
源码样例:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MthCache {
String key();
}
功能:指明了修饰的这个注解的使用范围,即被描述的注解可以用在哪里。
ElementType的取值包含以下几种:
TYPE:类,接口或者枚举
FIELD:域,包含枚举常量
METHOD:方法
PARAMETER:参数
CONSTRUCTOR:构造方法
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解类型
PACKAGE:包
功能:指明修饰的注解的生存周期,即会保留到哪个阶段。
RetentionPolicy的取值包含以下三种:
SOURCE:源码级别保留,编译后即丢弃。
CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。
功能:指明修饰的注解,可以被例如javadoc此类的工具文档化,只负责标记,没有成员取值。
功能:允许子类继承父类中的注解。
注意!:
@interface意思是声明一个注解,方法名对应参数名,返回值类型对应参数类型。
mapper.xml文件里面的sql语句带有下划线的,在实体类定义的时候如果不想保持一致去掉下滑线,就需要这个注解里面填写带有下滑线的
@JSONField可以配置到字段和方法上,那不同的配置有什么不同呢?下面我们就来看看具体配置到不同的方法上。
我们在创建实体类的时候,都要求属性必须创建get和set方法,否则fastjson将不会进行识别,下面我们看看把@JSONField配置到具体的get和set方法上.
1.序列化(JavaBean --> json)时配置到对应字段的get()方法上
2.反序列化(json --> JavaBean)时配置到对应字段的set()方法上
不能为null,但可以为empty
不能为null,而且长度必须大于0
只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
用于验证注解是否符合要求,直接加在变量user之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping
public User create (@Valid @RequestBody User user) {
System.out.println(user.getId());
System.out.println(user.getUsername());
System.out.println(user.getPassword());
user.setId("1");
return user;
}
}
@NotBlank 注解所指的 password 字段,表示验证密码不能为空,如果为空的话,上面 Controller 中的 create 方法会将message 中的"密码不能为空"返回。
public class User {
private String id;
@NotBlank(message = "密码不能为空")
private String password;
}
申明让springboot自动给程序进行必要的配置,这个配置等同于@Configuration,@EnableAuto
Configuration,@ComponentScan三个配置。
用于定义控制器类,在Spring项目中由控制器负责将用户发来请求URL的地址转发到对应的服务接口(service层),一般这个注解在类中,通常需要配合@RequestMapping使用。
在SpringBoot中上面两个注解会合起来使用@RestController
表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据式使用,用于构建RESTful的API接口,在使用了@RequestMapping后,返回值通常解析跳转为路径,加上@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中,比如异步获取json数据,加上@ResponseBody后,会直接返回json数据。
该注解会和@RequestMapping一起使用
提供路由信息,负责URL到@Controller中的具体的URL地址
开启SpringBoot自动装配(auto-configuration)根据你添加的jar依赖自动配置你的Spring应用,具体实现细节看SpringBoot-Day01博客的自动装配原理。
表示将该类标识为自动发现扫描组件的类,作用就是如果扫描到有@Component、@Respository、@Controller、@Service等这些注解的类,就会把他们注册为Bean装配到IOC容器中,该注解可以自动收集所有的Spring组件,包括@Configuration注解的类,我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入,如果没有配置也就是默认的情况下,springboot会扫描启动类所在包下以及子包下的使用了@Service、@Respository、@Controller、@Component等注解类把它扫描好注册为Bean装配到IOC容器中。
自动装配IOC容器中的bean
自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。
当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者
没有括号内内容的话,默认byName。与@Autowired干类似的事。
一般用于修饰service层的组件
一般用于修饰dao层(model层)的组件
使用@Repository注解可以确保DAO或者respositories提供异常转译,这个注解修饰的DAO或者respositories类会被@ComponentScan发现并配置,同时也不需要为他们提供xml配置项。
泛指组件当组件不好进行归类的时候,我们可以使用这个注解进行标注,这个注解其实是Spring框架的注解。
相当于传统的xml配置文件,用的场景可以在springboot配置类上面加这个注解,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类,可以使用@ImportResource注解加载xml配置文件。
用来导入其他配置类
用来加载xml配置文件
用@Bean标注方法等价于xml中配置的bean,用法:放在方法的上面,而不是类,意思就是产生一个bean,并交给spring管理。
在application.properties、application.yml文件中配置(起步依赖的原理)的属性的值,可以用来在程序中加载。
等价于默认的@Autowired。只是没有required属性。
@SpringBootApplication | @ComponentScan | @Configuration |
@EnableAutoConfiguration | @Component | @CommandLineRunner |
@RestController | @Controller | @ResponseBody |
@Autowired | @PathVariable(获取参数) | |
@RepositoryRestResourcepublic | 配合spring-boot-starter-data-rest使用 | |
@JsonBackReference | 解决嵌套外链问题 |
@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中
@ComponentScan:让spring Boot扫描到Configuration类并把它加入到程序上下文。
@Configuration :等同于spring的XML配置文件;使用Java代码可以检查类型安全。
@EnableAutoConfiguration :自动配置。
@ComponentScan :组件扫描,可自动发现和装配一些Bean。
@Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。
@RestController:注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。
@Autowired:自动导入。
@PathVariable:获取参数。
@JsonBackReference:解决嵌套外链问题。
@RepositoryRestResourcepublic:配合spring-boot-starter-data-rest使用。
表示这是一个实体类,一般用于jpa开发,这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table注解可以省略。
用在确定父类的entity上,父类的属性可以继承。
一般用在父类的repository,有这个注解,spring不会去实例化该repository
注释在字段上面,如果字段名和表明相同,则可以省略。
表示该属性为主键
表示主键生成策略是SEQUENCE(可以为AUTO、IDENTITY、NATIVE等,AUTO表示可在多个数据库间切换),指定SEQUENCE的名字是repair_seq
name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。
表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式
作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。
对应hibernate配置文件中的一对一,一对多,多对一。
@RequestMapping("/path")表示该控制器处理所有的"/path"的URL请求,@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上,用在类上,表示类中的所有响应请求的方法都以该Path作为父路径,用在方法上,表示只有这个方法用这个Path作为映射的路径。
该注解里面的六个属性:
params:指定request中必须包含某些参数值是啥,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求
method:指定请求的method类型,GET、POST、PUT、DELETE等
value:指定请求的实际地址,指定的地址可以是URI Template 模式
consumes:指定处理请求的提交内容类型(Content-Type),如application/json、text/html
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
用在方法里面的参数前面。
eg:public Object getStudent ( @RequestParam("id") Integer id)
路径变量
eg:参数与@RequestMapping("/usr/local/{大括号里的名字}")一样要相同
包含@Component可以被扫描到。统一处理异常
用在方法上面,表示遇到这个异常就执行以下的方法
1:@MappedSuperclass注解使用在父类上,是用来标识父类的
2:@MappedSuperclass标识的类表示其不能映射到数据库表,是因为其不是一个完整的实体类,但是它所拥有的属性能够映射在其子类对应的数据库表中
3:@MappedSuperclass标识的类不能在有@Entity或@Table注解
1:当实体的属性与其映射的数据库表的列明不同命时,需要使用@Column标注说明,该注解属性通常配置在实体的属性声明成员变量之前,还可以与@Id注解一起使用
2:@Column标注的常用属性是name,用于设置映射数据库表的列名,此外该标注还包含其他多个属性(这里先不审究)
注解在springboo的实体类上,提供类所属性的getting、setting方法,此外还提供了equals、canEqual、hashCode、toString方法
注解在成员变量上面,分别为他们提供Setting、Getting方法
注解在类上为类提供一个属性名为log的log4j日志对象,和@Log4j注解类似
注解在类上,为类提供一个空参构造的方法
注解在类上,为类提供一个有参构造的方法
默认情况下,会使用所有非瞬间和非静态字段来生成equals和hashcode方法,也可以指定具体使用那些属性。
生产toString方法,默认情况下,会输出类名。所有属性。属性会按照顺序输出,以逗号分隔
无参构造器、部分参数构造器、全参构造器,当我们需要重载多个构造器的时候,只能自己手写了。
注解在属性上面,如果注解了就必须不能为Null
注解在属性上面,如果注解了,就是设置为final类型,可查看源码的注释知道
当你在执行各种持久化方法的时候,实体的状态会随之改变,状态的改变会引发不同的生命周期事件。这些事件可以使用不同的注释符来指示发生时的回调函数。
@javax.persistence.PostLoad:加载后
@javax.persistence.PrePersist:持久化前
@javax.persistence.PostPersist:持久化后
@javax.persistence.PreUpdate:更新前
@javax.persistence.PostUpdate:更新后
@javax.persistence.PreRemove:删除前
@javax.persistence.PostRemove:删除后
1)数据库查询
@PostLoad事件在下列情况下触发:
执行EntityManager.find()或getreference()方法载入一个实体后。
执行JPQL查询后。
EntityManager.refresh()方法被调用后。
2)数据库插入
@PrePersist和@PostPersist事件在实体对象插入到数据库的过程中发生:
@PrePersist事件在调用persist()方法后立刻发生,此时的数据还没有真正插入进数据库。
@PostPersist事件在数据已经插入进数据库后发生。
3)数据库更新
@PreUpdate和@PostUpdate事件的触发由更新实体引起:
@PreUpdate事件在实体的状态同步到数据库之前触发,此时的数据还没有真正更新到数据库。
@PostUpdate事件在实体的状态同步到数据库之后触发,同步在事务提交时发生。
4)数据库删除
@PreRemove和@PostRemove事件的触发由删除实体引起:
@PreRemove事件在实体从数据库删除之前触发,即在调用remove()方法删除时发生,此时的数据还没有真正从数据库中删除。
@PostRemove事件在实体从数据库中删除后触发。