Spring的IOC、AOP、动态代理等等笔记(全)(面试必备)

spring的全面概述(process图)

https://www.processon.com/view/5d47d18be4b0f4c23d608454#map

1.Spring概述:

图片

2.spring的体系结构:图片

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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值