0%

java-note-1

SSM/SSH框架

SSH是指 Struts2 Spring Hibernate三个框架。SSM是指SpringMVC Spring MyBatis。对于MVC框架,SSH是Structs2做controller,hibernate负责持久化层;SSM是SpringMVC做controller,MyBatis负责持久化层。Structs2是Action级别,SpringMVC是方法级别,更容易实现RESTful风格。

SSM和SSH的共同点:由Spring以来至如DI管理各层组件;使用面向切面编程AOP管理事务、日志、权限等。

后端编程

框架、负载均衡、灾难恢复、缓存、消息、分布式、搜索等。

Java动态代理

  1. 静态代理
  2. JDK动态代理
  3. CGLib动态代理

动态代理是JDK运行期间动态创建class字节码并加载的过程。

为什么要用Java动态代理?

类方法数量越来越多时,静态代理的代码量会十分庞大。

preview

Java动态代理只能对interface进行操作,不能对class操作:

class(非abstract)可以被实例化,interface不能被实例化,所有的interface变量都是通过向上转型并指向某个实例的。Java动态代理机制可以在运行期动态创建interface实例。

在运行期间动态创建一个interface实例:

  1. 定义InvocationHandler实例用于实现接口的方法调用;
  2. 通过Proxy.newProxyInstance()创建interface实例,需要三个参数:
    1. 接口类的ClassLoader;
    2. 需要实现的接口数组;
    3. InvocationHandler实例
  3. 将返回的Object转为接口类型。

动态字节码的生成

字节码

字节码通常指的是已经经过编译,但与特定机器代码无关,需要解释器转译后才能成为机器代码的中间代码。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。 字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机。 维基百科

ASM、CGLib

ASM 框架可以直接操作字节码,动态修改类和方法,CGLib (Code Generation Library,代码生成库) 底层也是由ASM实现。ASM将对代码的操作包装成一个访问者,在解析JVM加载到的字节码时调用。ClassReader 是 ASM 代码的入口,通过它解析二进制字节码,实例化时它时,我们需要传入一个 ClassVisitor,在这个 Visitor 里,我们可以实现 visitMethod() / visitAnnotation() 等方法,用以定义对类结构(如方法、字段、注解)的访问方法。而 ClassWriter 接口继承了 ClassVisitor 接口,我们在实例化类访问器时,将 ClassWriter “注入” 到里面,以实现对类写入的声明。(https://zhenbianshu.github.io/2018/11/control_jvm_byte_code.html)

CGLib 常应用于 AOP 框架,提供方法的拦截,加入相应的业务逻辑代码。

Java是静态语言,放到JVM中运行之前需要先进行编译。