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