小编教您Spring是什么、spring容器、IOC和DI

1.Spring

(1)Spring是什么?

是一个轻量级的、用来简化企业级应用开发的开发框架。

注:

    a.简化开发:

    Spring对常用的api做了简化,比如,使用Spring

    jdbc来访问数据库,就不用再考虑如何获取连接、关闭连接、处理异常等等。

    b.解耦:

    Spring容器(Spring框架的一个模块)帮我们管理

    对象(包括对象的创建及对象之间的依赖关系),

    这样一来,对象之间的耦合度会大大降低,提供高了

    系统的维护性。

    c.集成其它框架:

    Spring可以将其它一些常用的框架集成进来,比如

    可以将Quartz,MyBatis等集成进来。

(2)Spring容器

1)Spring容器是什么?

Spring框架的一个核心模块,用于管理对象。

注:

    管理对象指的是,spring容器会用我们创建对象,

并且建立对象之间的依赖关系。

2)如何启动Spring容器?

step1.导包。

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-webmvc</artifactId>

    <version>3.2.8.RELEASE</version>

</dependency>

step2.添加配置文件(applicationContext.xml)。

将配置文件添加到main/resources下。

step3.启动Spring容器。

ApplicationContext ac =

    new ClassPathXmlApplicationContext(

            "applicationContext.xml");

3)创建对象

a.方式一  使用无参构造器

step1. 给类添加无参构造器(缺省构造器)。

step2.  在配置文件当中,使用bean元素来进行配置。

<!--

    使用无参构造器来创建对象。

    id属性要求唯一。

    class属性指定类名(要写完整的类名)。

    注:

        在spring框架当中,将Spring容器所管理

        的对象称之为一个bean。 

    -->

    <bean id="ap1" class="first.Apple"/>

step3. 启动容器,调用容器提供的getBean方法。

    //通过容器获得对象

    Apple ap1 =

        ac.getBean("ap1",Apple.class);

b.方式二  使用静态工厂方法 (了解)

<!--

    使用静态工厂方法来创建对象。

    factory-method属性用于指定一个静态

    方法(static修饰的方法)。

    注:

      容器会调用指定类的静态方法来创建

    对象。

-->

<bean id="cal1"

class="java.util.Calendar"

factory-method="getInstance"/>

c.方式三  使用实例工厂方法 (了解)

<!--

    使用实例工厂方法来创建对象。

    factory-bean属性指定bean的id,

    factory-method属性指定一个方法。

    注:

        容器会调用该bean的方法来创建一个

        对象。

-->

<bean id="date2" factory-bean="cal1"

factory-method="getTime"/>

4)作用域

a.默认情况下,对于某个bean,容器只会创建一个实例。

b.如果要让容器创建多个实例,需要设置bean的作用域。

<!--

        scope属性用于指定作用域,

        缺省值是singleton,如果将值设置

        为prototype,则容器会创建多个实例。

    -->

    <bean id="eb1"

        class="basic.ExampleBean"

        scope="prototype"/>

5)生命周期

spring容器在创建好对象之后,会调用初始化方法, 在销毁该对象之前,会调用销毁方法。

    <!--

        init-method属性:  指定初始化方法

        destroy-method属性:指定销毁方法。

        注:

            销毁方法只有当作用域为singleton

            才有效。

    -->   

    <bean id="mb1"

    class="basic.MessageBean"

    init-method="init"

    destroy-method="destroy"

    scope="singleton"/>

6)延迟加载

a.默认情况下,容器启动之后,会将所有作用域为singleton的bean实例化。

b.延迟加载指的是,通过设置lazy-init="true"告诉容器, 启动之后不再创建其实例。

    <!--

        lazy-init属性如果值为true,表示

        延迟加载。

    -->

    <bean id="lb1" class="basic.LazyBean"

    lazy-init="true"/>

(3)IOC和DI

1)IOC是什么? (Inversion Of Controll 控制反转)

对象之间的依赖关系应该由容器来建立。

