关于注解:注解式项目开发详细解析Java中各个注解的作用和使用方式

@Target作用: 指明了润饰的这个注解的应用范畴, 即被形容的注解能够用在哪里 @Target(ElementType.Type)ElementType取值的类型: TYPE: 类,接口或者枚举FIELD: 域,蕴含枚举常量METHOD: 办法PARAMETER: 参数CONSTRUCTOR: 构造方法LOCAL_VARIABLE: 局部变量ANNOTATION_TYPE: 注解类型PACKAGE: 包 @Retention作用: 指明润饰的注解的生存周期, 即会保留到哪个阶段RetentionPolicy的取值类型有三种: SOURCE: 源码级别保留,编译后即抛弃CLASS: 编译级别保留,编译后的class文件中存在,在jvm运行时抛弃,这是默认值RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,能够被反射调用 @Documented作用: 指明润饰的注解,能够被例如javadoc此类的工具文档化 只负责标记没有成员取值 @Inherited作用: 容许子类继承父类中的注解@Inherited须要和@AliasFor一起应用: 在子注解对应的属性应用@AliasFor 注解是能够继承的,然而注解是不能继承父注解的属性也就是说,在类扫描时的注解的属性值仍然是父注解的属性值,而不是自定义注解的属性值须要在注解的属性上应用@AliasFor @ComponentScan作用: 定义扫描的门路从中找出标识了须要拆卸的类主动拆卸到spring的bean容器中默认会扫描该类所在的包下所有的配置类@ComponentScan中的参数类型: value: 用于对指定包的门路进行扫描basePackages: 用于指定包的门路进行扫描,用法和value一样.倡议应用valuebasePackageClasses: 用于对指定某个类的所在的包的门路进行扫描nameGenerator: 用于为Spring容器中的检测到bean组件命名useDefaultFilters: 是否开启对 @Component,@Repository,@Service,@Controller的类进行检测excludeFilters: 依照过滤条件进行排除 FilterType.ANNOTATION: 依照注解FilterType.ASSIGNABLE_TYPE: 依照给定的类型FilterType.ASPECTJ: 应用ASPECTJ表达式FilterType.REGEX: 应用正则表达式FilterType.CUSTOM: 依照自定义规定includeFilters: 依照过滤条件进行蕴含 FilterType.ANNOTATION: 依照注解FilterType.ASSIGNABLE_TYPE: 依照给定的类型FilterType.ASPECTJ: 应用ASPECTJ表达式FilterType.REGEX: 应用正则表达式FilterType.CUSTOM: 依照自定义规定 @Filter作用: 配置过滤条件的过滤器注解@Filter中的参数类型: typeclass @interface作用: 自定义注解主动继承java.lang.annotation.Annotation接口,由编译程序主动实现其余细节在定义注解时,不能继承其余的注解或接口@interface用来申明一个注解: 其中的每一个办法实际上是申明一个配置参数办法的名称就是参数的名称办法的返回值类型就是参数的类型返回值类型只能是根本类型,Class,String,enum能够通过default来申明参数的默认值定义注解的格局: public @interface 注解名 {定义体}注解参数反对的数据类型: 根本数据类型: int,float,boolean,byte,double,char,long,shortString类型Class类型enum类型Annotation类型以上类型组合的数组Annotation类型中参数设定规定: 只能用public或default默认拜访权润饰:参数成员只能用根本类型byte,short,char,int,long,float,double,boolean八种根本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组如果只有一个参数成员,最好把参数名称设为value,后加小括号注解元素的默认值: 注解元素必须有确定的值要么在定义注解的默认值中指定,要么在应用注解时指定,非根本类型的注解元素的值不可为null因而应用空字符串或0作为默认值束缚这个束缚使得处理器很难体现一个元素的存在或缺失的状态: 因为每个注解的申明中,所有元素都存在,并且都具备相应的值为了绕开这个束缚,只能定义一些非凡的值(比方空字符串或者正数),示意某个元素不存在 @AliasFor作用: 为注解的属性增加别名在同一个注解内,对两个不同的属性一起应用,互为别名: 无论为哪个属性名设置属性值,另一个属性名也是同样的属性值互为别名的属性值必须雷同,否则会报错属性必须要有默认的属性值public @interface RequestMapping { @AliasFor("path") // 此时path和value值必须是一样的,否则会报错 String[] value() default {}; @AliasFor("value") // 此时path和value值必须是一样的,否则会报错 String[] path() default {}; }显式的笼罩元注解中的属性: ...

June 28, 2021 · 3 min · jiezi

关于注解:深入理解Java注解类型

Java注解是在JDK5时引入的新个性,鉴于目前大部分框架(如Spring)都应用了注解简化代码并进步编码的效率,因而把握并深刻了解注解对于一个Java工程师是来说是很有必要的事。 了解Java注解实际上Java注解与一般修饰符(public、static、void等)的应用形式并没有多大区别,上面的例子是常见的注解: public class AnnotationDemo { @Test public static void A(){ System.out.println("Test....."); } @Deprecated @SuppressWarnings("uncheck") public static void B(){ }}通过在办法上应用@Test注解后,在运行该办法时,测试框架会自动识别该办法并独自调用,@Test实际上是一种标记注解,起标记作用,运行时通知测试框架该办法为测试方法。而对于@Deprecated和@SuppressWarnings(“uncheck”),则是Java自身内置的注解,在代码中,能够常常看见它们,但这并不是一件坏事,毕竟当办法或是类下面有@Deprecated注解时,阐明该办法或是类都曾经过期不倡议再用,@SuppressWarnings 则示意疏忽指定正告,比方@SuppressWarnings(“uncheck”),这就是注解的最简略的应用形式,那么上面咱们就来看看注解定义的根本语法 根本语法申明注解与元注解咱们先来看看后面的Test注解是如何申明的: @Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Test {}咱们应用了@interface申明了Test注解,并应用@Target注解传入ElementType.METHOD参数来表明@Test只能用于办法上,@Retention(RetentionPolicy.RUNTIME)则用来示意该注解生存期是运行时,从代码上看注解的定义很像接口的定义,的确如此,毕竟在编译后也会生成Test.class文件。对于@Target和@Retention是由Java提供的元注解,所谓元注解就是标记其余注解的注解,上面别离介绍 @Target 用来束缚注解能够利用的中央(如办法、类或字段),其中ElementType是枚举类型,其定义如下,也代表可能的取值范畴 public enum ElementType { /**表明该注解能够用于类、接口(包含注解类型)或enum申明*/ TYPE,/** 表明该注解能够用于字段(域)申明,包含enum实例 */ FIELD, /** 表明该注解能够用于办法申明 */ METHOD, /** 表明该注解能够用于参数申明 */ PARAMETER, /** 表明注解能够用于构造函数申明 */ CONSTRUCTOR, /** 表明注解能够用于局部变量申明 */ LOCAL_VARIABLE, /** 表明注解能够用于注解申明(利用于另一个注解上)*/ ANNOTATION_TYPE, /** 表明注解能够用于包申明 */ PACKAGE, /** * 表明注解能够用于类型参数申明(1.8新退出) * @since 1.8 */ TYPE_PARAMETER, /** * 类型应用申明(1.8新退出) * @since 1.8 */ TYPE_USE }请留神,当注解未指定Target值时,则此注解能够用于任何元素之上,多个值应用{}蕴含并用逗号隔开,如下: ...

May 4, 2021 · 5 min · jiezi

关于注解:注解入门

java注解注解是什么?注解是元数据的一种模式,,为程序提供了一些数据,然而并不是程序的一部分。注解对代码并不间接地提供操作。 作用:告知编译器一些信息,例如查看重写(@Override)、克制正告(@SuppressWarnings)编译器以及部署期 的解决: 软件工具能够解决注解去生成代码,xml文件运行时解决:一些注解能够在运行时被查看到根底注解的格局@Entity @Author( name = "Benjamin Franklin", date = "3/27/2003" ) 哪里能够被应用:能够被用在 类、办法、字段、或者参数 public enum ElementType { /* Class, interface (including annotation type), or enum declaration / TYPE, /* Field declaration (includes enum constants) / FIELD, /* Method declaration / METHOD, /* Formal parameter declaration / PARAMETER, /* Constructor declaration / CONSTRUCTOR, /* Local variable declaration / LOCAL_VARIABLE, /* Annotation type declaration / ANNOTATION_TYPE, /* Package declaration / PACKAGE, /*Type parameter declaration/ TYPE_PARAMETER, /* Use of a type/ TYPE_USE} ...

March 31, 2021 · 2 min · jiezi

关于注解:SSMspringboot注解总结

注解常识回顾 第一:分类(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)过程: ...

January 30, 2021 · 2 min · jiezi

关于注解:SpringBoot注解最全详解整合超详细版本

应用注解的劣势: 1.采纳纯java代码,不在须要配置繁冗的xml文件 2.在配置中也可享受面向对象带来的益处 3.类型平安对重构能够提供良好的反对 4.缩小简单配置文件的同时亦能享受到springIoC容器提供的性能 一、注解详解(装备了欠缺的释义)------(可采纳ctrl+F 来进行搜寻哦~~~~) @SpringBootApplication:申明让spring boot主动给程序进行必要的配置,这个配置等同于: @Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。 @ResponseBody:示意该办法的返回后果间接写入HTTP response body中,个别在异步获取数据时应用,用于构建RESTful的api。在应用@RequestMapping后,返回值通常解析为跳转门路,加上@esponsebody后返回后果不会被解析为跳转门路,而是间接写入HTTP response body中。比方异步获取json数据,加上@Responsebody后,会间接返回json数据。该注解个别会配合@RequestMapping一起应用。 @Controller:用于定义控制器类,在spring我的项目中由控制器负责将用户发来的URL申请转发到对应的服务接口(service层),个别这个注解在类中,通常办法须要配合注解@RequestMapping。 @RestController:用于标注管制层组件(如struts中的action),@ResponseBody和@Controller的合集。 @RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。 @EnableAutoConfiguration:SpringBoot主动配置(auto-configuration):尝试依据你增加的jar依赖主动配置你的Spring利用。例如,如果你的classpath下存在HSQLDB,并且你没有手动配置任何数据库连贯beans,那么咱们将主动配置一个内存型(in-memory)数据库”。你能够将@EnableAutoConfiguration或者@SpringBootApplication注解增加到一个@Configuration类上来抉择主动配置。如果发现利用了你不想要的特定主动配置类,你能够应用@EnableAutoConfiguration注解的排除属性来禁用它们。 @ComponentScan:示意将该类主动发现扫描组件。集体了解相当于,如果扫描到有@Component、@Controller、@Service等这些注解的类,并注册为Bean,能够主动收集所有的Spring组件,包含@Configuration类。咱们常常应用@ComponentScan注解搜寻beans,并联合@Autowired注解导入。能够主动收集所有的Spring组件,包含@Configuration类。咱们常常应用@ComponentScan注解搜寻beans,并联合@Autowired注解导入。如果没有配置的话,Spring Boot会扫描启动类所在包下以及子包下的应用了@Service,@Repository等注解的类。 @Configuration:相当于传统的xml配置文件,如果有些第三方库须要用到xml文件,倡议依然通过@Configuration类作为我的项目的配置主类——能够应用@ImportResource注解加载xml配置文件。 @Import:用来导入其余配置类。 @ImportResource:用来加载xml配置文件。 @Autowired:主动导入依赖的bean @Service:个别用于润饰service层的组件 @Repository:应用@Repository注解能够确保DAO或者repositories提供异样转译,这个注解润饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不须要为它们提供XML配置项。 @Bean:用@Bean标注办法等价于XML中配置的bean。 @Value:注入Spring boot application.properties配置的属性的值。示例代码: @Inject:等价于默认的@Autowired,只是没有required属性; @Component:泛指组件,当组件不好归类的时候,咱们能够应用这个注解进行标注。 @Bean:相当于XML中的,放在办法的下面,而不是类,意思是产生一个bean,并交给spring治理。 @AutoWired:主动导入依赖的bean。byType形式。把配置好的Bean拿来用,实现属性、办法的组装,它能够对类成员变量、办法及构造函数进行标注,实现主动拆卸的工作。当加上(required=false)时,就算找不到bean也不报错。 @Qualifier:当有多个同一类型的Bean时,能够用@Qualifier(“name”)来指定。与@Autowired配合应用。@Qualifier限定描述符除了能依据名字进行注入,但能进行更细粒度的管制如何抉择候选者,具体应用形式如下: @Resource(name=”name”,type=”type”):没有括号内内容的话,默认byName。与@Autowired干相似的事。 二、注解列表如下 @SpringBootApplication:蕴含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中 @ComponentScan:让spring Boot扫描到Configuration类并把它退出到程序上下文。 @Configuration :等同于spring的XML配置文件;应用Java代码能够查看类型平安。 @EnableAutoConfiguration :主动配置。 @ComponentScan :组件扫描,可主动发现和拆卸一些Bean。 @Component可配合CommandLineRunner应用,在程序启动后执行一些根底工作。 @RestController:注解是@Controller和@ResponseBody的合集,示意这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST格调的控制器。 @Autowired:主动导入。 @PathVariable:获取参数。 @JsonBackReference:解决嵌套外链问题。 @RepositoryRestResourcepublic:配合spring-boot-starter-data-rest应用。 三、JPA注解 @Entity:@Table(name=”“):表明这是一个实体类。个别用于jpa这两个注解个别一块应用,然而如果表名和实体类名雷同的话,@Table能够省略 @MappedSuperClass:用在确定是父类的entity上。父类的属性子类能够继承。 @NoRepositoryBean:个别用作父类的repository,有这个注解,spring不会去实例化该repository。 @Column:如果字段名与列名雷同,则能够省略。 @Id:示意该属性为主键。 @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”):示意主键生成策略是sequence(能够为Auto、IDENTITY、native等,Auto示意可在多个数据库间切换),指定sequence的名字是repair_seq。 @SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):name为sequence的名称,以便应用,sequenceName为数据库的sequence名称,两个名称能够统一。 ...

January 12, 2021 · 2 min · jiezi

关于注解:java-Annotations

注解定义和用法Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate. 注解是一种元数据,它可能关联代码中不同元素和构造,不会间接影响它注解的元素,然而能够被编译器辨认,能够联合反射等应用。一个简略的注解申明如下,@interface 关键字引入了新的注解类型。 @Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface TaskName { String value();}注解能够申明有默认值和没有默认值的属性 @Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface TaskName { String value(); int taskId() default 0;}如果注解申明了没有默认值的属性,那么在该注解被利用的所用中央都应该提供注解属性值。 @TaskName (name = "test")如果注解只有一个属性,并且是value那么名字能够被省略,然而应用的时候必须指定value的值,例如:@TaskName ("test") public @interface TaskName { String value();}保留策略每个注解都有一个被称为保留策略(Retention Policy)的特色,它是一组如何保留注解的策略组合的枚举(RetentionPolicy类型)。 策略形容CLASS注解被编译器记录在class文件中,然而在运行时不须要虚拟机保留(即运行时不存在)RUNTIME注解被编译器记录在class文件中并且在运行时被虚拟机保留,因而能够通过反射机制获取SOURCE注解被编译器抛弃(即注解仅在源码中保留,class文件中不存在)上面的代码,RetentionPolicy.RUNTIME将会保障注解在编译过程和运行的应用程序中存在。 @Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface TaskName { String value();}元素类型每个注解必须有它可能利用的元素类型,元素类型被定义成一组可能的元素类型的枚举(ElementType)。 ...

December 30, 2020 · 1 min · jiezi

关于注解:JsonFormat与DateTimeFormat注解的使用

背景:从数据库获取工夫传到前端进行展现的时候,咱们有时候可能无奈失去一个称心的工夫格局的工夫日期,在数据库中显示的是正确的工夫格局,获取进去却变成了很丑的工夫戳,@JsonFormat注解很好的解决了这个问题,咱们通过应用@JsonFormat能够很好的解决:后盾到前台工夫格局保持一致的问题,其次,另一个问题是,咱们在应用WEB服务的时,可能会须要用到,传入工夫给后盾,比方注册新用户须要填入出生日期等,这个时候前台传递给后盾的工夫格局同样是不统一的,而咱们的与之对应的便有了另一个注解,@DataTimeFormat便很好的解决了这个问题。 @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private Date symstarttime; @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private Date symendtime;我这里就只贴这两个属性了,这里我两个注解都同时应用了,因为我既须要取数据到前台,也须要前台数据传到后盾,都须要进行工夫格局的转换,能够同时应用。 总结: 注解@JsonFormat次要是后盾到前台的工夫格局的转换 注解@DataFormAT次要是前后到后盾的工夫格局的转换

December 19, 2020 · 1 min · jiezi

关于注解:面试官说说你对注解的理解

关注“Java后端技术全栈” 回复“000”获取大量电子书 本文次要内容如下: 背景当初曾经处于注解流行时代,注解@Override ,这个注解是再相熟不过了,还有@Controller、@RequestMapping、@Service..... 注解曾经是作为一个开发中必备的技能了。 如果在面试中被问到注解,说不出个123,就只能回去等告诉了。 什么是注解?注解annotation是JavaSE5.0中新增性能。能够了解为注解是一种标记,这种标记能够在编译、类加载、运行时被读取,并执行相应的解决。 它能够增加到程序的任何元素上:包申明、类型申明、构造方法、一般办法、成员变量、参数。 注解的老大: package java.lang.annotation;    //是个接口    public interface Annotation {            boolean equals(Object obj);        int hashCode();         String toString();         //获取注解类型        Class<? extends Annotation> annotationType();    }JDK自带为咱们提供了元注解,上面就来聊聊JDK的元注解。 元注解有哪些?JDK为咱们提供五个元注解,位于java.lang.annotation 包目录下。别离为: @Retention@Target@Documented@Inherited@RepeatableRetention注解字面翻译: 该注解就是定义该注解是作用于什么阶段。 编译、类加载、运行(应用最多) 注解源码: @Documented    @Retention(RetentionPolicy.RUNTIME)    @Target(ElementType.ANNOTATION_TYPE)    public @interface Retention {        /**         * Returns the retention policy.         * @return the retention policy         */        RetentionPolicy value();    }保留策略 package java.lang.annotation;    public enum RetentionPolicy {         SOURCE,         CLASS,         RUNTIME    }SOURCE:只在Java源代码中,编译器编译的时候会把它间接抛弃。 CLASS:编译器将注解记录在.class文件中。当运行Java程序时,JVM不能获取注解信息。这是默认值。 RUNTIME:编译器将注解记录在.class文件中。当运行Java程序时,JVM也能获取注解信息。程序能够通过反射获取注解信息。 留神:如果应用该注解的时候必须指定value的值。 Target注解字面意义为指标,上面来看看器源码: @Documented    @Retention(RetentionPolicy.RUNTIME)    @Target(ElementType.ANNOTATION_TYPE)    public @interface Target {        //元素类型        ElementType[] value();    }    public enum ElementType {         TYPE,         FIELD,         METHOD,         PARAMETER,         CONSTRUCTOR,         LOCAL_VARIABLE,         ANNOTATION_TYPE,         PACKAGE,         /** @since 1.8*/        TYPE_PARAMETER,        /** @since 1.8*/        TYPE_USE    }Target注解是在申明创立一个注解的时候,批示该注解能够作用于程序中的哪些元素。 它里边也蕴含一个名为value的成员变量,value成员变量的值有如下几种 ANNOTATION_TYPE:指定以后注解只能润饰其它注解CONSTRUCTOR:指定以后注解只能润饰构造方法FIELD:指定以后注解只能润饰成员变量LOCAL_VARIABLE:指定以后注解只能润饰局部变量METHOD:指定以后注解只能润饰办法PACKAGE:指定以后注解只能润饰包PARAMETER:指定以后注解只能润饰参数TYPE:指定以后注解能够润饰类,接口,其它注解,枚举等类型比如说:罕用的Spring的注解@Controller,是用来作用于类上的。 Documented 注解字面意义就是文档。@Documented用于形容其它类型的annotation应该被作为被标注的程序成员的公共API,因而能够被例如javadoc此类的工具文    档化。Documented是一个标记注解,没有成员 。 @Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Documented {}次要是用来生成文档的,工作中基本上很少应用,作为理解就能够了。 Inherited 注解字面意义: @Inherited注解是在申明创立一个注解的时候,指定该注解将具备继承性。 Inherited 源码: @Documented    @Retention(RetentionPolicy.RUNTIME)    @Target(ElementType.ANNOTATION_TYPE)    public @interface Inherited {    }如果某个类应用了该注解@Xx,则其子类也将主动被此注解@Xx所润饰。 应用模板: @Retention(RetentionPolicy.RUNTIME)    @Target(ElementType.TYPE)    @Inherited    public @interface A {            }    @A    public class Base {            }    //Sub也带有@A    public class Sub extends Base {    }Repeatable注解@Repeatable元注解,顾名思义,反复注解,就是在申明创立注解的时候,指定该注解能够被同一个程序元素屡次应用。这是JDK8新增的注解,反复注解只是一种简单化写法,这种简单化写法是一种假象。多个反复注解其实会被作为“容器”注解的value成员变量的数组元素。 比方上面Spring中注解ComponentScan: @Retention(RetentionPolicy.RUNTIME)    @Target(ElementType.TYPE)    @Documented    @Repeatable(ComponentScans.class)    public @interface ComponentScan {    }        @Retention(RetentionPolicy.RUNTIME)    @Target(ElementType.TYPE)    @Documented    public @interface ComponentScans {     ComponentScan[] value();    }应用案例 import org.springframework.context.annotation.Bean;    import org.springframework.context.annotation.ComponentScan;    import org.springframework.context.annotation.ComponentScans;        @ComponentScans(value = {            @ComponentScan(value = "com.tian.pakage0"),            @ComponentScan(value = "com.tian.pakage1")})    public class MainConfig {        @Bean        public User person() {            return new User();        }    }根本注解注解必须应用工具来解决,工具负责提取注解中蕴含的元数据,工具还会依据这些元数据减少额定的性能。上面咱们先来理解一下5个根本注解的用法。 OverrideSafeVarargsSuppressWarningsFunctionalInterfaceDeprecated上面咱们就来说说这五个注解。 Override用于标识办法,标识该办法属于重写父类的办法 。 //只能用于办法上    @Target(ElementType.METHOD)    //源码中编译时就会应用    @Retention(RetentionPolicy.SOURCE)    public @interface Override {    }此注解外表是重写父类的办法,只能用于办法上,并且用于编译阶段,咱们在开发的时候,如果注解使用不当,在源码编译时立马就会做出提醒。 ...

December 6, 2020 · 1 min · jiezi

关于注解:自定义注解的魅力你到底懂不懂

前言你晓得自定义注解的魅力所在吗?你晓得自定义注解该怎么应用吗? 本文一开始的这两个问题,须要您认真思考下,而后联合这两个问题来浏览上面的内容;如果您在浏览完文章后对这两个问题有了比拟清晰的,请动动您发财的小手,点赞留言呀! 本文主线:注解是什么;实现一个自定义注解;自定义注解的实战利用场景;留神:本文在介绍自定义注解实战利用场景时,须要联合拦截器、AOP进行应用,所以本文也会简略聊下AOP相干知识点,如果对于AOP的相干内容不太分明的能够参考此 细说Spring——AOP详解 文章进行理解。注解注解是什么?①、援用自维基百科的内容:Java注解又称Java标注,是JDK5.0版本开始反对退出源代码的非凡语法 元数据 。Java语言中的类、办法、变量、参数和包等都能够被标注。和Javadoc不同,Java标注能够通过反射获取标注内容。在编译器生成类文件时,标注能够被嵌入到字节码中。Java虚拟机能够保留标注内容,在运行时能够获取到标注内容。 当然它也反对自定义Java标注。 ②、援用自网络的内容:Java 注解是在 JDK5 时引入的新个性,注解(也被称为 元数据 )为咱们在代码中增加信息提供了一种形式化的办法,使咱们能够在稍后某个时刻十分不便地应用这些数据。元注解是什么?元注解 的作用就是负责注解其余注解。Java5.0定义了4个规范的meta-annotation(元注解)类型,它们被用来提供对其它 annotation类型作阐明。规范的元注解:@Target@Retention@Documented@Inherited在具体说这四个元数据的含意之前,先来看一个在工作中会常常应用到的 @Autowired 注解,进入这个注解外面瞧瞧: 此注解中应用到了@Target、@Retention、@Documented 这三个元注解 。@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Autowired { boolean required() default true;}@Target元注解:@Target注解,是专门用来限定某个自定义注解可能被利用在哪些Java元素下面的,表明作用范畴;取值在java.lang.annotation.ElementType 进行定义的。public enum ElementType { /** 类,接口(包含注解类型)或枚举的申明 */ TYPE, /** 属性的申明 */ FIELD, /** 办法的申明 */ METHOD, /** 办法形式参数申明 */ PARAMETER, /** 构造方法的申明 */ CONSTRUCTOR, /** 局部变量申明 */ LOCAL_VARIABLE, /** 注解类型申明 */ ANNOTATION_TYPE, /** 包的申明 */ PACKAGE}依据此处能够晓得 @Autowired 注解的作用范畴: ...

November 15, 2020 · 6 min · jiezi