注解常识回顾
第一:分类
(1)jdk自带的注解(5个):罕用的就一个:@Override
(2)元注解(5个):罕用的两个:@Target(指定注解应用的地位) @Retention(形容生命周期)
(3)自定义注解:(框架里大部分都是)
第二:元注解
@Target 指定其余注解能够应用的地位(包上、类上、办法上、属性上)示意以后注解对谁无效 对类无效@Retention 指定其余注解的生命周期(源文件中、运行时、class文件中),注解什么时候失效 运行期无效@Documented 示意将该注解形容的注解外部的正文局部,也生成到相应的API中 是否动静的生成文档信息@Inherited 示意该注解能够被继承
第三:自定义注解
自定义注解须要配合元注解应用(罕用@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):
@inteface Annotation{ String name(); //没有设置默认值,应用该注解时,该属性必须增加值。//String name() default "lisi";//给name赋默认值lisi,设置了默认值后,应用该注解不须要手动设置name的属性值。}
应用(1):
@Annotation(name="zhangsan") public void sayhello(){}
定义(2):
@inteface Test{ int value(); //int value() default 10;//给value赋默认值10}
应用(2):
@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赋默认值lisiint value() default 100;//给value赋默认值100
}
(1)能够间接应用这个注解,间接写@Test
(2)保留name的默认值,改value的值("value="可省略)
@Test(10)
(3)保留value的默认值,改name的值(“value=”可省略)
@Test(name="张三")
(4)同时改两个值时("value="不能省略)
@Test(name="张三",value=10)
第八:框架(framework)中罕用的注解
(1)@SpringBootApplication
形容SpringBoot工程启动类的特定注解
(2)@SpringBootTest
形容SpringBoot工程测试类的特定注解
应用条件:如果须要在测试类中,引入spring容器机制,这是才是用该注解,否则没必要加。
引入spring容器机制:比如说,咱们要在测试类中,通过spring容器来注入某个类的实例时,就须要应用该注解。
(3)@AutoWired
主动拆卸-由Spring框架为咱们指定的属性类型注入值.咱们罕用接口类型的变量来接管spring框架注入的值(多态的思维,为了升高耦合,让程序更容易保护)
具体的注入(DI)过程:
@AutoWired Student student; 属性的类型 属性名
(1)第一:(Student为一个类)spring框架会基于属性的类型的首字母小写(student)作为key去bean池(单例)中(多例用的时候才创立)去寻找对应的value(这个value就是对象),在注入给这个属性名(注入的其实是一个地址而并非对象);
(2)第二:(Student为接口类型)若该实现类只有一个,则间接注入;
(3)第三:若该接口的实现类有多个,此时会依据属性名student,去查找对应的实现类创立的对象(这个对象存在map中的key为类名首字母小写),找到间接注入,找不到就间接抛异样:NoUniqueBeanDefinitionException
解决办法两种:(个别开发中都不举荐)
办法1:批改bean的名字(默认是类名首字母小写);@Component (“指定的名字”),这个指定的名字必须与咱们要注入的属性名一摸一样;
办法2:批改属性名(改成某个实现类的类名首字母小写);
罕用办法就是指定用哪个实现类!应用( @Qualifier 注解)
@AutoWired(required=false)在我的项目启动的第一工夫,能够不注入值(能注入则注入,不能注入则跳过)。
与@Resource注解拆卸过程辨别,参见@Resource注解(地位:第47个注解)
(4)
@Component
不明确这个类属于哪层时能够用该注解,将该类 的实 例交给spring容器创立
加:@ComponentScan阐明:通过该注解能够指定哪些包中的对象交给spring容器治理
加:@ComponentScan(excludeFilters = { // 扫描门路设置(具体应用待确认)
加:@Configuration:形容该注解是一个配置类|配置文件
加:@SpringBootConfiguration:该注解示意了主启动类,阐明主启动类也是一个配置类|配置文件
加:@AutoConfigurationPackage:主动配置的包扫描 动静获取以后主启动类的包门路
注意事项:当前写代码的时候,肯定要在主启动类的同包及子包中编辑
加:@Import(AutoConfigurationImportSelector.class)
:阐明:springBoot程序中有多个选择器,在程序启动时springBoot会调用选择器去加载pom.xml文件中的启动项(SpringBoot-statr-xxxx)等jar包文件,如果选择器匹配则开始运行实例化对象,如果不匹配则跳过该选择器,执行下一个。至此整个开箱即用的准则实现
加:请具体理解springboot的启动过程(CSDN 百度)
加:开箱即用的外围:@EnableAutoConfiguration:此注解顾名思义是能够主动配置,开启springboot的注解性能,springboot的四大神器之一,其借助@Import的帮忙
加:@PropertySource("value=classpath:/"):意思就是程序运行时,咱们要加载指定的配置文件
加:@Accessors(chain = true) //链式加载
加:@TableName("")//定义表明与对象之间的关系
加:@TableId(type = IdType.AUTO)//主键自增
加:@TableField("name")//字段映射 如果名称雷同,则能够省略不写
(5)@Controller
该注解用于形容管制层,将管制层的实例创立权限 交给spring容器
返回的是view
(6)@Service
该注解用于形容业务层,由spring来创立@Service 形容的类的实例
加: @Mapper
将构造交给Mybatis治理,之后对立交给spring治理
(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)@MapperScan("接口文件的包名")
增加在主启动类上,利用包扫描的形式,为指定包下的接口创立代理类以及代理对象并交给spring治理
劣势:不必在每个映射的接口上应用@Mapper注解了
前提:要将所有的映射文件放在同一个包下。
(13)@Repository
增加在数据层接口的实现类上,将这个类交给Spring治理
(14)@Param
当mybatis版本绝对较低时,在动静sql中想要应用办法中的参数变量来获取数据,就须要应用该注解对参数变量进行形容
也与jdk的版本无关(往下看~~~~)
原理:mybatis中规定,默认条件下能够进行单值传递 后端用任意的参数接管都能够。
有时候可能进行多值传递,须要将多值封装为map汇合进行参数的传递(sql中通过key来取值)
旧版本时如果须要封装为单值,则必须增加@Param注解
新版本时能够主动增加@param,前提条件是多值传递
单值:数组 collection="array" (mapper层传的是数组,此时数组就是一个单值,此时xml中的collection="array")
单值:汇合 collection="list" (mapper层传的是list汇合,此时数组就是一个单值,此时xml中的collection="list")
多值:利用@param注解封装 collection="key"(mapper层传的是map,此时这个map就是一个单值,此时xml中的collection="key")
(15)@ReponseBody
1.形容的办法的返回值不是view(不是一个页面),
2.比如说能够是一个字符串String---间接返回该字符串
3.当办法的返回值是一个或多个pojo对象(也能够是map)时,springmvc去查看这个办法上是否有该注解,若有,就会pojo对象转成JSON格局的字符串(字符串数组)
4.示意程序完结
5.不会执行视图解析器配置
(16)@RestController
@Controller+@ReponseBody
个别实用于ajax,不走视图解析器,并且返回json数据
(17)@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;
}
(18)@RequestMapping
申请映射-提供映射门路-能够应用在类上、办法上
(19)@ControllerAdvice
该注解形容类为全局异样解决类
当Spring mvc(web)的管制层出现异常,首先会查看controller中是否有对应的异样解决办法,有则间接执行,若没有,就会检索是否有@ControllerAdvice形容的类,若有,则再去检索类中是否有对应的异样解决办法。。
(20)@ExceptionHandler
该注解形容的办法,为一个异样解决的办法,注解中须要指定能解决的异样类型(RuntimException.class-字节码对象),示意该办法可能解决该类型的异样以及子类异样。
在异样解决办法中,通常须要一个异样参数,用来接管异样对象。
办法的返回值通常是一个对象(json格局-满足响应式布局),通常与@ReponseBody注解联合应用
(21)@Aspect
该注解形容的类为一个切面(aop)
(22)@Around(盘绕告诉)优先级最高
执行指标办法之前Spring会检测是否有切面(@Aspect形容的类),而后检测是否有告诉办法(@Around注解形容的办法),有该办法则执行该办法,在办法中调用通过ProceedingJoinPoint对象jp调用proceed()办法(该办法会执行指标办法)
(23)@Before
当@Around注解形容的办法中,要执行指标办法之前(proceed办法执行之前),执行该注解形容的办法
(24)@After
指标办法执行之后,执行此注解形容的办法(如果指标办法有异样该办法不执行)
(25)@AfterReturnning
@After注解形容的办法执行之后,(这个办法执行了,阐明指标办法没有抛出异样)执行该注解形容的办法。
(26)@AfterThrowing
@Around注解形容的办法中的指标办法执行时抛出异样了,就间接执行该注解形容的办法。
(27)@Slf4j(lombok中)
利用在类上,此类中就能够应用log对象
就相当于在这个类中增加了一行如下代码
Logger log=LoggerFactory.getLogger(类名.class);
(28)@PointCut
该注解用来定义切入点办法
@Pointcut("bean(sysUserServiceImpl)")
public void logPointCut() {}
切入点示意有四种:
bean execution within @annocation
(29)@Order(1)
该注解用于指定切面的优先级,数字越小,优先级越高,默认值是整数的最大值即默认值的优先级是最低的
(30)@Transactional
该注解能够形容类和办法,
当形容类时,示意类中的所有办法在执行之前开启事务,办法执行之后完结事务。
当形容办法时,示意该办法在执行之前开启事务,办法执行之后完结事务。
优先级问题:当类上和办法上都有该注解时,办法上的优先级高于类上的。
该注解中的属性也很重要:
timeout:设置超时工夫
isolation:设置隔离级别
rollbackfor:当遇到什么异样以及子类异样时要执行回滚操作。
read-only:指定事务是否为只读事务,默认值为 false;为了疏忽那些不须要事务的办法,比方读取数据,能够设置read-only为true。对增加,批改,删除业务read-only的值应该为false。
propagation:
Propagation.REQUIRED(如果没有事务创立新事务, 如果以后有事务参加以后事务, Spring 默认的事务流传行为是PROPAGATION_REQUIRED,它适宜于绝大多数的状况。)
Propagation.REQUIRES_NEW
如果有以后事务, 挂起以后事务并且开启新事务
(31)@EnableAsync
注解利用到启动类上,示意开启异步,spring容器启动时会创立线程池
spring中线程池的配置:
spring:
task: execution: pool: queue-capacity: 128 core-size: 5 max-size: 128 keep-alive: 60000 thread-name-prefix: db-service-task-
(32)@Async
在须要异步执行的业务办法上,应用@Async办法进行异步申明。
阐明:AsyncResult对象能够对异步办法的执行后果进行封装,如果外界须要异步办法后果时,能够通过Future对象的get办法获取后果。
为了简便某些状况下,咱们能够将办法的返回值写成void,这样就不要这么简单的封装(前提时办法的返回值咱们不应用)。
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Async
@Override
public Future<Integer> saveObject(SysLog entity) {
System.out.println("SysLogServiceImpl.save:"+
Thread._currentThread_().getName());
int rows=sysLogDao.insertObject(entity);
//try{Thread._sleep_(5000);}catch(Exception e) {}
return new AsyncResult<Integer>(rows);
}
(33)@EnableCaching
在我的项目(SpringBoot我的项目)的启动类上增加@EnableCaching注解,以启动缓存配置。
在须要进行缓存的业务办法上通过@Cacheable注解对办法进行相干形容.示意办法的
返回值要存储到Cache中,如果在更新操作时须要将cache中的数据移除,能够在更新办法上应用@CacheEvict注解对办法进行形容。
@Cacheable(value = "menuCache")
@Transactional(readOnly = true)
public List<Map<String,Object>> findObjects() {
....
}
value属性的值示意要应用的缓存对象,名字本人指定,其中底层为一个map对象,当向cache中增加数据时,key默认为办法理论参数的组合。
(34)@Value
阐明:该注解独自应用(不配合@PropertySource注解)时,此时配置文件曾经被加载到spring容器中,示意从spring容器(加载的配置文件)中取值。
该注解配合@PropertySource注解应用时,能够从指定的配置文件中取值,value属性指定配置文件的所在门路@PropertySource(value="classpath:/properties/image.properties",encoding="utf-8")
该注解用于形容属性的值,能够用来取出配置文件中的value值(依据key来取值)(properties、yml)、
properties配置文件的优先级高于yml配置文件的优先级
当这两个文件中都用同一个属性时,优先读取properties配置文件中的,而后读取yml配置文件中的,所有最初失去的是yml>中的(key雷同值被笼罩)。
@value(“${server.port}”)
private String port;
阐明:
因为配置文件中的value值都是字符串类型,所以这里须要用String类型接管。
该注解配合spel表达式取出配置文件中对应key的值。
(35)@PropertySource(value="classpath:/properties/image.properties",encoding="utf-8")
当配置文件曾经被加载到spring容器中了,就不要应用该注解指明加载的配置文件了,容器中有间接用@Value取值即可。
阐明:该注解用于类上,作用:读取指定地位的配置文件信息,加载该文件到spring容器中
value属性用来指定配置文件的门路
classpath:/ 指定类目录下的门路(resource目录下)
encoding:用来指定配置文件的编码类型
@PropertySource(value="classpath:/properties/image.properties",encoding="utf-8")
public class ReadProperties{
}
(36)@Data(lombok)
该注解用在pojo类上,作用是生成对应的get/set/toString...办法
toString()办法只会重写本人的属性,不会增加父类的属性。
(37)@Setter(lombok)
该注解用在pojo类上,生成set办法
(38)@Getter(lombok)
该注解用在pojo类上,生成get办法
(39)@NoArgsConstructor(lombok)
该注解用在pojo类上,生成无参的构造方法
(40)@NoArgsConstructor(lombok)
该注解用在pojo类上,生成全参的构造方法
(41)@Accessors(chain=true)(lombok提供)
提供链式加载(对于set办法)
User user=new User();
user.setName("张三").setAge(26).setScore(98);
(42)@TableName(“表名”)(mybatisplus提供)
该注解用在pojo类上,用来指定该类的对象,与数据库中的哪张表映射
当pojo类名疏忽大小写时,与数据库中要映射的表名统一时,能够不指定表名。如间接写@TableName注解即可。但不能省略这个注解。
(43)@TableId(type=IdType.Auto)(mybatisplus提供)
该注解用于pojo类中的属性上,用来指定表中的主键要映射到pojo类中的哪个属性。
(44)@TableField(value="字段名")(mybatisplus提供)
@TableField(fill = FieldFill.INSERT)指定哪个属性,在新增时无效,个别是创立工夫
@TableField(fill = FieldFill.INSERT_UPDATE)指定哪个属性,在新增和批改时无效,个别是创立工夫/批改工夫
该注解用于pojo类中的属性上,用来指定表中的字段(除主键外的其余字段)映射到pojo类中的哪个属性。
当字段名与属性名统一时,或者,驼峰命名后字段名与属性名统一时,能够省略这个注解@TableField,即pojo中的属性上不写该注解。
(45)@GetMapping("/page/{moduleName}")
该注解用来解决查问申请,其余申请有效。
该注解相当于
@RequestMapping(value="/page/{moduleName}",method=RequestMethod.GET)
restful格调:能够依据申请的形式,来执行特定的业务性能。
TYPE=GET 解决查问业务
TYPE=POST 解决新增业务
TYPE=PUT 解决批改业务
TYPE=DELETE 解决删除业务
result格调总结:
1.能够获取url中的参数配合@PathVariable注解
2.依据申请形式,执行特定的业务性能
(46)@RestControllerAdvice
@RestControllerAdvide=@ResponseBody+@ControllerAdvide
阐明:
该注解利用于类上,示意为告诉办法。类中的办法的返回值都不是view,返回的是JSON格局的数据。
该注解形容的类为全局异样解决类,解决Controller层呈现的异样。
(47)@Resource
@Resource的作用相当于@Autowired,只不过@Autowired按byType主动注入,而@Resource默认按 byName主动注入罢了。@Resource有两个属性是比拟重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果应用name属性,则应用byName的主动注入策略,而应用type属性时则应用byType主动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制应用byName主动注入策略。
@Resource拆卸程序
如果同时指定了name和type,则从Spring上下文中找到惟一匹配的bean进行拆卸,找不到则抛出异样
如果指定了name,则从上下文中查找名称(id)匹配的bean进行拆卸,找不到则抛出异样
如果指定了type,则从上下文中找到类型匹配的惟一bean进行拆卸,找不到或者找到多个,都会抛出异样
如果既没有指定name,又没有指定type,则主动依照byName形式进行拆卸;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则主动拆卸;
(48)@ComponentScan(basePackages={"包的门路"})
扫描指定门路下的类,看是否有类上@Component、@Controller、@Service、@Mapper等,若有则指明该类的实例由Spring容器创立。
(49)@RequestBody
1、@requestBody注解罕用来解决content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。个别状况下来说罕用其来解决application/json类型。
2、通过@requestBody能够将申请体中的JSON字符串绑定到相应的bean上,当然,也能够将其别离绑定到对应的字符串上。
@RequestBody和@RequestParam区别
@RequestParam
注解@RequestParam接管的参数是来自HTTP申请体或申请url的QueryString中。
RequestParam能够承受简略类型的属性,也能够承受对象类型。
@RequestParam有三个配置参数:
required 示意是否必须,默认为 true,必须。
defaultValue 可设置申请参数的默认值。
value 为接管url的参数名(相当于key值)。
@RequestParam
用来解决Content-Type为application/x-www-form-urlencoded编码的内容,Content-Type默认为该属性,也能够接管???????application/json。@RequestParam也可用于其它类型的申请,例如:POST、DELETE等申请.所以在postman中,要抉择body的类型为 x-www-form-urlencoded,这样在headers中就主动变为了 Content-Type : application/x-www-form-urlencoded 编码格局。
@RequestBody
注解@RequestBody接管的参数是来自requestBody中,即申请体。个别用于解决非 Content-Type: application/x-www-form-urlencoded编码格局的数据,比方:application/json、application/xml等类型的数据。就application/json类型的数据而言,应用注解@RequestBody能够将body外面所有的json数据传到后端,后端再进行解析。
GET申请中,因为没有HttpEntity,所以@RequestBody并不实用。
POST申请中,通过HttpEntity传递的参数,必须要在申请头中申明数据的类型Content-Type,SpringMVC通过应用
HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,而后绑定到相应的bean上。因为@RequestBody可用来解决 Content-Type 为 application/json 编码的内容,所以在postman中,抉择body的类型为rowJSON(application/json),这样在 Headers 中也会主动变为 Content-Type : application/json 编码格局。
(50)@JsonFormat
在你须要查问进去的工夫的数据库字段对应的实体类的属性上增加@JsonFormat
能够很好的解决:后盾到前台工夫格局保持一致的问题
(51)@DateTimeFormat
在你须要查问进去的工夫的数据库字段对应的实体类的属性上增加@DataTimeFormat
能够很好的解决:前台到后盾工夫格局保持一致的问题
@DateTimeFormat(pattern ="yyyy-MM-dd")
@JsonFormat(pattern ="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date symstarttime;
(52)@TableName
此注解次要是实现实现类型和数据库中的表实现映射(用于指向数据库的表名称)