常见注解

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

注解是什么?

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

简单来说注解其实就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理。

JDK内置了哪些注解?

  • Overried
    Overried是告诉编译器要检查该方法是实现父类的方法。

  • Deprecated
    Deprecated用于标记一些过时的代码。

  • SuppressWarnings
    SuppressWarnings用于消除一些警告信息,使用集合的时候,如果没有指定泛型,IDE会提示安全检查的警告。

  • FunctionalInterface
    FunctionalInterface是JDK8中的注解,用来指定该接口是函数式接口。

  • SafeVarargs
    SafeVarargs是JDK 7中的注解,主要目的是处理可变长参数中的泛型,此注解告诉编译器:在可变长参数中的泛型是类型安全的。

怎么自定义一个注解?

在Java中,类使用class定义,接口使用interface定义,注解和接口的定义差不多,增加了一个@符号,即@interface,代码如下:

public @interface EnableAuth {
}

注解中可以定义成员变量,用于信息的描述,跟接口中方法的定义类似,代码如下:

public @interface EnableAuth {
   String name();
}

还可以添加默认值:

public @interface EnableAuth {
   String name() default "猿天地";
}

上面的介绍只是完成了自定义注解的第一步,开发中日常使用注解大部分是用在类上,方法上,字段上,示列代码如下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EnableAuth {
}
  • Target
    用于指定被修饰的注解修饰哪些程序单元,也就是上面说的类,方法,字段

  • Retention
    用于指定被修饰的注解被保留多长时间,分别SOURCE(注解仅存在于源码中,在class字节码文件中不包含),CLASS(默认的保留策略,注解会在class字节码文件中存在,但运行时无法获取),RUNTIME(注解会在class字节码文件中存在,在运行时可以通过反射获取到)三种类型,如果想要在程序运行过程中通过反射来获取注解的信息需要将Retention设置为RUNTIME

  • Documented
    用于指定被修饰的注解类将被javadoc工具提取成文档

  • Inherited
    用于指定被修饰的注解类将具有继承性

如何获取注解中的值?

可以通过反射来判断类,方法,字段上是否有某个注解以及获取注解中的值, 获取某个类中方法上的注解代码示例如下:

Class<?> clz = bean.getClass();
Method[] methods = clz.getMethods();
for (Method method : methods) {
   if (method.isAnnotationPresent(EnableAuth.class)) {
       String name = method.getAnnotation(EnableAuth.class).name();
   }
}

通过isAnnotationPresent判断是否存在某个注解,通过getAnnotation获取注解对象,然后获取值

工作中经常接触的注解有哪些?

注解在很多框架中都应用非常多,这个问题你可以说下Spring中的即可,大概的解释下每个注解的含义和用途,除了Spring还有很多别的框架中也有使用注解,比如Swagger, Lombok,JPA,Spring Data等

  • Component

  • Controller

  • Repository

  • Service

  • RequestMapping

  • RequestParam

  • RequestAttribute

  • RequestBody

  • ResponseBody

  • ……

注解的使用场景?

  • 生成文档
    Swagger中就是通过注解对接口,实体类中的字段进行描述生成可视化的文档


  • 代替配置文件
    Spring中Bean的装载注入


  • 导出数据
    可以写一个统一的导出工具类,传入一个List<实体类>进去即可导出Excel文件,Excel的表头可以用注解加载字段上


  • 框架层面的统一处理
    注解在底层框架中用的比较多,在框架中需要考虑到通用性,能用注解做很多事情,比如对API进行权限控制,限流等操作都可以通过自定义注解来标识是否需要进行认证,限流等,还有数据的缓存,典型的就是@Cacheable,还有异步方法的调用@Async,ORM框架中的使用,可以用注解标识表名,字段名,JPA中,Spring Data框架中都有使用

权限控制详细讲解

比如我们有的接口需要认证才能调用,有的不需要,简单的做法就是用配置的方式,将需要认证的接口配置好,然后进行拦截过滤,缺点是需要经常维护配置信息,用注解可以避免这个情况。
可以自定义一个注解,只要加了这个注解我们就对这个接口进行认证拦截操作,接下里详细的讲解下这个功能实现。

