Java常⽤注解(Annotation)详解汇总
JAVA核⼼知识点 - 注解(Annotation)
先来说说什么是注解:
注解其实就是代码⾥的特殊标记,它⽤于替代配置⽂件,有了注解技术后,开发⼈员可以通过注解告诉类如何运⾏。通过元注解来定义(修饰)⾃定义注解并定义所需要实现的功能。
注解可以标记在包、类、属性、⽅法,⽅法参数以及局部变量上,且同⼀个地⽅可以同时标记多个注解,这样⼀来就可以为我们省掉⼤量的重复复杂的代码。
在Java技术⾥注解的典型应⽤是:可以通过反射技术去得到类⾥⾯的注解,以决定怎么去运⾏类。
⼀,元注解(⽤来修饰注解的注解)
从JDK 1.5开始, Java增加了对元数据(MetaData)的⽀持,提供了4个标准的⽤来对注解类型进⾏注解的注解类,我们称之为 meta-annotation(元注解)
@Target(ElementType.) 描述注解的使⽤范围(即:被修饰的注解可以⽤在什么地⽅)
取值(ElementType)有:
1.CONSTRUCTOR:⽤于描述构造器
2.FIELD:⽤于描述域
3.LOCAL_VARIABLE:⽤于描述局部变量
4.METHOD:⽤于描述⽅法
5.PACKAGE:⽤于描述包
6.PARAMETER:⽤于描述参数
7.TYPE:⽤于描述类、接⼝(包括注解类型)或enum声明
@Retention(RetentionPolicy.) 描述注解的⽣命周期(即:被修饰的注解被保留到何时)
取值(RetentionPoicy)有:
1.SOURCE:在源⽂件中有效(即源⽂件保留)
2.CLASS:在class⽂件中有效(即class保留)
3.RUNTIME:在运⾏时有效(即运⾏时保留)
@Documented 会被javadoc⼯具动态提取成⽂档。
@Inherited 允许⼦类继承⽗类中的注解。
⼆,Spring中的注解
SpringMVC注解
这些注解描述的类 Spring会创建原⽣对象或代理对象并交给 IOC容器 管理,这些对象称之为bean。⽤时直接 @Autowired 注⼊即可。
@Mapper 描述数据层 (Mapper)
@Service 描述业务层 (Service)
@Repository 标识持久层 / 数据访问层组件(Dao)
@Component 可以描述各种组件(当组件不好归类时)
@RestController 描述控制层(Controller)并返回JSON数据类型,但不会再执⾏配置的视图解析器,也不会返回给jsp页⾯,返回值就是return⾥的内容。
该注解等同于:@Controller + @ResponseBody
@Controller 描述控制层 接收⽤户请求 执⾏ 。
返回⼀个ModelAndView对象,传给指定的jsp(将传过来的ModelAndView对象解析后展⽰在页⾯上),封装后,最后返回给客户端⼀个Html页⾯。
@ResponseBody 将Java对象转为JSON。如果⽤ajax接收请求,必须使⽤该注解。如果没有加此注解,返回的是⼀个页⾯,return⾥⾯的内容会被认做是需要跳转页⾯的地址。
IOC容器注解
IOC(Inversion of Control) 是控制反转,也叫依赖注⼊(DI)。
把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从⽽降低了解决问题的复杂度,⽽且可以灵活地被重⽤和扩展。
简单来说: IOC容器意味着将你设计好的对象(类)交给容器控制(管理),需要的时候通过注解来注⼊(获取),⽽不是传统的在你的对象内部直接控制(new 对象)。从⽽降低了程序的耦合性。
@Bean 描述在⽅法上,把⽅法的返回值交给容器管理,不需要再⼿动调⽤该⽅法。
@Autowired 按byType⾃动注⼊ 获取对应的bean对象。如果注⼊的类型有多个实现类,则需要注⼊具体实现类的名称。
@Resource 按byName⾃动注⼊ 获取对应的bean对象
@Value 注⼊普通类型属性。
如果容器中有多个相同类型的 bean,则框架将抛出 NoUniqueBeanDefinitionException, 以提⽰有多个满⾜条件的bean。
bean会进⾏⾃动装配。程序⽆法正确做出判断使⽤哪⼀个时,可以使⽤以下注解
@Qualifier("") 在相同类型bean上命名后,可以按不同名称注⼊ 配合@Autowired 使⽤。
@Primary 当存在多个相同类型的 bean 时,⾸选被@Primary注解过的bean。
Bean注解
把Bean理解可以理解为类的代理或代⾔⼈(实际上是通过反射、代理来实现的)当你使⽤上⾯SpringMVC注解时,Spring会把这些被注解的类的实例化对象转化成⼀个个的bean,也称 注册 成⼀个个的bean,并保存到IOC容器中。
Bean的使⽤范围注解:
@Scope(value="") 默认⽣成的类是单例的。
取值(value) 有:
1.singleton :单例,默认,程序启动时⽴刻创建对象
2.prototype :多例,需要注⼊时(调⽤⽅法)才创建对象。每次注⼊时,都会创建新对象
3.request :request域,需要在web环境
4.session :session域,需要在web环境。第⼀次访问时创建,关闭浏览器时回收。
5.application: context域,需要在web环境
6.globalsession 集环境的session域,需要在web环境
Bean的⽣命周期注解:
@PostConstruct 相当于init-method
@PreDestroy 相当于destroy-method
Spring启动类注解(开箱即⽤):
只需要导⼊简单的jar包⽂件,就可以实现对应的功能,⽆需(少量)繁琐的配置。
@SpringBootAppliction ⽤在启动类上,主要⽬的是开启⾃动配置 组合了:
1)@SpringBootConfiguration 继承⾃@Configuration,标注当前类是配置类,将当前类的⼀个或多个以@Bean注解标记的⽅法的实例纳⼊到Spring容器中,并且实例名就是⽅法名。
2)@EnableAutoConfiguration ⾃动化配置, 借助@Import的⽀持,收集和注册特定场景相关的bean定义。简单理解:借助@Import的帮助,将所有符合⾃动配置条件的bean定义加载到IOC容器中。
该注解⾥⾯有@AutoConfigurationPackage ⾃动配置的包扫描 @Import调⽤选择器去加载l⽂
件中的启动项
3)@ComponentScan 定义包扫描 指定路径 哪些包中的对象注册成bean交给IOC容器管理。
请求Mapping注解
@RequestMapping("/xxx") 注解类上 通过"/xxx"来指定控制器可以处理哪些URL请求。
请求⽅式:
@GetMapping 通常注解 查询⽅法
@PostMapping 通常注解 增添保存⽅法
@DeleteMapping 通常注解 删除⽅法
@PutMapping 通常注解 更新⽅法
@PatchMapping 通常注解 更新局部⽅法
动态赋值注解
@PathVariable 接收的url动态传给被注解的参数(restFull风格)
@RequestBody 将接收的JSON格式的数据转为Java对象参数(适⽤于Post请求)
@RequestParam(value=“接收的xxx”) 讲接收的xxx传给被注解的参数 (适⽤于Post,Get请求)
缓存注解
@EnableCaching 启动springboot⼯程中的内置缓存。
@Cacheable(value=“缓存值取名”) 把返回值进⾏缓存,缓存通过切⾯⾃动切⼊,可⽤⽤于⽅法或者类上。
参数描述springmvc常用标签
value名称
key key
condition可判断key条件
@CacheEvict(value=“需要清空的缓存名”) ⽅法是⼀个清缓存的切⼊点⽅法,当这个⽅法被调⽤后,即会清空缓存。
参数描述
value名称
key key
condition缓存的条件,可以为空
allEntries是否清空所有缓存内容
beforeInvocation是否在⽅法执⾏前就清空
三,AOP切⾯注解
AOP(Aspect Oriented Programming) ⾯向切⾯编程。
Spring中的AOP代理还是离不开Spring的IOC容器,代理的⽣成,管理及其依赖关系都是由IOC容器负责,Spring默认使⽤ JDK动态代理。
切⼊点表达式:
@Pointcut("@annotation(被切⼊⽅法的地址)") 设置切⼊点
1.bean(“包名.类名”) 具体某个类 按类匹配 粗粒度
2.within(“包名.类名”) 可以使⽤通配符 ⼏个类⼀起匹配 粗粒度
4.注解⽅式 @annotation(注解的类型) 细粒度
通知:
@before(“pointCut()”) 在⽬标⽅法前执⾏
@After(“pointCut()”) 在⽬标⽅法后执⾏ ,不管有没有异常
@AfterReturning 在⽬标⽅法正常返回值后执⾏
@AfterThrowing 在⽬标⽅法出现异常后执⾏
上述的4⼤通知,都不能控制⽬标⽅法是否执⾏,⼀般只会做程序的监控。
可以通过调⽤JoinPoint对象获取被切⼊⽅法 签名(getSignature())。
@Around(“pointCut()”) 在⽬标⽅法执⾏前后都要执⾏,可以控制⽬标⽅法在哪执⾏。
可以通过调⽤ProceedingJoinPoint对象的proceed⽅法来控制需要切⼊的⽅法的⾏动轨迹。
四,常⽤插件注解
Lombok 插件
@Data 动态添加get/set/toString/equals/hashcode/构造⽅法 适⽤于pojo / VO该注解等同于:
@Getter + @Setter + ToString + @EqualsAndHashCode +
@RequiredArgsConstructor
@Value 把所有的变量都设成 final 修饰 和 @Data相似
@AllArgsConstructor 添加构造⽅法
@NoArgsConstructor 添加⽆参构造
@sfl4g ⾃动⽣成该类的 log 静态常量
@Accessors(chain = true) 引⽤链式加载⽅式 ⽅便做插⼊操作。
MybatisPlus 注解
MyBatis-Plus (opens new window)(简称 MP)是⼀个 MyBatis (opens new window)
的增强⼯具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提⾼效率⽽⽣。
@TableName(value="", resultMap="") 表名与实体类名不⼀致时 需要在实体类上加⼊注解"value=表名",xml 中 resultMap 的 id 不⼀致时需要赋值。
@TableId(value= “”, type = IdType.AUTO) 表⽰主键名/属性。 @IdType的值有:
AUTO 数据库⾃增
INPUT ⾃⾏输⼊
ID_WORKER 分布式全局唯⼀ID 长整型类型
UUID 32位UUID字符串
NONE ⽆状态
ID_WORKER_STR 分布式全局唯⼀ID 字符串类型
@TableField("…") 注解新增属性,如果字段名与属性⼀致(已开启驼峰规则),则可省略,否则加⼊"exist=false"参数。
参数描述
value字段值,如果字段名与属性⼀致(已开启驼峰规则)则可省略
update预处理 set 字段⾃定义注⼊
condition预处理 WHERE 实体条件⾃定义运算规则
exist是否为数据库表字段
fill字段填充
@TableLogic 表字段逻辑处理注解(逻辑删除)
Shiro 注解
Shiro 提供了相应的注解⽤于权限控制,如果使⽤这些注解就需要使⽤AOP 的功能来进⾏判断
@RequiresAuthentication 表⽰当前Subject已经通过login 进⾏了⾝份验证,即Subject. isAuthenticated()返回true。
@RequiresGuest 表⽰当前Subject没有⾝份验证或通过记住我登录过,即是游客⾝份。
@RequiresUser 表⽰当前Subject已经⾝份验证或者通过记住我登录的。
@RequiresRoles
(value={“admin”, “user”}, logical= Logical.AND)
表⽰当前Subject需要⾓⾊ admin 和(AND) user ,value表⽰需要判断的⾓⾊,logical表⽰判断条件。
@RequiresPermissions
(value={“user:a”, “user:b”}, logical= Logical.OR)
表⽰当前Subject需要权限 user:a 或(OR) user:b ,value表⽰需要判断的权限,logical表⽰判断条件。
六, Javadoc注解
是Sun公司提供的⼀个技术,它从程序源代码中抽取类、⽅法、成员等注释形成⼀个和源代码配套的API帮助⽂档。也就是说,只要在编写程序时以⼀套特定的标签作注释,在程序编写完成后,通过Javadoc就可以同时形成程序的开发⽂档了。
Java ⽀持三种注释⽅式。前两种分别是 // 和 /* /,第三种被称作说明注释,它以 /* 开始,以 */结束。
说明注释允许你在程序中嵌⼊关于程序的信息。你可以使⽤ javadoc ⼯具软件来⽣成信息,并输出到HTML⽂件中。
说明注释,使你更加⽅便的记录你的程序信息。
Javadoc标签:
标签描述
@author标识⼀个类的作者 @author description
{@code}⼀般在Javadoc中只要涉及到类名或者⽅法名,都需要使⽤@code进⾏标记 {@code text} @deprecated指名⼀个过期的类或成员 @deprecated description
{@docRoot}指明当前⽂档根⽬录的路径 Directory Path
@exception标志⼀个类抛出的异常 @exception exception-name explanation
{@inheritDoc}从直接⽗类继承的注释 Inherits a comment from the immediate surperclass.
{@link}插⼊⼀个到另⼀个主题的链接 {@link name text}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论