美文网首页程序员
春天的故事(1)-春天里

春天的故事(1)-春天里

作者: 双鱼座的牛 | 来源:发表于2017-07-25 00:18 被阅读0次

环境搭建

Spring应该是目前在java企业级开发中使用最广泛的一个框架了,甚至已经可以说是java企业级开发的一个事实上的标准,它为解决企业级开发的复杂性提供了丰富的功能,所以,深入了解这个框架,并且做到知其然并知其所以然是非常有必要的,而阅读源码则是一个捷径。

Spring的源码使用Gradle构建,并且版本4之后使用的java8的特性,所以需要在计算机上安装1.8版本的java环境及Gradle的构建工具。

Gradle是一个类似maven的构建工具,他是用了Groovy来编辑构建脚本,他可以从https://gradle.org/现在,约60多mb,下载后放到指定位置,配置环境变量即可。

Spring的源码存放的地址为Spring-Framework,可使用git命令进行下载:

git clone https://github.com/spring-projects/spring-framework.git

下载完成后不能直接打开,不过好在有一个帮助文档,我是使用的IntelliJ IDEA来打开的,好在提供了一个Idea导入的帮助文档:

通过里边的内容可知,首先需进行预编译,即打开cmd,到spring源码的目录后输入:

gradlew.bat cleanIdea :spring-oxm:compileTestJava

需要进行漫长的等待,我的计算机使用了大概20多分钟:

然后使用idea导入项目,选择gradle项目即可,导入后的目录如下:

好,下面让我们来开启一段春天的旅行。

旅行开启

学习Spring,当然要从最简单最核心的Bean开始,这是一个非常简单的例子,甚至它比官网的类还要简单,首先是一个Bean定义:

@Component
public class TestBean {
    private String testStr="Hello World";
    public String getTestStr(){
        return testStr;
    }
    public void setTestStr(String testStr){
        this.testStr=testStr;
    }
}

这个bean没有任何的特别之处,的确,这也是符合Spring框架的基本原则之一:

使用基本的POJO进行轻量级和最小侵入式的开发。

如果说这个类还有和普通JavaBean的不同之处,那就是Component注解了,它用来声明这是一个组件类,即对Bean的声明。甚至这个注解也可以省略,但是我实在不喜欢又臭又长的xml文件,所以,至少对于Spring的业务配置来说,我还是只考虑注解配置。

接下来就是一个配置类:

@Configuration
@ComponentScan
public class BeanFactoryTest {
    public static void main(String []args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(BeanFactoryTest.class);
        TestBean tb = ac.getBean("testBean", TestBean.class);
        System.out.println(tb.getTestStr());
    }
}

好了,你可能觉得太简单,可能觉得还有什么更加看上去复杂,高大上的东西,但是,很遗憾,真没了,Spring的一个入门实例已经结束,试着运行一下:

很明显,这是一个一目了然的代码,如果不报错,那么输出一定会是testStr的值,即"Hello World"

在项目中,使用BeanFactory接口的情况并不多见,至少我一次都没见过,一般来说大多数使用的都是他的子接口ApplicationContext,这里只是用于测试。

不管对于这个小例子有多么的不屑,他都是一个对于Spring框架的使用案例,并且也可以算是实现了Bean的使用与创建的解耦。
下面让我们分析一下这个框架为我们完成了什么工作,我想,对于Java语言有一定基础的人,一定可以猜出来,他完成功能也就无非是以下几点:

  1. 获取配置类
  2. 扫描基础包内所有的组件(无参数表示以配置类所在的包为基础包)
  3. 找到组件后,以类名首字母小写的形式命名并保存
  4. 根据名字获取对应类的实例
  5. 调用实例

即如果仅仅从功能实现的方面来考虑,仅仅两个类就足够了,即:

  1. 反射工具类(注解操作类):查询并保存所有的组件,并进行反射实例化
  2. AppContext类:用于对反射工具类的操作串联。

如果是真的是这样,那么这就是一个人人都可以写出来的操作工具库,但是,作为一个已经成为企业级开发事实上标准的优秀框架来说,真的是这么简单么?

内容梳理

为了回答这个问题,我们先从第一个实例化的类开始:

AnnotationConfigApplicationContext

通常,对于Spring这种优秀的代码,梳理清楚它的继承结构和聚合结构,对于类也就可以称得上完全理解,下面是他的继承结构图:

