Java基础:类加载机制之加载顺序分析
首先明白类加载三个阶段:加载,连接,初始化。连接阶段还分了三个步骤:验证,准备,解析。
首先明白类加载三个阶段:加载,连接,初始化。连接阶段还分了三个步骤:验证,准备,解析。
Spring Bean在使用之前或使用之后需要做一些操作,Spring对Bean
的生命周期的操作提供了支持。
类加载器就是寻找类的字节码文件并构造出类在JVM内部表示对象的组件。
类加载工作由ClassLoader
及其子类负责。ClassLoader
是一个重要的Java
运行时系统组件,它负责在运行时查找和装入Class
字节码文件。
基于静态代理和动态代理需要绑定接口的局限性,而对类的代理在某些场景下确实是需要的,所以某些大牛就创造了CGLIB
这个动态代理类库。
CGLIB
底层是基本ASM
字节码处理框架,该库允许在程运行时对字节码进行修改和动态生成新的类。
CGLIB
所创建的动态代理对象的性能比JDK
所创建的动态代理对象的性能高(大概10倍),但CGLIB
在创建代理对象时所花费的时间却比JDK
动态代理多(大概8倍)。
对于singleton
的代理对象或者具有实例池的代理,因无须频繁创建对象,比较适用CGLIB
动态代理技术;反之则适合采用JDK
动态代理技术。
JDK 1.3 版本后,Java提供了动态代理技术,允许应用在运行期创建接口的代理对象。
JDK 提供的代理只能针对接口做代理。也有更强大的代理库 cglib
,可以实现对类的代理。
JDK 的 java.lang.reflect
包下提供了一个Proxy
类和一个InvocationHandler
接口,Proxy
类利用InvocationHandler
动态创建一个符合某一接口的代理,生成(运行时)目标类的代理对象。
在普通编程过程中,无须使用动态代理,但在编写框架或底层基础代码时,动态代理的作用就非常大。
静态代理在使用时,需要定义接口
或者父类
,目标对象与代理对象一起实现相同的接口
或者是继承相同父类
。
代理对象通过调用代理对象的方法来调用目标对象的方法;可以在不修改目标对象的前提下,对目标对象的功能进行扩展。
项目中,当需要用到Spring容器本身的功能资源时,Bean就需要知道容器的存在,才能调用 Spring 所提供的资源,而 Spring Aware就是提供这样的功能,原本也是给 Spring 框架内部使用的。
Spring Aware 的目的就是为了让 Bean 获取容器的服务。ApplicationContext
接口集成了MessageSource
接口,ApplicationEventPublisher
接口和ResourceLoader
接口,如果让 Bean 继承 ApplicationContextAware
可以获得 Spring 容器的所有服务,但原则上有用到什么接口,再实现该接口。
JSP 页面中经常用到EL
表达式和JSTL
标签库。
EL
表达式主要作用:获取数据,执行运算,获取Web常用隐式对象。
EL
表达式以${}
结构表示;取值从左到右,如果需要文件${
,在前面加转义符\${
。
四大作用域的作用是为了实现页面和服务器共享数据。
page
:设置的属性令在当前页面有效。实际开发中较少使用,作用域太小了。request
:属性仅在本次请求有效。session
:令在浏览器和服务进行本次会话有效,当和服务器断开后,属性失效。application
:属性在整个WEB应用中都有效,直到服务器停止才失效。实际开发中几乎不使用,作用域太大了。 四大作用域分别都有设置和获取属性的两个方法:setAttribute()
、getAttribute()
项目中对订单号进行重新设计,参考了网上的方案加上自己的思路,根据不同的业务场景进行分析。