注解是放在Java
源码的类、方法、字段、参数前的一种特殊“注释”。
从JVM
的角度看,注解本身对代码逻辑没有任何影响,如何使用注解完全由工具决定。
RUNTIME
类型的注解是在程序运行期能够读取的注解,它们在加载后一直存在于JVM
中,这也是最常用的注解。
- 注解的四大作用:
1、生成文档,通过代码里标识的元数据生成javadoc
文档。
2、编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
3、编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
4、运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。 - 定义注解
定义一个注解时,还可以定义配置参数。配置参数必须是常量。如果只写注解,相当于全部使用默认值。
@Target:注解的作用目标
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包
@Retention:注解的保留位置
RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。
RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。
RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
Java
使用@interface
来自定义注解。应当设置@Retention(RetentionPolicy.RUNTIME)
便于运行期读取该Annotation
。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Report {
int type() default 0;
String level() default "info";
String value() default "";
}
Java
提供的使用反射API
读取Annotation
的方法
判断某个注解是否存在
Class.isAnnotationPresent(Class);
使用反射API读取Annotation
Class.getAnnotation(Auth.class);
注意:一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解
@Retention(RetentionPolicy.RUNTIME)
public @interface Auth {
Stirng[] userCode();
}
-
使用注解:
在方法上加上注解@Auth(userCode="123")
1.所做的操作都是先通过反射获取对应元素
Class cls = Auth.class;
2.再获取元素上面的注解
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
Auth annotation = method.getAnnotation(cls);
3.最后得到注解的属性值
String[] aa = annotation.userCode(); -
常用注解
controller层
@Controller
用于标注控制层
@Autowired
自动装配,其作用是消除Java
代码里面的getter/setter
与bean
属性中的property
@ApiOperation(notes="add",value="新增")
生成swagger
@RequestMapping(value,method,consumes,produces,params,headers)
用来处理请求地址映射的注解
@PostMapping(value="/Major/Info")
Spring MVC
里面提供的Resultful
风格的支持
@GetMapping(value="")
@PutMapping(value="")
@DeleteMapping(value="")
@Auth(desc="新增",userCode="",groupCode="")
@RequestBody
用来接收页面传递给后台的json
字符串中数据。
注意:Get
方法无请求体,所以使用@RequestBody
接收数据时,前端不能使用Get
方式提交数据,而应该使用Post
方式提交。
使用时机:返回的数据不是html
标签的页面,而是其他某种格式的数据时(如json
、xml
等)使用。
@RequestParam
获取前端参数
@Valid
验证注解是否符合要求
@ResponseBody
作用于方法,表明此方法的返回值写入Http response body
中
Serveice层
@Service
用于标注服务层,主要用来进行业务的逻辑处理
@Autowired
自动装配
@Override
加在覆写的方法前面,用来检查方法的正确性
@Transactional(rollbackFor=Exception.class)
参数有name,propagation,isolation,timeout,read-only,rollback-for,no-rollback-for
dao层
@repository
用于标注数据访问层
@Mapper
声明此接口为一个mapper
,使用此注解无需再写xml
映射文件
@Param("reqid") String reqid
传递参数
entity
@Data
注解在类上,为类提供读写属性
@EqulasAndHashCode(callSuper=false)
生成equals()
和hashCode()
方法
@Accessors(chain=true)
用来配置lombok
如何产生和显示getters
和setters
的方法。
chain
默认false
,如果为真,产生的setter
返回的是this
而不是void
@TableName("CustomerTable")
@TableId(value="",type=)
声明此属性为主键
@TableField(value="", updateStrategy= FieldStrategy.IGNORED)
FieldStrategy
字段验证策略
1.ignored
所有的字段都会设置到sql
语句中
2.not_null
默认策略,忽略null
的字段,但不忽略""
3.not-empty
忽略null
和空串,即设置值为null
或""不会设置到sql
dto
@JsonProperty
@ApoModelProperty
@Size
@NotEmpty
@NotBlank
@NotNull
common
@ConfigrationProperties
其他
@Component
把普通pojo
实例化到spring
容器中,相当于配置文件中的
<bean id="" class=""/>
。
泛指各种组件,就是说当我们的类不属于各种归类的时候
(不属于@Controller、@Services
等的时候),我们就可以使用@Component
来标注这个类
@Scope("prototype")
定义Bean的作用域和生命过程
值有:singleton,prototype,session,request,session,globalSession
注解分为两类:
1、一类是注册Bean
@Component , @Repository , @ Controller , @Service , @Configration
这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中。
2、一类是使用Bean
即是把已经在xml
文件中配置好的Bean
拿来用,完成属性、方法的组装。
比如@Autowired , @Resource
,可以通过byTYPE(@Autowired)、byNAME(@Resource)
的方式获取Bean
注意:@Autowired , @Resource可以获取接口类型,不能获取抽象类类型
spring中autowired和resource注解的区别
- Spring中Bean的概念
在Spring
中,构成应用程序主干并由Spring IoC
容器管理的对象称为bean
。
bean
是一个由Spring IoC
容器实例化、组装和管理的对象。
@NoArgsConstructor
注解在类上,为类提供一个无参的构造方法。
// 使用注解
@NoArgsConstructor
public class Shape {
private int x;
@NonNull
private double y;
@NonNull
private String name;
}
// 不使用注解
public class Shape {
private int x;
private double y;
private String name;
public Shape(){
}
}
@AllArgsConstructor
(1)注解在类上,为类提供一个全参的构造方法。
(2)默认生成的方法是 public 的,如果要修改方法修饰符可以设置 AccessLevel 的值。
// 使用注解
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class Shape {
private int x;
@NonNull
private double y;
@NonNull
private String name;
}
// 不使用注解
public class Shape {
private int x;
private double y;
private String name;
protected Shape(int x, double y, String name){
this.x = x;
this.y = y;
this.name = name;
}
}
网友评论