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代理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容