1、类的加载机制
1)类加载的触发情况
(1)调用 new 方法
(2)调用 loadclass 方法、forname 方法
(3)访问静态变量或者为静态变量赋值
(4)调用静态方法
(5)通过反射进行创建类的实例
(6)创建其子类的实例
2)类的加载顺序:验证、准备、解析并称为链接;准备步骤有可能在初始化之后(动态绑定机制)
(1)加载:java类加载器通过 完全限定名 的方式查找到对应的在字节码文件( java 编译器编译后生成的 .class 文件),利用字节码文件创建一个 class 对象
(2)验证:检验输入的字节流是否符合虚拟机要求,包含四种验证:文件格式的验证、元数据的验证、字节码的验证、符号引用的验证
(3)准备:为类变量分配内存,并进行初始化默认值;(不包含 final 修饰的、不包含非成员变量)
(4)解析:将常量池中的符号引用转换成直接引用,包含三种解析:类或接口的解析、字段的解析、类方法或接口方法的解析
(5)初始化:为类变量进行初始化
(6)使用:
(7)卸载:也就是销毁
3)双亲委派机制
(1)类加载器:启动类加载器(bootstrap classloader)、扩展类加载器(extensions classloader)、应用类加载器(application classloader)、自定义类加载器
(2)双亲委派机制:一个类要加载时,通过自定义加载器向上找到父加载器,一直找到启动类加载器;如果启动类加载器加载不了,再向下委派,直到被加载
优点: 避免被重复加载;避免 java 核心 API 中定义的类型被随意替换
2、bean的生命周期
1)spring启动,找到并加载spring管理bean,对其进行实例化
2)实例化后,将bean的引用和值注入到bean属性中
3)如果bean实现了 BeanNameAware 接口,则会调用 setBeanName(),设置值为bean的id
4)如果bean实现了 BeanFactoryAware 接口,则会有调用 setBeanFactory(),设置值为指定的Factory容器
5)如果bean实现了 ApplicationContextAware 接口,则会调用 setApplicationContext(),传入上下文引用
6)如果bean实现了 BeanPostProcessor 接口,则会调用 postProcessorBeforeInitialize()
7)如果bean实现了 InitializingBean 接口,则会调用 afterPropertiesSet()
8)如果bean使用 init-method 自定义了初始化方法,则调用自定义初始化方法
9)如果bean实现了 BeanPostProcessor 接口,则会调用 postProcessorAfterInitialize()
10)至此,bean就可以被使用了,被驻留在应用上下文,直到应用上下文被销毁
11)如果bean实现了 DisposableBean 接口,则会调用 destory();如果有使用 destory-method 自定义了销毁方法,也会调用
个人理解: 可分为 实例化(1)、属性注入(2)、设置属性(3、4、5)、初始化(6、7、8、9)、使用(10)、销毁(11)
3、servlet的生命周期
1)装载并实例化 servlet:启动 servlet 容器,容器会查找配置文件,文件中配置了要使用的 servlet ;容器会创建 servlet 实例
2)初始化:init() 方法;只调用一次;客户机访问服务器时才调用,初始化后进入就绪状态
3)使用:service() 方法;可调用多次;
4)销毁:detory() 方法;只调用一次