定义开启认证的注解,作用在方法上,运行时可获取注解信息

/**
* 开启API权限认证
* @author yinjihuan
*
*/

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EnableAuth {
}

在需要认证的接口上增加注解

@EnableAuth
@GetMapping("/userCollectCityInfo")
@ApiOperation(value="获取登录用户关注的城市信息", notes="获取登录用户关注的城市信息", produces = "application/json")
@ApiResponses(
       @ApiResponse(response = UserCollectCityInfoDto.class, code = 200, message = "")

)
public Response getUserCollectCityInfos(HttpServletRequest request) {
   try {
       Long uid = UserInfoUtils.getLoginUserId(request);
       List<CityCollect> citys = cityCollectService.findAllByUid(uid);
       List<UserCollectCityInfoDto> results = citys.stream().map(this::ofCityInfo)
                   .sorted((l1, l2) -> l1.getRangeLevel().compareTo(l2.getRangeLevel()))
                   .collect(Collectors.toList());
       return Response.ok(results);
   } catch (Exception e) {
       logger.error("获取登录用户关注的城市信息异常", e);
       return Response.fail("获取登录用户关注的城市信息异常");
   }
}

在拦截器中进行拦截,拦截需要知道当前请求的接口是不是需要拦截的,我们可以在启动时将所有增加了@EnableAuth的接口信息保存起来,这样在拦截器中就知道哪个接口是需要认证。

初始化需要认证的接口信息代码如下:

/**
* API 验证数据初始化
* @author yinjihuan
*
*/

@Component
@Configuration
public class ApiAuthDataInit implements ApplicationContextAware {
   public static List<String> checkApis = new ArrayList<String>();
   @Override
   public void setApplicationContext(ApplicationContext ctx) throws BeansException {
       Map<String, Object> beanMap = ctx.getBeansWithAnnotation(RestController.class);
       if (beanMap != null) {
           for (Object bean : beanMap.values()) {
               Class<?> clz = bean.getClass();
               Method[] methods = clz.getMethods();
               for (Method method : methods) {
                   if (method.isAnnotationPresent(EnableAuth.class)) {
                       String uri = getApiUri(clz, method);
                       checkApis.add(uri);
                   }
               }
           }
       }
   }
   private String getApiUri(Class<?> clz, Method method) {
       StringBuilder uri = new StringBuilder();
       uri.append(clz.getAnnotation(RequestMapping.class).value()[0]);
       if (method.isAnnotationPresent(GetMapping.class)) {
           uri.append(method.getAnnotation(GetMapping.class).value()[0]);
       } else if (method.isAnnotationPresent(PostMapping.class)) {
           uri.append(method.getAnnotation(PostMapping.class).value()[0]);
       } else if (method.isAnnotationPresent(RequestMapping.class)) {
           uri.append(method.getAnnotation(RequestMapping.class).value()[0]);
       }
       return uri.toString();
   }
}


实现ApplicationContextAware接口,然后通过getBeansWithAnnotation获取所有接口的bean信息,通过RestController注解来获取,也就是说只要class上增加了RestController注解,这边就都能获取到。


然后通过反射获取bean中所有的方法,如果有增加EnableAuth的话就获取接口的uri存储到map中,这样过滤器中就可以根据map中的值来判断是不是需要进行权限认证了。

spring注解@Configuration,@Value,@Bean实例 spring 3.0中增加了@Configuration,以下做了一个简单的例子 阅读详情

相关推荐

整天都说注解注解注解,你们了解注解吗?来自——面试官的灵魂拷问

注解 它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。 元注解作用 如果要对于元数据的作用进行分类,还没有明确

weixin_48137995的博客 314

如何来自定义注解

前面了介绍了注解相关的知识,本文来详细说下如何自定义注解,以及注解在开发中常见的应用场景。 文章目录概述 概述 深入理解JAVA中的注解

wh柒八九的博客 1037

