【面试】注解相关-这一篇全了解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w372426096/article/details/84615928

什么是Java中的注解。

解:

Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。

常见的注解如:@Override @Autowired等

什么是Java中的元注解。

解:

说简单点,就是 定义其他注解的注解 。

比如Override这个注解,就不是一个元注解。

而是通过元注解定义出来的。

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.SOURCE)

扫描二维码关注公众号,回复: 4286512 查看本文章

public @interface Override {

}

这里面的

@Target

@Retention

就是元注解。

元注解有四个:@Target(表示该注解可以用于什么地方)、@Retention(表示再什么级别保存该注解信息)、@Documented(将此注解包含再javadoc中)、@Inherited(允许子类继承父类中的注解)。

什么是Java中的自定义注解。

解:

除了元注解,都是自定义注解。通过元注解定义出来的注解。

如我们常用的Override 、Autowire等。

日常开发中也可以自定义一个注解,这些都是自定义注解。

如何自定义一个注解?

解:

在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中常用的注解有哪些?

解:

@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了

@Bean,就会作为这个Spring容器中的Bean。

@Scope注解 作用域 @Lazy(true) 表示延迟初始化

@Service用于标注业务层组件、

@Controller用于标注控制层组件

@Repository用于标注数据访问组件,即DAO组件。

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@Scope用于指定scope作用域的(用在类上)

@PostConstruct用于指定初始化方法(用在方法上)

@PreDestory用于指定销毁方法(用在方法上)

@DependsOn:定义Bean初始化及销毁时的顺序

@Primary:自动装配时当出现多个Bean候选者时,被注解为

@Primary的Bean将作为首选者,否则将抛出异常

@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合

@Qualifier注解一起使用。如下: @Autowired @Qualifier("personDaoBean") 存在多个实例配合使用

@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

@PostConstruct 初始化注解 @PreDestroy 摧毁注解 默认 单例 启动就加载

猜你喜欢

转载自blog.csdn.net/w372426096/article/details/84615928