Java中注解篇(一)

156 阅读4分钟

介绍

对于Java程序员来说,Spring框架可以说是我们耳熟能详的技术之一,对spring常用的注解有一个清晰概念,对我们的工作会有一个很大的帮助,本篇文章遍览Java世界的注解有哪些。

tips:在某次面试时,曾有被问到过spring相关有哪些注解,后续曾经有机会面试别人的时候,同样提出了这个问题,颇有一种屠龙者终成恶龙的感觉。O(∩_∩)O~~

首先我们先来介绍一些耳熟能详,但又几乎忽略的一些Java原生注解。

一、JDK原生的注解

首先介绍的是两个几乎没用的注解,但是说它们没用,或许也是有点用的。

1. 方法覆写、方法重载的注解

@Override 方法重写的注解 和 @Overload 方法重载的注解 无须多的赘述,方法重载发生在一个类中同名方法,方法重写发生在父子类之间,或者接口和接口实现类之间。 只有一些语意化的作用,可以明确标识防止错误符合规范
尽管在Java中并非必须使用注解来表示方法重载和重写,但良好的编程实践建议在可能的情况下使用注解,以增强代码的可读性和可维护性。

2. 过期元素注解

@Deprecated用于标记已经过时,不建议使用的元素。如:类、方法、字段等。
不知道怎么读,来看音标 /ˈdeprəkeɪtɪd/ 😄

3. 忽略指定类型的编译警告

@SuppressWarnings 忽略指定类型的警告信息。既然是指定类型了,那肯定有类型标识呀。 主要的标识有以下几种:

  • unchecked :用于抑制未经检查的操作的警告。
  • deprecation :用于抑制使用过时方法或类的警告。
  • rawtypes :用于抑制原始类型的警告。
  • serial :用于抑制缺少 serialVersionUID 域的警告。
  • finally :用于抑制 finally 语句无法正常运行的警告。
  • all :用于抑制所有类型的警告。

如何使用呢?示例 image.png

4. 函数式接口注解

在java8之后引入了函数式接口,@FunctionalInterface注解就是用来标识这种接口的。

这个接口中只有一个方法,可以支持lambda表达式。

二、spring中的注解

spring中有更多的注解,这里挑出来几个简单介绍一下。

1. 条件注解

条件注解是指@Conditional,基于此也衍生出来一个指定场景的实现,如:@ConditionalOnMissingBean @ConditionalOnBean @ConditionalOnClass @ConditionalOnProperty这几个。

1.1 Conditional注解

@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean,另外的几个条件注解都是基于本注解来封装了一层。

public @interface Conditional {
    // Condition子类Class类型的数组
    Class<? extends Condition>[] value();
}

// 需要实现此函数式接口,在springboot环境下可以参考``` SpringBootCondition抽象类及其子类OnClassCondition
@FunctionalInterface
public interface Condition {
    boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}
//参考文章:
//https://blog.csdn.net/xcy1193068639/article/details/81491071
//https://blog.csdn.net/qq_38366063/article/details/93894204
1.2 ConditionalOnMissingBean和ConditionalOnBean注解

@ConditionalOnMissingBeanIOC中没有此Bean则注入,此注解只作用在@Bean定义的方法上,容器在注册生成此Bean的时,会检查容器中是否存在目标类型(ConditionalOnMissingBean注解的value值)的Bean,如果存在则跳过Bean的默认加动作,如果不存在则加载该Bean完成注册。
注意:@ConditionalOnBean有则注入;@ConditionalOnMissBean没有则注入;@Conditional条件满足则注入。
建议:仅仅在自动配置类中使用此注解

@ConditionalOnBean的作用和@ConditionalOnMissingBean正好相反,为:如果Spring容器中已经有了某类型的bean则注入。

1.3 ConditionalOnClass和ConditionalOnProperty注解

@ConditionalOnClass 某个class位于类路径上,才会实例化一个Bean。

@ConditionalOnProperty 在spring boot中有时候需要控制配置类是否生效,通过havingValue与配置文件中的值对比,返回为true则配置类生效,反之失效。

@Configuration
@ConditionalOnProperty(prefix = "filter",name = "loginFilter",havingValue = "true")
public class FilterConfig {
	//prefix为配置文件中的前缀,
	//name为配置的名字
	//havingValue是与配置的值对比值,当两个值相同返回true,配置类生效.
    @Bean
    public FilterRegistrationBean getFilterRegistration() {
        FilterRegistrationBean filterRegistration  = new FilterRegistrationBean(new LoginFilter());
        filterRegistration.addUrlPatterns("/*");
        return filterRegistration;
    }
}

2. MVC常用注解

业务开发中对于后端而言,最频繁莫过于写接口,避不开这些注解: @AutoWired @Resource @Controller @Service @Repository @Component @RequestMapping @RequestBody @RequestBody @Requestparam

  • AutoWired注解和Resource注解都是注入对象的。
  • ControllerServiceRepository,和Component没有区别,都是声明一个bean,但是比Component更具有语义化。

3. 排序注解

@Order 一 是用在控制配置类的加载顺序
二 是用在集合bean依赖注入的时候,定义集合内部Bean的加载顺序,因此在需要有序消费bean的时候,不需要再次排序,直接定义好Order注解得value值就好。 参考:

  1. blog.csdn.net/yanluandai1…
  2. lulutongtong.blog.csdn.net/article/det…

4. 懒加载注解

@LazySpring IOC(ApplicationContext)容器一般都会在启动的时候,实例化所有的Bean。如果我们想要Spring启动的时候延迟加载Bean,即在调用某个Bean的时候再去初始化,那么就可以使用@Lazy注解。

注意:@Lazy的注解的主要作用是为了减少spring IOC容器的加载时间,当出现循环依赖的时候也可以添加@Lazy注解