介绍
对于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 :用于抑制所有类型的警告。
如何使用呢?示例
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注解都是注入对象的。
Controller、Service、Repository,和Component没有区别,都是声明一个bean,但是比Component更具有语义化。
3. 排序注解
@Order
一 是用在控制配置类的加载顺序
二 是用在集合bean依赖注入的时候,定义集合内部Bean的加载顺序,因此在需要有序消费bean的时候,不需要再次排序,直接定义好Order注解得value值就好。 参考:
4. 懒加载注解
@LazySpring IOC(ApplicationContext)容器一般都会在启动的时候,实例化所有的Bean。如果我们想要Spring启动的时候延迟加载Bean,即在调用某个Bean的时候再去初始化,那么就可以使用@Lazy注解。
注意:@Lazy的注解的主要作用是为了减少spring IOC容器的加载时间,当出现循环依赖的时候也可以添加@Lazy注解。