看上去很复杂,我们先看一下代码中的返回接口,即:

ApplicationContext接口

从类图中可以看出,ApplicationContext是Spring的Context的顶级父类,他继承的几个类分别为:

  • BeanFactory:Spring容器访问的根接口,定义了以各种方式获取bean及bean的各种属性
  • ListableBeanFactory:扩展了BeanFactory,定义容器内Bean可枚举列表
  • HierarchicalBeanFactory:扩展了BeanFactory,定义容器内Bean可分层继承
  • ResourceLoader:定义资源读取策略的接口
  • ResourcePatternResolver:通过各种条件匹配资源
  • MessageSource:定义了对消息处理的方法
  • ApplicationEventPublisher:定义了事件发布的功能
  • EnvironmentCapable:定义确定环境的功能
  • ApplicationContext:之上几个接口的综合,即确定环境,发布事件,以及读取资源和操作Bean的功能

注:
BeanFactory及实现是一个典型的工厂模式
ApplicationEventPublisher 使用了Java8的一个新特性,即FunctionalInterface注解,可否认为是混合模式?

弄清楚ApplicationContext的功能,这一块基本就明白了大半,ApplicationContext的直接子接口为ConfigurableApplicationContext,

他的继承关系为:

  • Lifecycle:定义了Spring对象的生命周期,即Start和Stop方法
  • Closeable:定义了数据或资源的释放或销毁方法
  • ConfigurableApplicationContext:配置和管理ApplicationContext,并提供对其进行管理的工具

好,到了这里,舞台已经准备好,那么,作为一场演出,还剩下什么呢?当然是演员了,到了这里,我们的演员(Bean)才姗姗来迟

下面把剩余的几个类简单介绍一下,下一章着重介绍还在拿大牌的演员,Bean

  • AliasRegistry:定义对alias的各种操作
  • ResourceLoader:定义资源读取策略的接口
  • DefaultResourceLoader:资源获取接口(ResourceLoader)的一个默认实现
  • AnnotationConfigRegistry:定义应用上下文的注解配置的功用接口,提供注册一个注解类和扫描包方法的定义
  • AbstractApplicationContext:通过模板方法模式对ApplicationContext接口进行一个抽象的实现,并不指定配置的类型。
  • BeanDefinitionRegistry:定义对BeanDefinition的各种增删改的操作(BeanDefinition用来描述一个Bean实例)
  • GenericApplicationContext:一个通用的应用实现,其他的实现一般继承此类
  • AnnotationConfigApplicationContext:综上功能,基于注解配置的应用实现

相关文章

  • 春天的故事(1)-春天里

    环境搭建 Spring应该是目前在java企业级开发中使用最广泛的一个框架了,甚至已经可以说是java企业级开发的...

  • 春天里的故事(1)

    春寒料峭,芽绽柳梢。 梅开如雪,野蜂环绕。

  • 爱在春天

    我爱春天 我爱春天 我爱春天 我爱春天花会开 我爱春天里的故事 我爱春天里的美好 我爱春天里的风吹雨打 我爱春天里...

  • 春天的花事2019

    春天里故事总是有很多。

  • 春天里

    春天是初始的季节 生命从这里起步 春天里冰雪消融 春天里流水潺潺 春天里种子发芽 春天里绿草茵茵 春天里杨柳依依 ...

  • 春天里的故事

    这个春天, 有一个大海为我融化, 这时我只想 遇见一朵小小的浪花。 她欢腾的跃起, 然后轻盈的落下。 沙滩里藏着我...

  • 春天里的故事

    春天是属于儿童的季节。 已临仲春,桃红开满树,柳绿初长芽,玉兰花蕊也在静穆的晨晖里欣欣然睁...

  • 春天里的故事

    文 / 瘦灯 这不是春天的故事。春天的故事歌颂蓬勃的生命和张扬的爱情。这是春天里的故事,它可能会是严酷的、沉重的。...

  • 春天里的故事

    不管你看到“春天里”,想到的是儿歌“春天在哪里呀春天在哪里”,还是汪峰的那首“如果有一天我老无所依请把我埋在埋在春...

  • 春天里的故事

    转瞬间严冬已逝,春天已悄悄地来到人间。春天,是美好的季节,是充满诗情的季节;春天,又意味着一个生机勃勃的...

网友评论

    本文标题:春天的故事(1)-春天里

    本文链接:https://www.haomeiwen.com/subject/ctiikxtx.html