第二章:第一个Spring程序

1. Spring介绍

       首先需要认识一下Spring的官网spring.io,我们可以通过官网的介绍了解到,Spring现在不仅仅只是一个框架,已经发展到是一个生态体系,提供了生产开发中的各种解决方案。

2. 在Maven中引入Spring依赖

        如果需要开发Spring,我们需要引入Spring上下文依赖,引入依赖如下所示。

#设置pom依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.1.4.RELEASE</version>
</dependency>

        Spring配置文件是构建Spring的基础,配置文件的要求如下:

  • 配置文件的放置位置:任意位置,没有硬性的要求(因为在构造工厂的时候,需要指定配置文件的路径和文件名)。
  • 配置文件的文件命名也没有要求,见名知义,我们一般建议命名为applicationContext.xml。
    在付费版的IDEA里面,新建文件时,可以选择XML Configuration File中的Spring Config。

3. Spring的核心API

  • ApplicationContex
            Spring提供的ApplicationContex这个类作为工厂,用于对象的创建,其中ApplicationContex是一个接口类型,它有两个子类,一个是ClassPathXmlApplicationContext(主要用于main函数,和Unit里面),另一个是XmlWebApplicationContext,用于web环境。在Spring中,工厂类负责Spring中对象的创建和获取,所以工厂是一个重量级的资源(在这里重量级的意思是,该对象占有内存较多),所以在开发时,该对象一般只创建一个,并且该对象为了实现单个对象被其它线程重复访问,所以该对象也是线程安全的。
这里有两点需要说明:
1. ClassPathXmlApplicationContext这个类在org.springframework.context包中。
2. XmlWebApplicationContext这个类在org.springframework.web.context包中。

4. 使用Spring工厂创建对象的步骤

        在以前我们都会使用new的方式来创建对象,这种方式会造成代码硬编码到程序中,会造成程序间的耦合,所以我们用Spring来创建对象,管理对象可以减少耦合。
        利用Spring进行程序开发的步骤如下:

1. 创建一个Person类。
2. 配置文件的配置,交由Spring创建对象:
<bean id="person" class="x.x.Person"/>
3. 创建工厂
ApplicationContext ctx = new ClassPathXmlApplicationContext("/application.xml");
4. 通过工厂来获取Spring为我们创建的对象
Person person = (Person)ctx.getBean("person");

5. 细节分析

  • 名词解释
    Spring工厂创建的对象,叫做bean或者组件(Component)
  • Spring工厂的相关方法
// 通过这种方式获得对象,就不需要强制类型转换
Person person = ctx.getBean("person",Person.class);

// 当前Spring的配置文件中,只能有一个<bean calss>是Person的类型。
// 这种方式不写bean的id <bean class="x.x.Person"/>
Person person = ctx.getBean(Person.class)

// 获取的是Spring工厂配置文件中,所以bean标签的id值
String[] beanDefinitionNames=ctx.getBeanDefinitionNames();

// 根据类型获取Spring配置文件中对应的id值
String[] beanNamesForType=ctx.getBeanNamesForType(Person.class);

// 用于判断是否存在指定id值的bean
boolean b = ctx.containsBeanDefinition("a");

// 用于判断是否存在指定id值的bean
boolean b = ctx.containsBean("person");
  • 配置文件中需要注意的细节
1. 只配置class属性
<bean class="x.x.Person"/>
// 上述写法,Spring会分配一个id值为x.x.Person#0
// 如果bean只需要使用一次,那么久可以省略id值,如果这个bean会使用多次,或者被其它bean引用则需要设置id值

2. name属性
name用于Spring的配置文件中,可以为bean对象定义别名。
当我们调用:
ctx.getBean("id|name")都可以获取对象
<bean id="" class=""/>等效于<bean name="" class=""/>

        当然id属性和name属性存在一点的区别:

  1. 别名可以定义多个,但是id属性只能有一个值。
  2. 写法的要求,xml中id属性的值,命名要求,必须以字母开头,字符数字下划线组成,不能以特殊字符开头,如/person。
  3. 写法的要求,在xml中name属性的值,写法并没有要求,/person是可以的。
  4. 由于xml技术的发展现状,id属性的写法限制已经不存在了,可以有一些特殊的写法。
  5. ctx.containsBeanDefinition("person")表示判断是否存在指定的id值的bean,ctx.containsBean("p")除了判断是否指定id的bean,也可以判断name的值。

6. Spring工程的底层实现原理

        Spring工厂可以创建对象,我们可以把Spring想想一个对象容器,之前创建对象,需要在代码中硬编码,有了Spring后,由配置文件配置对象,Spring创建对象后,并存储在Spring中。有了Spring后,我们的开发过程可以分为3步:

// 1. 定义需要创建的类
public class Account implements Serializable {
    private String name;
    private String password;
    public String getName() {
        return name;
    }
    public String setName(String name) {
        this.name  = name;
    }
    public String getPassword() {
        return password;
    }
    public String setPassword(String password) {
        this.password = passwordl;
    }
}

// 2. 配置Spring文件,applicationContext.xml文件
<bean id="account" class="x.x.Account"/>

// 3. 由Spring工厂创建对象
ApplicationContext ctx = new ClassPathXmlApplication("/applicationContext.xml");
Account account = ctx.getBean("account");

        上述的步骤,在Spring的中,可以概括为。

1. 通过ClassPathXmlApplication类,读取applicationContext.xml配置文件。
2. Spring获取配置中id的值,和class的值。
3. 通过反射Class<?> clazz = Class.forName(class的值);
4. 通过反射创建对象 id的值 = clazz.newInstance();

        这里我们会有一个问题,未来的开发中,我们能否把所有的对象创建权利交给Spring呢?理论上是的,但是我们在开发项目中,实体对象(entity)是需要交由持久层框架创建的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容