2)DI是什么? (Dependency Injection 依赖注入)

容器通过调用set方法或者构造器来建立对象之间的依赖关系。

注:

    IOC是目标,DI是手段。

3)set方法注入

step1. 为类添加set方法。

step2. 在配置文件当中,使用property元素来配置set 方法注入。

    <!--

        property元素表示采用set方法注入。

        name属性用于指定set方法名

        (容器会将b大写,前面添加set来

        构造方法名)。

        ref属性用于指定被注入的bean的id。

    -->

    <bean id="a1" class="ioc.A">

        <property name="b" ref="b1"/>

    </bean>

step3. 启动容器,调用getBean方法。

3)set方法注入

4)构造器注入

step1. 添加相应的带参的构造器。

step2. 使用<constructor-arg>元素来配置构造器注入。

                   

step3. 启动容器,调用getBean方法。

4)自动装配 (了解)

a.什么是自动装配?

容器依据某些规则,自动查找符合要求的对象,

然后建立对象之间的依赖关系。

注: 容器仍然要调用set方法或者构造器。

b.如何自动装配?

使用autowire属性指定装配的规则:

<bean id="wt1" class="autowire.Waiter"/>

    <!--

        autowire属性表示让容器自动建立

        对象之间的依赖关系,有三个值:

        byName:

            以属性名作为bean的id,查找

            对应的bean,然后调用set方法。

            注:如果找不到对应的bean,

            不会调用set方法。

        byType:

            以属性类型作为bean的类型,查找

            对应的bean,然后调用set方法。

            注:

                如果找不到对应的bean,

                不会调用set方法。

                如果找到多个bean,会出错。

        constructor:

            类似于byType,只不过是调用构造器来

            完成  注入。

    -->

<bean id="rest"

    class="autowire.Restaurant"

    autowire="byType"/>

5)注入基本类型的值

<bean id="vb" class="value.ValueBean">

    <property name="name" value="小包总"/>

    <property name="age" value="20"/>

</bean>

6)注入集合类型的值

a.支持四种集合类型的值的注入,分别是List,Set,Properties,Map。

b.注入方式如下:

    <property name="interest">

            <list>

                <value>打猎</value>

                <value>看书</value>

                <value>编程</value>

                <value>编程</value>

            </list>

        </property>

    <property name="city">

        <set>

            <value>洛阳</value>

            <value>金陵</value>

            <value>开封</value>

        </set>

    </property>

    <property name="score">

        <map>

            <entry key="english"

                value="59.5"/>

            <entry key="math"

                value="17"/>   

        </map>

    </property>

    <property name="db">

        <props>

            <prop key="username">tom</prop>

            <prop key="pwd">1234</prop>

        </props>

    </property>

7)引用的方式注入集合类型的值

    <!--

        将集合类型的值配置成一个bean

    -->

    <util:list id="interestBean">

        <value>打猎</value>

        <value>看书</value>

        <value>编程</value>

    </util:list>

    <util:set id="cityBean">

        <value>北京</value>

        <value>南京</value>

        <value>东京</value>

    </util:set>

    <util:map id="scoreBean">

        <entry key="english" value="80"/>

        <entry key="math" value="90"/>

    </util:map>

    <util:properties id="dbBean">

        <prop key="username">John</prop>

        <prop key="pwd">1234</prop>

    </util:properties>

    <bean id="vb2" class="value.ValueBean">

        <property name="interest"

        ref="interestBean"/>

        <property name="city"

        ref="cityBean"/>

        <property name="score"

        ref="scoreBean"/>

        <property name="db"

        ref="dbBean"/>

    </bean>

8)读取properties文件的内容

    <!--

        读取properties文件的内容。

        location属性用于指定要读取的文件的位置。

        注:

            classpath:表示依据类路径去查找相应的

            文件。

    -->

    <util:properties id="config"

    location="classpath:config.properties"/>

9)spring表达式

a.spring表达式的作用?

可以用来读取其它bean的属性

b.用法如下图:

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

推荐阅读更多精彩内容