一直想专门写个Spring源码的博客,工作了,可以全身性的投入到互联网行业中。虽然加班很严重,但是依然很开心。趁着凌晨有时间,总结总结。
首先spring,相信大家都很熟悉了。
1、轻量级 零配置,API使用简单
2、面向Bean 只需要编写普通的Bean(一个Bean代表一个对象)
3、松耦合 充分利用AOP思想 )(各自可以独立开发,然后整合起来运行)
4、万能胶 与主流框架无缝集成 (Mybatis dubbo等等 )
5、设计模式 将Java中经典的设计模式运用的淋漓尽致
Spring解决企业级应用开发的负责设计,简化开发。
1,基于POJO的清理爱你国际和最小侵入性(代码的嵌套,独自开发合起来运行)
2,通过依赖注入和面向接口松耦合
3、基于切面(典型的事务管理!!日志)和惯性进行声明式编程
4、通过切面和模板减少版式代码
主要通过,面向Bean、依赖注入以及面向切面三种方式达成
Spring提供了IOC容器,通过配置文件或者注解的方式来管理对象之间的依赖关系
A a = new A()//实例化后用一个变量保存下来(匿名对象) ——————》Spring用IOC容器 存储起来~
a.c() //必须初始化才运行 ———————–> Spring帮忙初始化,实例化(控制器给了spring)
最终实现了 依赖注入:
@autowrite Interfa A a //自动吧他的实现类注入进来
@Resource(”aa”)//IOC容器种类的id为”aa”的对象自动注入到这里
@autowrite A a //根据类型自动注入
Spring的注入方式
1、 setter
2、 构造方法
3、强制赋值
面向切面,AOP核心思想–解耦! 把一个整体拆开,分别开发,发布时候,再组装到一起运行,切面就是规则!
比如 事务;
开启事务 执行事务 事务回滚 关闭事务 这就是规则!!!!!!
这种有规律的,就可以认为他是固定的,可以单独拿出来开发设计,作为一个模块(比如日志啊)。
AOP就是个编程思想而已
关于Spring的使用,特点,网上资料很多,大家可以自己找找学习下。本博客主要对于源码进行解读。
在典型的面型对象开发方式中,可能要将日志记录语句放在所有方法和Java类种才能实现日志功能。而在AOP方式中,可以反过来将日志服务模块化,并以声明的方式将他们应用到需要日志的组件上。Java类不需要知道日志服务的存在,也不想需要考虑相关的代码。
AOP的功能完全集成到了Spring事务管理、日志和其他各种特性的上下文中
authentication权限认证
Logging日志
Transctions Manager事务
Lazy Loading懒加载
Contex Process 上下文处理
Error Handler 错误跟踪(异常捕获机制)
Cache缓存
1、除了AOP以外的设计模式
a、 代理模式
b、工厂模式
c、单例模式
d、委派模式
e、策略模式
f、策略模式
g、原型模式
代理模式原理:
1、拿到被代理对象的引用,然后获取它的接口
2、JDK代理重新生成一个类,同时实现我们给的代理对象所实现的接口
3、把代理对象的引用拿到
4、重新动态生成一个class字节码
5、编译
动态代理 调用哪个方法就代理哪个方法
整个类 生成一个新 的类
大家认真仔细研究好代理模式,代理模式在Spring中 应用非常广泛!!!
JDK代理模式实现:
1、定义接口
2、定义实现接口的类
3、 代理类 ,代理类需要实现 InvocationHandler 接口,然后实现 invoke方法
回顾一下,满足代理模式应用场景的三个必要条件,穷取法 1、两个角色:执行者、被代理对象 2、注重过程,必须要做,被代理对象没时间做或者不想做(怕羞羞),不专业 3、执行者必须拿到被代理对象的个人资料(执行者持有被代理对象的引用)
例:定义Persion接口
实现这个接口
代理类
测试:
也可以不用 JDK的任何东西 自己实现动态代理!!
不用jdk的任何东西!
首先规定有个InvocationHandler 有个 invoke方法
实现个Proxy 里面有 InvocationHandler引用 有 newInstance的方法 classloader方法
classloader类
代理类媒婆 必须实现这个类
注意 Java中 $符号的 约定俗成 被代理的类
JDK 必须 实现接口!!!!
满足代理模式应用场景的三个必要条件,
1、需要有两个角色 执行者 和 被代理对象
2、注重过程,必须要做,被代理对象不做
3、执行者必须拿到被代理对象的资料(执行者持有被代理对象的引用)
代理模式总结到底层就是: 字节码重组! (字节码重组时候 对象要强制转换,必须要实现一个接口)
Java源代码—>编译—->字节码(在原始的加了东西)–>加载到jvm中
然后 cglib不需要,Spring主要用的cglib做动态代理 定义一个类 自动生成一个类 自动继承这个类 子类引用指向父类 看下面:
(同样做了字节码重组 事情)
是继承关系
定义代理类:
测试类
代理可以实现 在每一个方法调用之前加一些代码,方法嗲用之后加一些代码
AOP: 事务代理、 日志监听
Service方法 开启一个事务 事务的执行是由我们自己的代码完成的
1、监听到是否有异常,可能需要根据异常的类型来决定这个事务是否好回滚or继续提交?(commit or rollback?)
2、事务要关闭掉
通过动态代理给加了代码
Original: https://www.cnblogs.com/langtianya/p/10206884.html
Author: jack_ou
Title: Spring源码分析 之浅谈设计模式
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541592/
转载文章受原作者版权保护。转载请注明原作者出处!