Spring原理

注解@Aspect,@Transaction 等 用到 动态代理 , JDK动态代理用到 反射

Spring IOC

1.IOC 与 DI 的区别

IOC是DI的原理。DI(依赖注入)是往某个类或方法注入一个值。其中用到的原理就是IOC(控制反转)

DI : 操作层面

IOC:原理层面

IOC的优点 : 降低项目耦合,提高延伸性。

ClassPathXmlApplicationContext是 IOC的核心。

ClassPathXmlApplicationContext 是 AbstractApplicationContext的子类

AbstractApplicationContext 是 ApplicationContext接口的实现

ApplicationContext 里 包含的 ListableBeanFactory 接口 ,是继承了 BeanFactory

BeanFactory  :负责管理Bean的加载,生成,注入等。

ApplicationContext 是整个项目的配置类,Spring项目在启动或运行的时候都需要依赖到它。

2.Spring 启动 初始化Bean 到IOC容器中的BeanFactory, 到注入Bean的过程。

① 启动时初始化IOC容器

ClassPathXmlApplicationContext中,refresh()函数,是调用父类首先首先是  AbstractApplicationContext中的refresh()。refresh()里最核心的方法 :refreshBeanFactory()。

如果已有BeanFactory,先删除所有Bean,然后关闭BeanFactory。

然后创建一个新的 BeanFactory,这个工厂里会 通过 loadBeanDefinitions() 预先加载 xml 配置里 所有的Bean,还有注解 @Bean 的类。

② 注入Bean

通过注解@Autowire 注入对应的Bean ,其实是 从context中获取bean

这个过程是:从  已经加载好所有Bean的 BeanFactory 里遍历,通过 beanName 去找到对应的Bean,然后再 把这个 bean 设置进去。

Spring AOP

1.当一个bean加载到Spring后 ,会执行 自动代理器 的初始化方法 。

2.里边最核心的方法是:wrapIfNecessary(),是AOP的核心流程。

3.首先 从刚加载的Bean中扫描出所有的 advisor,其实就是 我们自定义的 : before(),around() 方法。

4.拿到所有的 advisor 后,调用createProxy(), 创建代理的流程。

5.首先要创建一个proxyFactory 对象。然后把 beanClass,targetSource,advisor 都丢进这个工厂,最后得到一个代理对象。在创建代理对象的时候,用的就是动态代理的来创建的。会判断目标类 是否有实现接口,有责使用JDK代理,没有则使用Cglib代理。

动态代理

Spring 项目中的 注解 ,  @Bean ,@Autowire,@Trasaction ,其实就是 : SpringAOP (切面编程),而SpringAop 底层用的都是 动态代理。

JDK动态代理 :

① 底层是 JAVA反射机制实现的

② 代理类要 实现 InvocationHandler,重写 invoke()方法,每次代理类调用方法的时候,都会默认先经过 invoke()方法。

调用JDK动态代理:

Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), invocationHandler );

Cglib动态代理:

① 底层是asm(java字节码操控框架)

② 代理类 依赖 cglib包下的 methodInterceptor ,实现这个拦截器,每次调用代理类的方法时,都会经过 intercept()方法。

Spring中使用了哪些设计模式

1.简单工厂设计模式

springIOC中的BeanFactory就是简单工厂模式的体现,传入 BeanName 就可以在加载了所有Bean的工厂里找到对应的bean 。

2.单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

springIOC中的BeanFactory就是一个单例的对象。

3. 适配器模式

在SpringAop中,使用的Advice(通知)来增强被代理类的功能。AOP功能的原理就使用动态代理模式对类进行方法级别的增强。就是生成代理类。

4.代理模式

为其他对象提供一种代理以控制对这个对象的访问。SpringAop中使用的 JDK代理,Cglib代理。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容