前言:作为java开发的背景,接触过很多开源框架。从最初的webwork、struts到现在最流行的spring,我们会发现这些框架的发展都在朝着简化编程和多样化扩展的方向发展。作为其中的佼佼者,spring支持依赖注入、控制系统反转,支持配置文件、注解开发、轻量级接入第三方模块,如JDBC、Log、Cache等。慢慢的经过开发,一个更方便的SpringBoot——约定优于配置的最佳践行者出现了。为春天穿上靴子,大大提高开发效率。在maven工具的帮助下,将以往构建spring框架繁琐的配置文件过程变成了多个maven依赖,实现了近乎0配置。随着互联网技术的发展和各种成熟方案的接入,出现了更加强大和简洁的springcloud框架。作为这些框架的核心,spring的源码完全值得我们去研究。通过这个过程,我们不仅可以学习spring中的代码风格实现逻辑,还可以熟悉spring提供的所有功能,以便以后集成自己的插件。集成spring,排查spring项目问题。spring为我们提供的最重要的功能之一就是上下文管理。通过这个上下文,我们可以对整个应用的bean、环境变量、资源文件信息等进行管理。这是spring中的ApplicationContext接口定义。真正的实现类内部比较复杂,但是我们可以从接口入手,研究上下文为我们提供了哪些功能。EnvironmentCapable接口定义实际上在一个方法中返回当前环境变量。Environment:上下文中的一系列环境资源文件管理器,继承自PropertyResolver。PropertyResolver:资源解析器,提供了一系列资源文件的读取方法,比如通过key获取资源文件的value,通过key和Class信息根据资源文件获取对应的已经初始化的bean。另一个重要的功能是解析占位符“${...}”的信息。ConfigurableEnvironment:继承于Environment接口,可以修改环境的内部配置文件属性,实现区分在线环境的功能。Environment可以理解为一个可以区分配置文件的资源管理器。我们通常使用application-dev.properties、application-pro.properties、dev、pro作为两个环境,而spring只会加载与其相同环境的配置文件,Environment通过profile配置环境。Environment=profile(配置)+propertyResolver(资源解析器);MessageSourcemessageSource接口用于国际化。ApplicationEventPublisher该接口用于推送信息。Spring在应用程序内部实现了消息推送功能。如果只需要做一个简单的原生消息推送功能,可以考虑这种方式。第一步:首先继承ApplicationEvent第二步:注册监听方法第三步:向ResourcePatternResolver资源搜索器发送一个事件,例如提供一个表达式:“classpath:java.lang.”,表示下面的java.lang包应加载类路径以加载资源。该接口继承自ResourceLoader。ResourceLoader解决了从特定路径加载资源的问题,相当于扩展了这个接口的方法。资源(Resource)可以是输入流或文件。ListableBeanFactory和HierarchicalBeanFactory这两个接口有一个共同的接口BeanFactory,为applicationContext提供强大的bean管理能力,包括获取类信息、初始化bean、自动注入等。BeanFactory:定义了一系列获取bean的方法,是最基本的bean容器提供者。ListableBeanFactory:扩展了BeanFactory功能。与直接存储bean相比,该接口提供了一系列的BeanDefinetion访问函数。BeanDefinetion包括类描述、注解信息、是否是代理类、依赖bean。这些函数在bean初始化期间非常有用。HierarchicalBeanFactory:为BeanFactory提供分层功能,可以通过该接口获取父BeanFactory。最基本的applicationContext接口都能定义的这么复杂,不得不佩服这些框架开发者的心思。有了这些基础,spring就可以灵活的扩展各种功能。
