Spring源码分析 之浅谈设计模式

一直想专门写个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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java8 Stream 的最佳实践

    java8stream提供了对于集合类的流失处理,其具有以下特点: Lazy Evaluation(长度可以无限) 只能使用一次 内部迭代 Lazy Evaluation类似函数式…

    Java 2023年6月16日
    067
  • HTTPS的实现原理 —- 核心 SSL/TLS协议

    是在应用层和 传输层之间 添加的 安全层(SSL/TLS协议) 端口号:HTTP 默认是 80,HTTPS 默认是 443。 URL 前缀:HTTP 的 URL 前缀是 http:…

    Java 2023年6月6日
    052
  • JavaWeb开发的一些问题

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年5月29日
    063
  • mysql 8.0.28 查询语句执行顺序实测结果

    TL;NRs 根据实测结果,MySQL8.0.28 中 SQL 语句的执行顺序为: (7) SELECT (5) DISTINCT (1) FROM (3) JOIN (2/4) …

    Java 2023年6月9日
    071
  • .Net Core下DllImport使用方法及扩展

    引言​ 在有时候的开发过程中,我们会遇到需要调用系统的API,不巧的是.Net Core可能没办法为我们提供相关的调用方式。那需要如何才能解决这个问题呢?​ 这时候我们就可能会考虑…

    Java 2023年6月15日
    084
  • Linux 运行jar包提示 no main manifest attribute

    解决办法:在pom文件中添加如下依赖 解释: 在sprinboot项目中pom.xml文件加 ****,代表maven打包时会将外部引入的jar包(比如在根目录下或resource…

    Java 2023年6月5日
    087
  • Visual Studio 更新NuGet

    打开Visual Studio(以下简称VS)之后,在上方选项栏找到工具选项,点开之后找到扩展和更新。 在左边找到更新,选择VS库就会看见NuGet 包管理器更新。直接点击更新后会…

    Java 2023年5月29日
    069
  • java集合lis、set、map

    https://www.cnblogs.com/yangliguo/p/7476788.html Original: https://www.cnblogs.com/dongrui…

    Java 2023年5月29日
    057
  • SpringBoot自动装配

    1、SpringBoot自动装配是什么? 关键文件: META-INF/spring.factories 启动器:spring-boot-starter-XXX 文件中的配置的类型…

    Java 2023年6月5日
    090
  • Docker 常用操作

    .Docker的基本操作 1.镜像操作 1.1.镜像名称 首先来看下镜像的名称组成: 镜名称一般分两部分组成:[repository]:[tag]。 在没有指定tag时,默认是la…

    Java 2023年6月7日
    078
  • Docker:Docker基础知识

    docker是什么 docker 是一个基于Go语言的开源应用容器引擎。 docker可以让开发者打包自己的应用到一个轻量级、可移植的容器中,实现容器化。 不同容器内的程序不会相互…

    Java 2023年6月7日
    058
  • Moriis神级遍历!

    Moriis 遍历 Morris 遍历是二叉树遍历的一种方式,传统的递归和非递归遍历的时间复杂的都是O(N),空间复杂度都是O(h)(h为树的高度),而 Morris 遍历可以做到…

    Java 2023年6月8日
    089
  • 万字剖析OpenFeign整合Ribbon实现负载均衡的原理

    大家好,前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理,这篇文章来继续剖析SpringCloud组件原理,来看一看OpenFeign是如何基于Ribb…

    Java 2023年6月16日
    085
  • nginx解决跨域

    摘自:https://juejin.cn/post/6844903942262882318#comment 跨域问题 跨域的定义 同源策略限制了从同一个源加载的文档或脚本如何与来自…

    Java 2023年5月30日
    060
  • 2.搭建一个spring-boot项目(持续更新)

    很多同学在搭建一个springboot项目的时候会遇到很多问题,闲来无事我就自己搭建了一个基础的框架,大家可以自己看看。 框架主要包括: 初始化配置 数据库配置 Mysql myb…

    Java 2023年6月9日
    078
  • Spring系列2:Spring容器基本概念和使用

    本文内容 简单回顾IoC和DI概念 Spring容器的概念 的xml配置和初始化 容器的基本使用 bean的定义和初始化配置 简单理解IoC和DI概念 什么是IoC控制反转? 通俗…

    Java 2023年6月5日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球