关于java:JAVA中的常用注解学习中持续更新望指正

31次阅读

共计 2803 个字符,预计需要花费 8 分钟才能阅读完成。

注解常识回顾

第一:分类

(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 赋默认值 lisi
int 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

正文完
 0