Spring注解
在项目的学习应用中,搜集了资料,学习了Spring一些常用的注解,在此进行个人的总结留档,欢迎对内容进行礼貌评论留言。
Controller常用
@RequestMapping
用于映射Web请求,包括访问路径和参数。(类或方法上)
@RequestMapping("/zwz/common/captcha")
@RequestMapping(value = "/draw/{captchaId}", method = RequestMethod.GET)
@Component
表示一个带注释的类是一个“组件”,成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选对象。同时@Component还是一个元注解。
@Controller
组合注解(组合了@Component注解),应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类,然后将web请求映射到注解了@RequestMapping的方法上。
@Service
组合注解(组合了@Component注解),应用在service层(业务逻辑层)。
@Repository
组合注解(组合了@Component注解),应用在dao层(数据访问层)。
@ResponseBody
支持将返回值放在response内,而不是一个页面,通常用户返回json数据。(返回值旁或方法上)
@RestController
该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。
@Autowired
Spring提供的工具(由Spring的依赖注入工具(BeanPostProcessor、BeanFactoryPostProcessor)自动注入)。
@Configuration
声明当前类是一个配置类(相当于一个Spring配置的xml文件)(类上)。
@Bean
注解在方法上,声明当前方法的返回值为一个Bean。返回的Bean对应的类中可以定义init()方法和destroy()方法,然后在@Bean(initMethod=”init”,destroyMethod=”destroy”)定义,在构造之后执行init,在销毁之前执行destroy。(方法上)
@Scope
定义我们采用什么模式去创建Bean(方法上,得有@Bean) 其设置类型包括:
Singleton
(单例,一个Spring容器中只有一个bean实例,默认模式),Prototype
(每次调用新建一个bean),Request
(web项目中,给每个http request新建一个bean),Session
(web项目中,给每个http session新建一个bean),GlobalSession
(给每一个 global http session新建一个Bean实例)。
@Api
添加在 Controller 类上,标记它作为 Swagger 文档资源。tags 属性:用于控制 API 所属的标签列表。[] 数组,可以填写多个。
@Api(tags = "验证码接口")
@ApiOperation
添加在 Controller 方法上,标记它是一个 API 操作。
@PathVariable
用于接收路径参数,比如@RequestMapping(“/hello/{name}”)申明的路径,将注解放在参数中前,即可获取该值,通常作为Restful的接口实现方法。
@ModelAttribute
本来的作用是绑定键值对到 Model 里,在 @ControllerAdvice 中是让全局的@RequestMapping都能获得在此处设置的键值对。
@Transactional
里面的各个属性用来设置事务的传播行为、隔离规则、回滚规则、事务超时、是否只读。对类或者接口里面所有的public方法都有效.
@Slf4j
是一个日志标准,使用它可以完美的桥接到具体的日志框架,必要时可以简便的更换底层的日志框架,而不需要关心具体的日志框架的实现(slf4j-simple、logback等)。
@PersistenceContext
private EntityManager em;
注入的是实体管理器,执行持久化操作的,需要配置文件persistence.xml。
注入一堆保存实体类状态的数据结构,针对实体类的不同状态(四种,managedh或detached等)可以做出不同的反应(merge,persist等等),其实就是把数据从数据库里提出,然后在内存里处理的,再返回数据库的法则。
@Resource
是注入容器提供的资源对象,比如SessionContext MessageDrivenContext。或者你那个name指定的JNDI对象。
可以理解为资源->数据源->也就是数据连接,基本上就是告诉程序数据库在哪里。
@CacheConfig
主要用于配置该类中会用到的一些共用的缓存配置。在这里比如@CacheConfig(cacheNames = “users”):配置了该数据访问对象中返回的内容将存储于名为users的缓存对象中,我们也可以不使用该注解,直接通过@Cacheable自己配置缓存集的名字来定义。
@RequestParam
我们将 request 参数绑定到方法变量。 如果参数不可用(文本输入为空),则defaultValue
选项将提供默认值。 required
选项表明该参数是必需的。 该方法重新调整字符串。
public void view(@PathVariable String id,
@RequestParam(required = false) String filename,
@RequestParam(required = false, defaultValue = "false") Boolean preview,
HttpServletResponse httpServletResponse)
throws IOException {
...
}
@Valid
可以实现数据的验证。你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能。
@SystemLog
作用范围是在方法上,并且在运行时保留,该注解通常用在服务运行时,结合AOP切面编程实现方法的日志采集
@CacheEvict
用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。
entity常用
@Data
@Data 注解的主要作用是提高代码的简洁,使用这个注解可以省去代码中大量的get()、 set()、 toString()等方法;要使用 @Data 注解要先引入lombok.
@Entity
@Entity 说明这个 class 是实体类,并且使用默认的 orm 规则,即 class 名即数据库表中表名,class 字段名即表中的字段名。@Entity 注解指名这是一个实体 Bean。
@DynamicInsert
设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false。
@DynamicUpdate
设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false。
@Table(name = “t_department”)
@Table注解默认情况下只会完成表和实体之间的映射,声明才对象映射到数据库的数据表,通过它可以为实体指定表(table)
@Table注解是一个非必须的注解。@Table 注解指定了 Entity 所要映射带数据库表
@TableName(“t_department”)
是mybatis-plus中的注解,主要是实现实体类型和数据库中的表实现映射。
注意,不要将@TableName和@Table注解认为是一个,虽然功能相同,但是,@TableName是mybatis-plus中的注解,@Table是Hibernate中的注解。
@ApiModel
在实体类上边使用,标记类时swagger的解析类,提供有关swagger模型的其它信息,类将在操作中用作类型时自动内省。
@ApiModelProperty
使用在被 @ApiModel 注解的模型类的属性上,添加和操作模型属性的数据
@Transient
在给某个javabean上需要添加个属性,但是这个属性你又不希望给存到数据库中去,仅仅是做个临时变量,用一下。不修改已经存在数据库的数据的数据结构。
@TableField
是 MyBatis-Plus 框架中的一个注解,用于指定实体类属性与数据库表字段的映射关系。
@TableField(exist = false)
注解加载bean属性上,表示当前属性不是数据库的字段,但在项目中必须使用,这样在新增等使用bean的时候,mybatis-plus就会忽略这个,不会报错
@Column(precision = 10, scale = 2)
用来标识实体类中属性与数据表中字段的对应关系。precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
@JsonSerialize(using = ToStringSerializer.class)
@JsonSerialize:json序列化注解,用于字段或get方法上,作用于getter()方法,将java对象序列化为json数据。序列化操作。
@Pattern(regexp = “”, message = “账号长度不合法”)
@Pattern 参数验证------正则验证。
基本语法符号:
^ 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)
$ 表示匹配字符串的结束位置
* 表示匹配 零次到多次
+ 表示匹配 一次到多次 (至少有一次)
? 表示匹配零次或一次
. (圆点)表示匹配单个字符
| 表示为或者,两项中取一项(可用于两个正则之间)
( ) 小括号表示匹配括号中全部字符
[ ] 中括号表示匹配括号中一个字符 范围描述 如[0-9 a-z A-Z]
{ } 大括号用于限定匹配次数 如 {n}表示匹配n个字符 {n,}表示至少匹配n个字符 {n,m}表示至少n,最多m
\ 转义字符 如上基本符号匹配都需要转义字符 如 \*表示匹配*号
\w 表示英文字母和数字 \W 非字母和数字
\d 表示数字 \D 非数字
\s表示空字符串
当使用-时,需要放在最后一个位置,否则会被当成数字和字母之间区间的标识
vo
@Accessors(chain = true)
lombok
Accessor的中文含义是存取器,@Accessors用于配置getter和setter方法的生成结果。chain的中文含义是链式的,设置为true,则
@AllArgsConstructor
使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数
base
@Import注解
@Import注解用来帮助我们把一些需要定义为Bean的类导入到IOC容器里面。
@Import引入普通的类可以帮助我们把普通的类定义为Bean。@Import可以添加在@SpringBootApplication(启动类)、@Configuration(配置类)、@Component(组件类)对应的类上。
@Import(ImportBean.class) // 通过@Import注解把ImportBean添加到IOC容器里面去
@Import(cn.hutool.extra.spring.SpringUtil.class)
@Primary
其作用与功能,当有多个相同类型的bean时,使用@Primary来赋予bean更高的优先级。
@NoArgsConstructor
使用后添加一个无参构造函数
@EntityListeners(AuditingEntityListener.class)
该注解用于指定Entity或者superclass上的回调监听类。该注解可以用于Entity或者superclass上。
AuditingEntityListener.class这是一个JPA Entity Listener,用于捕获监听信息,当Entity发生持久化和更新操作时。
@JsonIgnoreProperties(value={“hibernateLazyInitializer”,“handler”,“fieldHandler”})
在类上声明的@JsonIgnoreProperties是忽略Hibernate的延迟加载的一些属性"hibernateLazyInitializer", “handler”, “fieldHandler”,这些属性在实体类里没有所以要忽略掉,否则会报错。 在getter方法上的@JsonIgnoreProperties是声明在序列化时忽略这个属性类的某个属性(例如 User类里的getItems()方法声明忽略掉 Item类里的seller属性,因为seller是引用User类,形成了循环
) 。这样无论从那个上返回Json都不会有闭环,解开了循环引用的问题。
@Id
用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。
@Id标注也可置于属性的getter方法之前。
@TableId
该注解用于将某个成员变量指定为数据表主键。
@LastModifiedBy@CreatedBy
自动保存操作人
@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT-8”)
实体类中有时间类型的属性,往往会在前端与后台的数据交换中出现日期格式转换的问题,当然也有简单粗暴的方法,把属性设置为 String 类型,那就可以避免了。
也可以使用 SpringBoot 默认的 Json 数据转换 Jackson 时,时间类型的属性上添加注解,这样需要在每一个实体类中需要转换的属性中进行设置,且要加上时区的设置,不然时间和数据库中显示的不一致。
@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
设置日期时间格式
@FunctionalInterface
主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口的定义时,编译器会报错。
Java 枚举(enum)
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
@Documented
表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。
@Target({ElementType.PARAMETER, ElementType.METHOD})
说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
@Retention(RetentionPolicy.RUNTIME)
它要求一个RetentionPolicy类型的取值
RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
@Aspect
作用是把当前类标识为一个切面供容器读取
@Pointcut(“@annotation(cn.zwz.basics.log.SystemLog)”)
@Pointcut放在方法头上,定义一个可被别的方法引用的切入点表达式。
@annotation:当执行的方法上拥有指定的注解时生效。
“@annotation(com.elim.spring.support.MyAnnotation)”//匹配所有的方法上拥有MyAnnotation注解的方法外部调用
@Before(“controllerAspect()”) @AfterReturning(“controllerAspect()”)
Spring使用的AOP注解分为三个层次
-
@Aspect放在类头上,把这个类作为一个切面。
-
@Pointcut放在方法头上,定义一个可被别的方法引用的切入点表达式。
-
5种通知。
@Before,前置通知,放在方法头上。
@After,后置【finally】通知,放在方法头上。
@AfterReturning,后置【try】通知,放在方法头上,使用returning来引用方法返回值。
@AfterThrowing,后置【catch】通知,放在方法头上,使用throwing来引用抛出的异常。
@Around,环绕通知,放在方法头上,这个方法要决定真实的方法是否执行,而且必须有返回值。