proxy:local启动流程
- 前端:koa服务器,proxy转发请求到8090端口
- 8090开启一个nginx服务器,作为反向代理服务器,根据路径将请求转发到不同端口,例:8080
- 8080端口运行TOMCAT服务,返回资源。
java注解
元注解
元注解就是用来注解注解的注解(绕口令)
Retention
它的取值如下:
- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
Documented
能否将注解中的内容包含到javadoc
Target
指定了注解运用的地方。
- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
- ElementType.CONSTRUCTOR 可以给构造方法进行注解
- ElementType.FIELD 可以给属性进行注解
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
- ElementType.METHOD 可以给方法进行注解
- ElementType.PACKAGE 可以给一个包进行注解
- ElementType.PARAMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
Inherited
子类能否继承父类的注解
Repeatable
重复使用注解
注解的属性
注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
默认值由default指定
1 | public TestAnnotation { |
如果仅有一个名为value
的属性,赋值时可以直接写。
使用方法
1 | "jack", id=1) (name= |
空注解可以省略括号。
定义注解步骤
- 用@interface定义注解
- 用元注解修饰注解,target必须,retention一般为runtime,inheritable、repeatable一般不需要
- 定义注解参数和默认值
DAO是什么
Data Access Object,数据访问对象。
是为某种类型的数据库或其他持久性机制提供一个抽象接口的对象。通过映射应用程序对持久层的调用,DAO提供一些特定的数据操作,而无需暴露数据库细节。
Service
Service,我们有时候会需要一些相对独立,与业务系统没啥关系的功能。但不是所有的功能都可以做成一个服务,服务是一个相对独立的功能模块,完成一些指定的工作,这些工作高度抽象和通用。一个典型的服务像是数据库服务、缓存服务、文件存储服务、身份验证服务、消息队列服务等。
服务的特征:抽象、独立、稳定。
Controller
Controller业务流程
idea坑爹,resource不build
bean?
一种符合规范的java类
这个类需要是public 的, 然后需要有个无参数的构造函数
这个类的属性应该是private 的, 通过setXXX()和getXXX()来访问
我们得提供一个所谓的自省/反射机制, 这样能在运行时查看java bean 的各种信息
这个类应该是可以序列化的, 即可以把bean的状态保存的硬盘上, 以便以后来恢复。
@Autowired
自动注入,在上下文中查找符合的bean并注入
sql
select
1 | SELECT [DISTINCT] <列名>, ... |
update
1 | UPDATE <表名> |
乱七八糟的对象
DAO(data access object)数据访问对象,此对象用于访问数据库, 提供数据库的CRUD操作…
DTO(data transfer object)数据传输对象,向前端传输数据的对象。
DVO(value object)值对象,用于业务层数据传递,也可以与DTO混用
多态?
- 调用方法时动态的调用实际类型的方法,而不是声明的变量的类型的方法
- 即可能调用的是子类的覆写方法
final修饰符?
final,最终,按我的理解,多态中说到调用方法是运行时才确定真正的方法,那么final修饰符就是直接指定了这个方法。
- 修饰方法,方法不能被覆写
- 修饰属性,属性的值初始化后就不能改变
- 修饰类,类不能被继承
转型?
向上转型:转为更加抽象的类型
向下转型:转为更加具体的类型
Class?class? 傻傻分不清楚
Class是所有类的数据类型。
可以这么理解,Java中有基础数据类型:int、float等,其他的都是类,那么类的数据类型是什么?就是Class。
当声明一个类时,我们创建了一个Class的实例
如何获取Class实例?
- Type.class
- getClass()
- Class.forName()
Field
通过Class实例获取Field实例
- getField(name)/getFields():获取public的字段,含父类
- getDeclaredField(name)/getDeclaredFields():获取当前类所有字段,不含父类
通过Field实例获取字段信息
- getName
- getType
- getModifiers
通过Field实例读取/设置字段值
- get(obj)
- set(obj, val)
privite
修饰的字段可以用setAccessible(true)
设置为可访问。
Method
通过Class实例获取Method
与Field类似
通过Method实例获取方法信息
- getName
- getReturnType
- getParameterType
- getModifiers
通过Method实例调用方法
- invoke(obj)
- invoke(obj, args…)
privite
修饰的方法可以用setAccessible(true)
设置为可访问。
Constructor
通过Class实例获取Constructor
与Field类似,无父类的Constructor
privite
修饰的Constructor可以用setAccessible(true)
设置为可访问。
其他
- getSuperClass:获取父类,Object、interface返回null
- getInterfaces:返回直接实现的接口数组
- isAssignableFrom:判断向上转型是否成立
annotation
- isAnnotationPresent(class):判断annotation是否存在
- getAnnotation(class):取得annotation,不存在返回null
泛型?
编写模板代码来适应任意类型
1 | ArrayList<T> |
编写泛型
先定义泛型类型<T>
1 | public Pair<T> { |
静态方法不能引用<T>
,应新建一个泛型<K>
1 | public static <K> Pair<K> create(K first, K second) { |
EOF