JAVA中的经常使用注解---学习中持续更新--望指正

注解知识回顾

第一:分类

(1)jdk自带的注解(5个):经常使用的就一个:@Override
(2)元注解(5个):经常使用的两个:@Target(指定注解使用的位置) @Retention(描述生命周期)
(3)自定义注解:(框架里都是)web

第二:元注解

@Target 指定其余注解可使用的位置(包上、类上、方法上、属性上)
    @Retention 指定其余注解的生命周期(源文件中、运行时、class文件中)

第三:自定义注解

自定义注解须要配合元注解使用(经常使用@Target&@Retention )

第四:@Target注解(指定其余注解可使用的位置)

(1)其余注解使用在单个位置(如何指定?)
    @Target(ElementType.Type)
(2)其余注解使用在多个位置(如何指定?)底层维护的是一个数组
    @Target({ElementType.Type,ElementType.Field}) 
 (3)@Target注解的取值{值被维护在ElementType中}
        ElementType.Type
        ElementType.Field
        ElementType.Method

第五:@Retention注解(指定其余注解的生命周期)

@Retention注解的取值{值被维护在RetentionPolicy工具类中}
        RetentionPolicy.SOURCE
        RetentionPolicy.CLASS
        RetentionPolicy.RUNTIME

第六:自定义注解阐述

(1)定义:        
          @inteface 注解名{}
(2)配合元注解,指定自定义注解使用的位置,以及自定义注解的生命周期

第七:给注解添加功能---属性(也有人称为方法)

定义(1):ajax

@inteface Annotation{
        String name();
    //String name() default "lisi";//给name赋默认值lisi
    }

使用(1):spring

@Annotation(name="zhangsan")
        public void sayhello(){
    
    }

定义(2):sql

@inteface Test{
        int value();
        //int value() default 10;//给value赋默认值10
    }

使用(2):json

@Test(value=100)
        public void sayhello(){    
     }
因为value的特殊性,在使用注解时,能够省略“value=”,例如@Test(100)
若是想直接使用@Test不写值100,能够在定义注解时,设置value的默认值为100
@inteface Test{
   int value() default 100;//给value赋默认值100
}

问题分析:后端

@inteface Test{
    String name() default "lisi";//给name赋默认值lisi
    int value() default 100;//给value赋默认值100
}

(1)能够直接使用这个注解,直接写@Test
(2)保留name的默认值,改value的值(“value=”可省略)数组

@Test(10)

(3)保留value的默认值,改name的值(“value=”可省略)springboot

@Test(name=”张三“)

(4)同时改两个值时(“value=”不能省略)restful

@Test(name=”张三“,value=10)

第八:框架(framework)中经常使用的注解

(1)@SpringBootApplicaton
描述SpringBoot工程启动类的特定注解
(2)@SpringBootTest
描述SpringBoot工程测试类的特定注解
(3)@AutoWired
自动装配-由Spring框架为咱们指定的属性类型注入值.咱们经常使用接口类型的变量来接收spring框架注入的值(多态的思想,为了下降耦合,让程序更容易维护)
具体的注入(DI)过程:
@AutoWired
                Student student;
                属性的类型 属性名

(1)第一:(Student为一个类)spring框架会基于属性的类型的首字母小写(student)做为key去bean池(单例)中(多例用的时候才建立)去寻找对应的value(这个value就是对象),在注入给这个属性名(注入的实际上是一个地址而并不是对象);
(2)第二:(Student为接口类型)若该实现类只有一个,则直接注入;
(3)第三:若该接口的实现类有多个,此时会根据属性名student,去查找对应的实现类建立的对象(这个对象存在map中的key为类名首字母小写),找到直接注入,找不到就直接抛异常:NoUniqueBeanDefinitionException
解决办法两种:(通常开发中都不推荐)mybatis

方法1:修改bean的名字(默认是类名首字母小写);@Component  (“指定的名字”),这个指定的名字必须与咱们要注入的属性名一摸同样;
方法2:修改属性名(改为某个实现类的类名首字母小写);

经常使用方法就是指定用哪一个实现类!使用( @Qualifier 注解)

