spring的全面概述(process图)
https://www.processon.com/view/5d47d18be4b0f4c23d608454#map
1.Spring概述:
2.spring的体系结构:![图片](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWRlci5zaGltby5pbS9mL0hudWFDTmFkZ3ZVN0NyZk8ucG5nIXRodW1ibmFpbA?x-oss-process=image/format,png)
3.Spring与IoC
3.1 IOC基础概念:
- 普通的代码:需要的时候自己找类,创建对象。是主动的过程。
- **控制反转:(依赖注入)**是指你需要(必须是需要的时候)的时候容器给你注入。**你是被动的,容器的主动的。**这就是控制反转,(也是依赖注入)。
3.2 面试点:IOC和DI是什么关系?什么是控制反转?
**回答:**控制反转是一种概念,一种思想,控制反转的实现方式有很多种,依赖查找,依赖注入等等,而依赖注入是目前最优秀的解耦方式,Spring采用的是依赖注入这种方式。
3.3 springIOC实例:
ApplicationContext是个接口,里边有很多抽象类,有两个实现类:(以下两个实现类)
- ClassPathXmlApplicationContext会在类路径下找这个xml文件;
- FileSystemXmlApplicationContext会在项目的根路径下找这个文件;使用这个类的时候也可以将xml文件放在本地盘符下(test04);但是一般不会这样,一般会选择(test03)的做法;
- 这两个实现类在使用的是时候要注意文件路径。
3.4 Spring的IOC进阶:
视频参考:https://www.bilibili.com/video/av41807620/?p=3
自己实现spring
4.Spring的AOP
详解Spring中的AOP:https://www.cnblogs.com/qf123/p/8671479.html
底层实现:Java的动态代理
5.Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
参考文献:https://blog.csdn.net/luanlouis/article/details/24589193
写的很细
5.1 动态代理原理:
在运行期的代码中生成二进制字节码
由于JVM通过字节码的二进制信息加载类的,那么,如果我们在运行期系统中,遵循Java编译系统组织.class文件的格式和结构,生成相应的二进制数据,然后再把这个二进制数据加载转换成对应的类,这样,就完成了在代码中,动态创建一个类的能力了。
在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码。当前有很多开源框架可以完成这些功能,如ASM,Javassist。
5.2 spring的ASM(字节码生成开源框架)
Java字节码生成开源框架介绍-ASM
https://www.bilibili.com/video/av61177271/
不过ASM在创建class字节码的过程中,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解。
下面通过ASM 生成下面类Programmer的class字节码:
package com.samples;
import java.io.PrintStream;
public class Programmer {
public void code()
{
System.out.println("I'm a Programmer,Just Coding.....");
}
}
使用ASM框架提供了ClassWriter 接口,通过访问者模式进行动态创建class字节码,看下面的例子:
package samples;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
public class MyGenerator {
public static void main(String[] args) throws IOException {
System.out.println();
ClassWriter classWriter = new ClassWriter(0);
// 通过visit方法确定类的头部信息
classWriter.visit(Opcodes.V1_7,// java版本
Opcodes.ACC_PUBLIC,// 类修饰符
"Programmer", // 类的全限定名
null, "java/lang/Object