Java注解面试题

Java注解面试题 1、4种标准元注解是哪四种? 元注解的作用是负责注解其他注解。 Java5.0 定义了 4 个标准的 meta-annotation 类型,它们被用来提供对其它 annotation 类型作说明。 @Target 修饰的对象范围 @Target说明了Annotation所修饰的对象范围: Annotation可被用于 packages、types(类、接口、枚举、Annotation 类型)、类型成员 (方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch .

weixin_49802371的博客 2098

面试题十九:Java高级面试 — 注解(另:Java注解

目录 相关文章: 一、注解概念 1、概念 2、什么是元数据(metadata) 二、注解分类 1、系统内置标准注解 2、元注解 三、Android support annotations 四、面试题 4.1、为什么使用注解的形式? 4.2、使用注解的原理? 4.3、会不会影响执行效率?为什么没有降低执行效率? 相关文章: 注解(Annotation)-Android讲解...

songzi1228的博客 1170

Spring题集 - Spring 注解相关面试题总结

}用指定Spring容器扫描的包路径。它可以自动扫描指定包及其子包下的所有类,并将标记为@Component、@Controller、@Service、@Repository等注解的类注册为Spring容器中的Bean。如果不加@Component注解,那么OtherBean就不会被Spring容器扫描注册,dataSource也不会注册为Spring容器的bean了。

你今天真好看呀 1878

常用注解有哪些?(@Configuration, @Bean, @Autowired, @Value等)

Spring Boot注解大大简化了配置工作,但需注意:合理选择注入方式,优先使用构造器注入理解注解的生命周期和作用范围善用条件注解实现环境适配遵循注解的默认约定,减少显式配置。

qq_54136871的博客 801

Java中的注解解析@Component、@ComponentScan、@Scope、@Autowired、@Bean、@ContextConfiguration、@RunWith等

Java中的注解解析@Component、@ComponentScan、@Scope、@Autowired、@Bean、@ContextConfiguration、@RunWith等

jjw_zyfx的博客 7827

SpringBoot配置类中的@Configuration注解和@bean注解

1.@Configuration注解 用法:作用在类上面 作用:告诉SpringBoot这是一个配置类,相当于Spring中的xml配置文件。 @Configuration //告诉SpringBoot这是一个配置类 == 配置文件 public class Config { } 2.@bean注解 用法:配置类里面使用@Bean标注在方法上给IoC容器注册组件,默认也是单实例的 作用:给容器中添加组件,相当于Spring中xml配置文件中的<bean>标签。 理解:以方法名作为组件的id。返

MrYushiwen的博客 7869

@bean注解和@component注解的区别_Spring 中的一些注解

这也是很久之前写的,不出所料的话今天依旧是水文章的一天,就不该年初立flag。本文打算介绍几个不太容易说出其区别,或者用途的 Spring 注解,比如@Component与@Bean的比较,@ControllerAdvice是如何处理自定义异常的等等。Spring 中的一些注解1.@Component和@Bean的区别是什么?1.作用对象不同:@Component注解...

weixin_35544490的博客 2万+

spring注解@Configuration、@Bean、@Autowired、@Controller、@Service、@Component、@Repository、@Value

文章目录@Configuration和@Bean的关系@Bean和@Autowired@Controller、@Service、@Component、@Repository @Configuration和@Bean的关系 @Configuration和@Bean注解详解 被@Configuration修饰的类,spring容器中会通过cglib给这个类创建一个代理,代理会拦截所有被@Bean修饰的方法,默认情况(bean为单例)下确保这些方法只被调用一次,从而确保这些bean是同一个bean,即单例的。 @

wwyy2018的博客 2307

spring注解开发@Component @Bean @Value @Autowired、@Qualifier @PropertySource @Configuration

spring注解开发 启动注解功能 启动注解功能 ⚫ 启动注解扫描,加载类中配置的注解项 ⚫ 说明: ◆ 在进行包所扫描时,会对配置的包及其子包中所有文件进行扫描 ◆ 扫描过程是以文件夹递归迭代的形式进行的 ◆ 扫描过程仅读取合法的java文件 ◆ 扫描时仅读取spring可识别的注解 ◆ 扫描结束后会将可识别的有效注解转化为spring对应的资源加入IoC容器 ⚫ 注意: ◆ 无论是注解格式还是XML配置格式,最终都是将资源加载到IoC容器中,差别仅仅是数据读取方式不同 ◆ 从加载效率上来说注解优于X

fushuaiCSDN的博客 435

@Configuration和@Bean注解详解

Configuration使用步骤:在类上使用@Configuration注解通过AnnotationConfigApplicationContext容器来加@Configuration注解修饰的类。

Hell_potato777的博客 4982

springboot中的常用注解

springboot中的常用注解 个人觉得springboor中常用的注解主要可以分为三种:放入容器型注解、从容器中取出型注解和功能型注解。其中的放入容器型和从容器中取出型就是我们平时所说的控制反转和依赖注入的概念(个人版本- - - 可以看一看,别太当真 0.0) 放入容器型注解 简介:个人觉得就是申明一个实例对象,然后将这个对象交给spring管理。 1、@Component:放在类上...

一只仰望天空的菜鸟 1万+

SpringBoot 配置类 @Configuration和@Bean的使用

基本介绍 Spring Boot推荐使用java配置完全代替XML配置,java配置是通过@Configration和@Bean注解实现的。二者作用如下: @Configration 注解:声明当前类是一个配置类,相当于Spring中的一个XML文件 @Bean 注解:作用在方法上,声明当前方法的返回值是一个Bean 配置类的加载 spring容器在启动的时候会去扫描@Configuration,并将相关的类进行加载。 它将在resources目录下的META-INF...

flyconley的博客 1万+

Spring注解开发:@Component/@Autowired/@Value详解与实践

Spring 注解开发摘要 Spring 提供了多种注解来简化配置管理,替代传统的 XML 配置方式。核心注解包括: 组件扫描:通过 @ComponentScan 开启,指定扫描包路径,自动识别带注解的类。 IOC 相关: @Component:通用组件标识 @Controller/@Service/@Repository:分层语义化注解 DI 相关: @Value:直接属性注入,支持基本类型和 SpEL 表达式 @Autowired:自动注入同类型对象 @Qualifier:配合 @Autowired 指

先做到 再看见 893

@Configuration与@Bean注解的原理

@Configuration与@Bean结合使用。@Configuration可理解为用spring的时候xml里面的<beans>标签,@Bean可理解为用spring的时候xml里面的<bean>标签。Spring Boot不是spring的加强版,所以@Configuration和@Bean同样可以用在普通的spring项目中,而不是Spring Boot特有的,只是...

写代码的蜗牛 3万+

详解@Configuration注解

@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

分享技术,享受生活 4万+

@Value和@Bean注解的执行顺序问题

Springboot中使用@Configruation和@Bean一起将Bean注册到ioc容器中,而@Value常用于将yml配置文件中的配置信息注入到类的成员变量中。当@Configruation、@Bean和@Value出现在同一个类中时,@Bean会比@Value先执行,这会导致当@Bean注解的方法中用到@Value注解的成员变量时,无法注入(null)的情况。例如在为Feign创建配置类,以实现Feign的权限验证时,需要将yml文件中的用户名和密码注入到配置类的成员变量中,@Bean注解方法则

qq_22339269的博客 4989

Spring中@Bean注解和@Configuration、@Component注解组合使用的差异

一、@Bean的“full”模式和“lite”模式 在一般常见情况下,@Bean注解在@Configuration类中声明,称之为“full”模式;当@Bean注解和@Component注解组合使用时,称之为“lite”模式。这两种组合使用的情况,初次看文档时没看明白,多看了几次又跑了测试代码,才大致理解了区别。 二、两种模式的差异 如果只是把@Be...

灵颖桥人的博客 5324
上一篇: Linux环境安装nodejs
下一篇: linux安装gitbook以及jenkins一键部署
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值