数据库表的范式
第一范式*(确保每列保持原子性)
第一范式需要数据库表中的所有字段值都是不可分解的原子值。
后端对于一个数据可以直接拿来用,而不需要拆分或者转换。
第二范式(确保表中的每列都和主键相关)
第二范式需要确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
第三范式(确保每列都和主键列直接相关,而不是间接相关)
拆,表中没有冗余数据
分为jvm使用的类加载器,程序员使用的类加载器
一。jvm使用的类加载器
启动类加载器(Bootstrap Class Loader):负责加载Java核心类,如
java.lang包中的类。
扩展类加载器(Extension Class Loader):
-
负责加载Java扩展库中的类,通常从jre/lib/ext
二。程序员使用的类加载器
应用程序类加载器(Application Class Loader):
-
负责加载应用程序类路径(classpath)中的类。
-
是大多数Java应用程序的默认类加载器。
-
它加载你自己编写的Java类以及使用的第三方库。
-
对于普通的Java应用程序来说,应用程序类加载器通常是最重要的类加载器,因为它加载了程序的核心逻辑。
自定义类加载器(Custom Class Loader):
-
自定义类加载器允许开发人员编写自己的类加载逻辑,以满足特定的需求。
-
通过继承java.lang.ClassLoader
-
自定义类加载器在一些高级应用场景中非常重要,例如应用服务器、插件系统、模块化应用等。
下面是jvm加载启动类加载器,扩展类加载器,应用程序类加载器
public class Launcher {
private static Launcher launcher = new Launcher();
private static String bootClassPath =
System.getProperty("sun.boot.class.path");
public static Launcher getLauncher() {
return launcher;
}
private ClassLoader loader;
public Launcher() {
// Create the extension class loader
ClassLoader extcl;
try {
extcl = ExtClassLoader.getExtClassLoader();
} catch (IOException e) {
throw new InternalError(
"Could not create extension class loader", e);
}
// Now create the class loader to use to launch the application try { loader = AppClassLoader.getAppClassLoader(extcl); } catch (IOException e) { throw new InternalError( "Could not create application class loader", e); } //设置AppClassLoader为线程上下文类加载器 Thread.currentThread().setContextClassLoader(loader);
}
使用类加载器(应用程序类加载器)
(1)加载类文件
(2)加载资源文件
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//参考上文往线程中添加的类加载器,获得是应用程序类加载器。
InputStream inputStream = classLoader.getResourceAsStream("myconfig.xml");
Thread.currentThread().getContextClassLoader() 方法通常会返回当前线程的上下文类加载器,而通常情况下,这个上下文类加载器就是由JVM创建的应用程序类加载器(Application Class Loader)。应用程序类加载器(也称为系统类加载器)是在JVM启动时创建的,它负责加载应用程序类路径(classpath)中的类。