1注解中的元注解有哪些?
在JDK 1.5中提供了4个标准的用来对注解类型进行注解的注解类,,
分别是:Target(位置) Retention(保存的时间) Documented(生成的文档有注解) Inherited(子类可以继承) 来对我们自定义的注解类型进行注解,
@Target:使用位置
Target注解的作用是:描述注解的使用范围(即:被修饰的注解可以用在什么地方
Target注解用来说明那些被它所注解的注解类可修饰的对象范围:注解可以用于修饰 packages、types(类、接口、枚举、注解类)、类成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数),在定义注解类时使用了@Target 能够更加清晰的知道它能够被用来修饰哪些对象,它的取值范围定义在ElementType 枚举中。
public enum ElementType {
TYPE, // 类、接口、枚举类
FIELD, // 成员变量(包括:枚举常量)
METHOD, // 成员方法
PARAMETER, // 方法参数
CONSTRUCTOR, // 构造方法
LOCAL_VARIABLE, // 局部变量
ANNOTATION_TYPE, // 注解类
PACKAGE, // 可用于修饰:包
TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
}
@Retention:保留到何时
Reteniton注解的作用是:描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以被保留到何时) 。
Reteniton注解用来限定那些被它所注解的注解类在注解到其他类上以后,可被保留到何时,一共有三种策略,定义在RetentionPolicy枚举中。
public enum RetentionPolicy {
SOURCE, // 源文件保留
CLASS, // 编译期保留,默认值
RUNTIME // 运行期保留,可通过反射去获取注解信息
}
@Documented:描述在自定义接口上时生产文档时会有注解
Documented注解的作用是:描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
为了验证Documented注解的作用到底是什么,我们创建一个带有 @Documented 的自定义注解类。
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyDocumentedtAnnotation {
public String value() default "这是@Documented注解为文档添加的注释";
}
@MyDocumentedtAnnotation
public class MyDocumentedTest {
@Override
@MyDocumentedtAnnotation
public String toString() {
return this.toString();
}
}
@Inherited:子类继承了父类则会自带这个注解
Inherited注解的作用是:使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。
接下来我们使用代码来进行测试,首先创建一个被@Inherited修饰的注解类MyInheritedAnnotation。
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyInheritedAnnotation {
public String name() default "pengjunlee";
}
@MyInheritedAnnotation(name="parent")
public class Parent {
}
``
```c
public class Child extends Parent{
public static void main(String[] args) {
Class<Child> child=Child.class;
MyInheritedAnnotation annotation = child.getAnnotation(MyInheritedAnnotation.class);
System.out.println(annotation.name());
}
}
结果:
parent
2一对多(Collection)和多对一(Association)?
一对多:
现在我们再来看一看Mybatis的Mapper该如何编写一对多?很简单,就是在resultMap标签中配置标签,用来存储查询到的文章列表,注意posts代表的是用户实体的文章List集合:
这样Sql查询到的内容就映射到User用户实体中的属性中啦,这就是一对多的查询
多对一
多个帖子对应一个用户
3springBoot的实现原理?
@SpringBootApplication注解为组合注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
主要组合了:
@EnableAutoConfiguration 中的@Import注解导入的配置功能
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
5索引?
https://www.cnblogs.com/luyucheng/p/6289714.html
普通索引
唯一索引
主键索引
组合索引
全文索引
1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存一下索引文件。
2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。
索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
6说下集合?
collection
set 、list
hashSet treeSet ;Arraylist linkedList
set :无序不重复的元素
hashSet:内部hash算法
treeSet :做排序的
list :有序可重复的元素
ArrayList:数组类型的集合,查询元素比较快 10
LinkedList:双向链表类型集合,添加和删除元素比较快
7RabbitMq哪几种消费模式?你们的消费失败怎么处理的?
简单模式、工作模式、订阅模式、路由模式、主题模式
消费失败则是加入死信队列,后台启动线程,重新消费
9Redis你们存的什么数据?可以存那些数据?
存的字典
10Dubbo的原理,还有ZooKeeper?
dubbo是远程调用的解决方案,底层是tcp连接的 支持的协议有 dubbo。http、hession、等等
zookeeper注册中心,zab协议来实现的,支持集群内部有心跳机制和选举机制,zookeeper宕机了,服务还是能用,有本地缓存。