关键字:AOP面向切面,IOC控制反转(依赖注入和控制反转是同一件事的不同角度描述),配置文件和注解(自定义),工厂。
在遥远的过去,没有桌子的概念,吃东西都是拿在手上吃,食物也是现烤现吃。
后来有了桌子,可以把饭菜放在桌子上慢慢吃。烧饭的时候烧饭,吃饭的时候吃饭,而不是混在一起。
桌子(内存)
就像内存,过去电脑内存偏小所以没有实现spring这种写法(大概)。
Spring的概念就是将所有饭菜烧好放在桌子上,想吃什么就吃什么。
菜单(配置文件)
注入是从配置文件注入,配置了哪些内容就创建哪些内容,通过dom4j读取,保存到内存。
dom4j读取流,然后通过标签和属性去找数据;
并没有什么神秘的,如果自己写的话可以自定义标签和属性的名字,套用spring框架就需要用特定的名字。
注解就是变种的配置文件而已,每个注解都有对应的配置文件属性。
厨房(工厂类,反射)
只需要给厨房一个菜单,他就能把菜全烧好端上来;
菜是怎么被厨房烧出来的?使用工厂来通过反射技术来生成对象。
工厂模式:个人理解就是你传一个东西进去,它再给你吐另一个东西出来。
先看菜单:厨房怎么看菜单呢?解析xml或者注解。
再炒菜(反射):只需要一个名字就可以实例化对象,这个名字一般写在配置文件xml里,例:com.XXX.user,在使用方法Class.forName(“全限定类名”)。
上菜(初始化):厨房做好菜就该上菜了;将初始化好的类存到内存,就是存到一个map里。
(当你接触了Spring后你会发现到处都是map,一般保存到内存里用的都是map)
大概套路如下图,spring源码可能会跟精妙一点。
这是一个bean.xml配置文件
旋转大桌(IOC控制反转)
就是将饭菜烧好放在桌上的操作,怎么理解呢?注入就是将饭菜放在桌上,控制反转呢,原来菜是拿在人手上的,就像野餐一边烤一边吃,现在菜都在桌上,桌子开始转了,桌子(IOC容器)来控制菜,你要什么它会转给你。(真的是遍历了一遍找到想要的)
控制反转和依赖注入说的是同一件事,但是是两个角度。
IOC思想下我们不需要去new对象了,对象都在桌上(内存)了,解决了对象直接耦合的问题,使用时直接调用接口,实现类已经保存在缓存中,使用时自动去查找;同一个接口有多个实现类会怎么样?会报错,需要用注解指定用哪个实现类。
不用new对象大卷饼(AOP面向切面)
桌上有些菜直接吃味道太重了,这是要就需要一张卷饼,把菜卷起来吃,像烤鸭,吃烤肉的时候也用生菜;在spring中也有很多方法“味道太重”,需要事务处理,需要权限判断;这时候通过代理的方式,在方法首尾增加代码强化方法。
入参是一个方法类,使用代理后再直接使用即可。
OOP和AOP的关系:OOP就像鸳鸯火锅,你要吃辣的就从辣锅里捞,吃不辣的就从清汤锅里捞,捞出来的菜都继承了锅里的味道。OOP是一种垂直继承体系,解决的是代码重复的问题,特征是封装,继承,多态。(当然也可以用传统的方式理解,狗的父类是动物,会吃会睡,所以狗也会吃会睡)
OOP可以解决大多数代码重复问题,但是头尾同时出现重复代码就不好解决了(横切逻辑代码重复),这时候就要用到AOP。
抬杠:我在头尾调用工具类写好的方法不就好了?那样做的话工作量也很大,改起来相当麻烦。
有个疑问:为什么jdk原生的代理方法没有Cjlib功能强大,但是spring框架还是保留了,就不能全部用Cjlib吗?
网友评论