注解常识回顾

第一:分类

(1)jdk自带的注解(5个):罕用的就一个:@Override
(2)元注解(5个):罕用的两个:@Target(指定注解应用的地位) @Retention(形容生命周期)
(3)自定义注解:(框架里都是)

第二:元注解

    @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):@inteface Annotation{

String name();//String name() default "lisi";//给name赋默认值lisi}

应用(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)中罕用的注解

@SpringBootApplicaton 形容SpringBoot工程启动类的特定注解
@SpringBootTest 形容SpringBoot工程测试类的特定注解
@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 注解) @Component(不明确这个类属于哪层时能够用该注解,将该类的实列交给spring容器创立)
@Controller(该注解用于形容管制层,将管制层的实例创立权限交给spring容器)
@Service(该注解用于形容业务层,由spring来创立@Service形容的类的实例)
@Lazy(该注解用于提早对象的创立,在springboot我的项目中,对于单例对象默认在我的项目启动时创立,这样会耗时耗资源-单例对象是要存到bean池中的,通常配合@Scope(singleton)注解应用,对于@Scope("prototype")形容的类的对象就是在须要时创立,按需加载,故@Lazy注解对多利作用域对象不起作用)
@Scope(有两个取值@Scope("prototype")、@Scope("singleton"))
@Test(单元测试的注解)

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

扩大----测试的第二种办法(CommandLineRunner)
在启动类(@SpringBootApplicaton)中实现这个接口,重写run()办法,在run()办法中写咱们测试代码;当启动类启动时会主动执行run()办法
@Bean(通常用于配置类中,与@Configuration配合应用)

  @Bean形容的办法的返回值(返回的是一个对象)交给spring去治理。此时能够配合@Lazy注解应用

@Mapper(增加在数据层的接口上,告诉spring,该接口的实现类有mybatis负责实现,该实现类的对象有mybatis创立,然而交给spring治理)
@RequestMapping
@ReponseBody
@RestController(@Controller+@ReponseBody)
@PathVariable