(4)@Component
不明确这个类属于哪层时能够用该注解,将该类 的实 列交给spring容器建立
(5)@Controller
该注解用于描述控制层,将控制层的实例建立权限 交给spring容器
返回的是view
(6)@Service
该注解用于描述业务层,由spring来建立@Service 描述的类的实例
(7)@Lazy
该注解用于延迟对象的建立,在springboot项目中,对于 单例对象默认在项目启动时建立,这样会耗时耗资源-单例对象是要存 到bean池中的,一般配合[@Scope(singleton)]注解使用,对于 @Scope("prototype")描述的类的对象就是在须要时建立,按需加 载,故@Lazy注解对多利做用域对象不起做用
(8)@Scope
有两个取值@Scope("prototype")、 @Scope("singleton")
(9)@Test

(单元测试的注解)

知足如下条件
(1)访问修饰符不能为private
(2)返回值必须为void
(3)方法参数必须时无参
(4)测试方法容许抛出异常

扩展----测试的第二种方法(CommandLineRunner)
在启动类(@SpringBootApplicaton)中实现这个接口,重写 run()方法,在run()方法中写咱们测试代码;当启动类启动时会自动执行run()方法

(10)@Bean

一般用于配置类中,与@Configuration配合使用
@Bean描述的方法的返回值(返回的是一个对象)交给spring去 管理。此时能够配合@Lazy注解使用

(11)@Mapper
添加在数据层的接口上,通知spring,该接口的实现类有mybatis负责实现,该实现类的对象有mybatis建立,可是交给spring管理
(12)@Repository
添加在数据层接口的实现类上,将这个类交给Spring管理
(13)@param
当mybatis版本相对较低时,在动态sql中想要使用方法中的参数变量来获取数据,就须要使用该注解对参数变量进行描述
也与jdk的版本有关
原理:mybatis中规范,默认条件下能够进行但值传递 后端用任意的参数接收均可以,
有时可能进行多值传递,会将多值封装为map集合进行参数的传递
旧版本时若是须要封装为单值,则必须添加param
新版本时能够自动添加@param,前提条件是多值传递
单值:数组 collection=“array”
单值:集合 collection=“list”
多值:利用@param注解封装 collection=“key”
(14)@ReponseBody
1.描述的方法的返回值不是view(不是一个页面),
2.好比说能够是一个字符串String---直接返回该字符串
3.当方法的返回值是一个或多个pojo对象(也能够是map)时,springmvc去查看这个方法上是否有该注解,如有,就会pojo对象转成JSON格式的字符串(字符串数组)
(15)@RestController
@Controller+@ReponseBody
通常适用于ajax,不走视图解析器,而且返回json数据
(16)@PathVariable
当咱们的方法参数要从url中获取参数时,就须要使用该注解--restful风格中经常使用!
若是url中的名字与方法参数名不一致,还能够指定
url="menu/menulist"

1.url中的名字与方法参数名一致,能够直接加上@PathVariable,不用指定别名
@RequestMapping("{do}/{dolist}")
public String domain(@PathVariable String dolist){
return dolist;
}

@RequestMapping("{do}/{dolist}")
public String domain(@PathVariable String do){
return do;
}

* * *

2.url中的名字与方法参数名不一致,还能够指定,代表方法参数中的变量时来自url中的哪个
(通常不用这样的,直接写成同样就能够了(第一种))
@RequestMapping("{do}/{dolist}")
public String domain(@PathVariable("dolist")String name){
return name;
}
@RequestMapping("{do}/{dolist}")
public String domain(@PathVariable("do")String name){
return name;
}
(17)@RequestMapping
请求映射-提供映射路径-可使用在类上、方法上
(18)@ControllerAdvice
该注解描述类为全局异常处理类
当Spring mvc(web)的控制层出现异常,首先会检查controller中是否有对应的异常处理方法,有则直接执行,若没有,就会检索是否有@ControllerAdvice描述的类,如有,则再去检索类中是否有对应的异常处理方法。。
(19)@ExceptionHandler
该注解描述的方法,为一个异常处理的方法,注解中须要指定能处理的异常类型(RuntimException.class-字节码对象),表示该方法可以处理该类型的异常以及子类异常。 在异常处理方法中,一般须要一个异常参数,用来接收异常对象。 方法的返回值一般是一个对象(json格式-知足响应式布局),一般与@ReponseBody注解结合使用
相关文章
相关标签/搜索