Spring源码分析【1.认识Spring】

Spring框架由Rod Johnson创建,旨在简化企业应用开发,提供轻量级控制反转(IoC)和面向切面(AOP)功能。它支持零配置,易于集成各种JavaBean,减少代码耦合,增强测试性。Spring通过依赖注入、切面编程和模板减少样板代码,适用于服务器端及任何Java应用。
摘要由CSDN通过智能技术生成

Spring概念

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
总而言之,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的服务层容器框架

·Spring的优势

1.Spring是轻量级的框架,零配置,Api相对简单
2.面向Bean,你只要会写一个普通的bean就能使用Spring的一些特性
3.松耦合 Spring不需要你关心你任何依赖,充分运用aop思想
4.与其他框架完美兼容 S2,H5,mybats,dubbo等等
5.设计模式的充分运用 工厂 模板 等等完美应用

·Spring设计初始

1.Spring核心是为了拯救j2ee的开发,可以说是java开发的里程碑,这里就可以说说EJB企业系的JAVABean,他对各层的数据交互底层来说就是socket来通讯的,你可以想想一下javaBean的序列化,你需要通过流序列化,然后再反序列化出来,一旦你的序列号发生变动或者你的bean发生了类型改变,包括它的共用代码性都是最致命的,所以Spring最主要就是简化开发

Spring简化采用策略
1.基于pojo的轻量级和最小侵入性编程(拒绝代码你中有我,我中有你,导致无法运行)
2.通过依赖注入和面向接口松耦合(以成员变量来使用代码)
3.基于切面和惯性式声明编程(将代码分割功能等切入,声明式就像事务,和异步运行等等)
4.通过切面和模板减少样板式代码(一次切面编写多个接口适配)

·Spring面向Bean

Bean是什么?Bean就是豆子的意思,JAVA是咖啡,那么豆子都是咖啡豆,是基础,Spring的面向Bean思想就是JAVA的面向对象编程一般,我们的Spring如果说没有这种思想那么它是不成立的,就没有简化开发和模板的意义了。这就是Spring BOP的思想,而最突出Spring管理这些Bean的就是IOC容器了。你可以一眼就知道这个bean再Spring里的作用,从而去管理。

控制反转
举例 需要运用某对象的方法,那么通常方法就是new。那么Spring就提出控制反转的思想,将bean提前初始化放在我这,用时就来拿,所以Spring实例bean后用变量来保存,那么保存这些bean的地址就是Spring著名的容器IOC,就像web容器存放servlet一样,所以IOC最重要的目的就是依赖注入,

·Spring依赖注入

@autowire 可用于注入接口实现类,或者根据其类型注入
@resource(“Mikasa”) A b 将id为Mikasa的b类注入(可以区分父子类)

注入方式
1.getter setter
2.构造器赋值
3.强制赋值(暴力赋值私有变量,有点像暴力反射赋值吧)

依赖注入是有依赖链的,a中有c,c中有d 那么a要用c,d是需要先注入的!但是要小心循环注入!

这里博主强烈推荐构造器constrution注入,减少风险性,确定代码的final性!!!!!!

·Spring的Aop

面向切面的编程方式耳濡目染,前中后环绕异常,切点切面直往等等不详细介绍了。权限,日志,ip记录,白名单,事务。CGLIB代理可以去看下,是aop的核心,这里稍微解释下
jdk代理原理
1.拿到被代理对象的引用,获取接口
2.JDK重新生成类,同时实现代理对象的接口
3.把被代理的对象的引用也拿到
4.重新生成class字节码,并再头文件里记录
5.编译
这里就不拓展了,有兴趣验证的话需要实现InvocationHandler获取被代理对象和其接口(必须要有接口),并需要自己写类加载器findClass将其进入jvm虚拟机后,进行代理来看最终的代理对象,其实屌丝一点说就是字节码重组
CGlIB代理原理(Spring运用广泛)
CGLIB代理,需要代理对象实现MethodInterceptor,代理对象一样需要获取被代理对象,通过Enhancer类(实则CGLIB代理对象与被代理对象是父子关系,需要通过这个类设置父类的字节码,再回调),在是需要实现的方法里进行拦截补充,原理基本和jdk一致,进行字节码重组,博主理解就是简化而已,但不同的是jdk是通过接口进行强制转换,生成的对象 强制转换为接口,而CGLIB是子类重写父类接口方法,生成后强制替换赋值的地址为子类地址,注意代理方法proxy的方法调用!(如果使用invoke那就是循环回调增强方法)因为cglib的proxy是CGLIB new的,就是代理的子类,后续代码会在另贴出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值