【Spring】Spring源码分析–整体架构

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

Spring 框架的官方图片

20191102100536\_1.png

这张图信息很有限, 只是描述了下spring 框架的modules,

核心部分

  1. Beans
  2. core
  3. context
  4. Expression Language

官方描述

Core 和 Beans 两个模块 提供了框架的基本支持, 主要包含了 IOC (控制反转) 和 DI (依赖注入) 特性, BeanFacotry 作为工厂模式的超级接口, 耦合低

总而言之: core 和 beans 主要控制了Object 的构成, 无论是自身还是依赖, 一切都是以此为基础的。

Context 模块 在 core 和 beans 两个模块基础之上构建, 继承了beans模块特性, 并且添加了国际化支持,事件传播,资源加载, 开发式的上下文构建, 还支持 J2EE 特性,如EJB,JMX,还有基本的远程调用, 超级接口 ApplicationContext

Expression Language 表达式支持, 这个主要就是用来支持一些spring XML 配置文件表达式 和 注解中一些表达式解析,让配置有动态特性

总览设计

系统最基础模块就是core 和 beans,由此可见控制一个bean的构成对于一个容器框架的总要性,至于context
应用对象的载体

其实从总体来看的话一切就变的有条理,细节再深入

由spring的版本来看一些问题, 大概在spring2.5 之前spring都是以单独模块发布的 (具体不明确), 直接一个spring.jar,但是在spring2.5 之后spring更加详细的划分为以上的moduels发布,由此对于JAR包的分割也值得我们更加的细化了解框架结构, 还是值得思考和学习的

在我看来就是功能更加细化, 各个部分的依赖关系明确,为spring的良好的结构和扩展打下坚实的基础

spring core 的包分布

  1. asm class级别操作

  2. cglib 代理生成

  3. core 这个是核心部分

  4. utils 工具类集合, 大量的UTILS 别再造轮子了

    核心部分的设计当然是我最关心的, 到底哪些功能可以被划分到核心功能里面呢? 我自己也是带着这样的疑问去看的

    首先看core 下面的包分布

  5. annotation (一些注解支持)

  6. covert (转换器 — 一些基本的基本底层的转换器支持)

  7. enums(废弃)

  8. env (环境运行配置信息 — 这当然是非常必要的)

  9. io (用于加载框架使用的不同资源)

  10. serializer 序列化 必不可少 可归纳为特殊工具

  11. style (对象的格式化输出 / 没有看到太多的实现 可归类为特殊工具)

  12. task 任务调度

  13. type 对于BEAN 的定义class进行一个元数据分析(用于细粒度的控制)

    看看核心部分定义了那些超级接口, 这个最方便的是查看API 文档 (学会使用API文档对我们理解一个框架构成非常重要)

    1. AliasRegistry 别名管理 如果是我的话可能就把这个扔到context包中了
    2. AttributeAccessor 对于对象元数据的访问
    3. ErrorCoded 异常码 原来spring也有这东西, 哎 我还不知道
    4. ControlFlow 调用栈信息
      PS 原来是这样访问当前调用栈信息的 new Throwable().getStackTrace(); 有点意外
    5. InfrastructureProxy 获取代理对象
    6. ParameterNameDiscoverer 抓取方法和构造器的参数名称 — 咋做到的 我看到了在Aop中使用了他
    7. ordered bean 优先级
    8. PriorityOrdered 优先执行 PS : 想看看spring优先执行了那些 看看他的实现类吧

    还有个子包下面都是和自身有关的接口定义

总体来说,spring core 主要还是负责环境配置信息,资源访问,type的元数据 不多 但是体现了这些在框架中的的重要性

spring Beans 的包结构

包结构比较简单 核心在Facotry , 其他不列 功能明确 工厂, 当然核心也是这里,其实这里也能让你感觉到IOC/DI 和工厂的一些联系

关键的类


    public class BeanWrapperImpl extends AbstractPropertyAccessor implements BeanWrapper

SPRING BEAN 有那些? 生命周期
InitializingBean,DisposableBean 生产和销毁
#JSR-250 @PostConstruct @PreDestroy 分别对应着 InitializingBean afterPropertiesSet 和 DisposableBean destroy 两个方法
FactoryBean 经过加工修饰的BEAN / 一个BEAN 两个对象可以切换引用 具体使用查看相关文档

SPRING CONTEXT 精力有限 , 关注一些扩展点

==================================
事件扩展点, 事件本身能为项目带来解耦, 或者可以让业务划分为主业务和旁支业务, 保证最终一致性即可 如果是在分布式的环境中还可以和消息驱动结合起来

ApplicationEvent (定义) , ApplicationEventPublisherAware(发布) ,ApplicationListener (监听)

================================== 容器中BEAN 的创建的拦截处理
BeanPostProcessor , InitializingBean

================================== Factory 构建拦截
BeanFactoryPostProcessor

================================== I18N 支持
MessageSource

欢迎关注公众号:

20191102100536\_2.png


来源:http://ddrv.cn

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » 【Spring】Spring源码分析–整体架构

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