Spring
2021-04-21 22:36:00 0 举报
AI智能生成
spring
作者其他创作
大纲/内容
Spring
IOC
IOC / DI
控制反转 -- 将对象的生命周期以及配置关系交给容器来管理
1. 定义用来描述bean的配置的Java类
2. 解析bean的配置,將bean的配置信息转换为上面的BeanDefinition对象保存在内存中
3. 遍历存放BeanDefinition的HashMap对象,逐条取出BeanDefinition对象,获取bean的配置信息,利用Java的反射机制实例化对象,將实例化后的对象保存在上下文中。
DI
Set注入
构造器注入
接口注入
BeanFactory / ApplicationContext
BeanFactory
BeanFactory是spring中比较原始,比较古老的Factory。
ApplicationContext
Bean的自动装配
事件传递
各种不同应用层的Context实现
@Autowired / @Resource
@Autowired
按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
@Resource
默认按照ByName自动注入@Resource有两个重要的属性:name和type
Bean的生命周期
AOP
基本概念
连接点(Joinpoint)
切点(Pointcut)
增强(Advice)
引介(Introduction)
织入(Weaving)
切面(Aspect)
代理方式
静态代理
AspectJ
编译时增强实现AOP
动态代理
JDK动态代理
原理
1. 根据被代理的接口来动态生成代理类的class文件public final class $Proxy0 extends Proxy implements Interface {....}
2. 使用ClassLoader将字节码文件加载到JVM
调用步骤
1. 通过实现 InvocationHandler 接口 定义增强操作
2. 通过为 Proxy 类指定被代理类的 ClassLoader 对象和 interfaces 来创建动态代理类font color=\"#0076b3\
特点
必须通过接口来实现
CGLIB动态代理
cglib是一个java字节码的生成工具。
1. 动态生成一个被代理类的子类,子类重写被代理的类的所有不是final的方法。
a. 生成代理类的二进制字节码文件;
b. 加载二进制字节码,生成Class对象;
c. 通过反射机制获得实例构造,并创建代理类对象。
2. 在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。
1. 通过实现 MethodInterceptor 接口 定义增强操作
2. 为 Enhancer 指定 被代理类+增强操作实现
3. 通过 enhancer.create() 来创建动态代理类
通过生成子类实现
场景
0 条评论
下一页