Spring

Spring是什么?

是一个开源的、用于简化企业级应用开发的应用开发框架。
a.简化开发:
Spring框架对很多常用的api做了简化,比如,使用Spring jdbc
(Spring jdbc是Spring框架中的一个模块)访问数据库,不再需要
考虑如何获取连接、关闭连接、处理异常等等。

b.提高了系统的维护性:
Spring容器(Spring框架中的一个模块)帮我们创建对象、并且管理
对象之间依赖关系。这样一来,对象之间的耦合性大大降低,提高
了系统的维护性。

c.可以集成其它的框架:
Spring框架提供了集成其它常用框架的功能,比如,要使用
任务调度功能、就可以将Quartz和Spring进行集成。

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.添加Spring配置文件。

配置文件用来告诉容器,如何创建对象、如何建立对象之间的依赖关系等等。

step3.启动容器。

  /*
     * 启动Spring容器。
     * ApplicationContext是一个接口,定义了Spring
     * 容器的基本功能。
     * ClassPathXmlApplicationContext是一个实现了
     * ApplicationContext接口的类,该类会依据类路径
     * 来查找Spring配置文件,然后启动容器。
     */
    ApplicationContext ac = 
        new ClassPathXmlApplicationContext(
                "applicationContext.xml");
    System.out.println("ac:"  + ac);
(3)创建对象

1)方式一 使用无参构造器。

**step1.**为类添加无参构造器(或者缺省构造器)。

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

<!-- 
    使用无参构造器创建对象。
    其中,id属性值要求唯一,class属性要写类的完整的名字。
 -->

**step3.**启动Spring容器,调用容器提供的getBean方法来获得
对象。

Student stu = ac.getBean("stu1",Student.class);

2)方式二 使用静态工厂方法。

<!--
    使用静态工厂方法来创建对象 。
    factory-method属性用来指定静态方法名,
    容器会调用该类的静态方法来创建对象。
    以下配置,容器会调用Calendar.getInstance()
    方法,该方法会返回一个对象。
 -->
<bean id="cal1" class="java.util.Calendar" 
factory-method="getInstance"/>

3)方式三 使用实例工厂方法。

<!-- 
    使用实例工厂方法来创建对象。
    factory-bean属性值是一个bean的id,
    factory-method属性指定方法名。
    以下配置,容器会调用id为cal1的bean的
    getTime方法。
    注:
        bean指的是由容器所管理的对象。
 -->
<bean id="time1" factory-bean="cal1" 
factory-method="getTime"/>

(4)作用域
容器默认情况下,对于某个bean元素,只会创建一个实例。
可以修改bean的作用域,将作用域设置为"prototype",容器 就会创建多个实例。

<!-- 
        scope属性用来设置bean的作用域。
        缺省值是"singleton",只会创建一个实例;
        如果值为"prototype",则会创建多个实例(每调用一次
        getBean方法,就会创建一个)。

        singleton:单例。
        prototype:原型。
-->
<bean id="sb1" class="basic.ScopeBean" 
scope="prototype"/>

(5)生命周期
容器在创建好相应的对象之后,会调用该对象的初始化方法, 在销毁该对象之前,会调用该对象的销毁方法。
可以使用init-method属性和destroy-method属性来指定 初始化方法和销毁方法的名称。

  <!-- 
        scope属性用来设置bean的作用域。
        缺省值是"singleton",只会创建一个实例;
        如果值为"prototype",则会创建多个实例(每调用一次
        getBean方法,就会创建一个)。

        singleton:单例。
        prototype:原型。
     -->
    <bean id="sb1" class="basic.ScopeBean" 
    scope="prototype"/>

    <!--
        init-method属性用于指定初始化方法名。
        destroy-method属性用于指定销毁方法名。
        注:
            容器在删除对象之前,会先调用该对象的
            销毁方法。 
            只有作用域为singleton的bean,销毁方法
            才会执行。
     -->
    <bean id="ms1" class="basic.MessageService" 
    init-method="init" destroy-method="destroy"
    scope="singleton"/>

(6)延迟加载
默认情况下,容器启动之后,会将所有作用域为"singleton"的 bean实例化。
可以将lazy-init属性值设置为true,容器启动之后,不再创建这些 实例了(只有调用了getBean方法才会创建)。

<!-- 
    lazy-init属性用来设置是否延迟加载,
    如果值为true,表示延迟加载。
 -->

<bean id="lb1" class="basic.LazyBean" 
lazy-init="true"/>

IOC和DI

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

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

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

容器可以通过调用set方法或者构造器来建立对象之间的依赖关系。
注:
IOC是目标,DI是手段。

(3)使用set方法来建立依赖关系。

  <!-- 
        配置set方法注入。
        property元素的name属性用于指定set方法名
        (首字母大写,前面添加set),ref属性用于
        指定被注入的bean的id。
     -->
    <bean id="a1" class="ioc.A">
        <property name="b" ref="b1"/>
    </bean>

(4)使用构造器来注入

   <bean id="wt1" class="ioc.Waiter"/>
    <!-- 
        配置构造器注入。
        constructor-arg的index属性用来指定参数的下标,
        ref属性用来指定被注入的bean的id。
     -->
    <bean id="rest1" class="ioc.Restaurant">
        <constructor-arg index="0" ref="wt1"/>
    </bean>

(5)自动装配

a.自动装配指的是,容器按照某种规则,自动建立对象之间的依赖关系。
即不用明确指定被注入的bean的id。
容器底层仍然需要调用set方法或者构造器来完成依赖关系的建立。

b.容器默认情况下,是不会自动装配的。

  <bean id="eg1" class="autowire.Enginee"/>
    <!-- 
        autowire属性用于指定自动装配的方式,有三个值:
        byName: 
            容器以属性名作为bean的id来查找对应的
            bean,找到之后,调用set方法来完成注入。
            注:
                如果找不到对应的bean,则不注入。
        byType:
            容器以属性类型作为bean的类型来查找对应的
            bean,找到之后,调用set方法来完成注入。
            注:
                如果找不到对应的bean,则不注入。
                如果找到多个,则会出错。
        constructor:
            类似byType,只不过调用构造器来完成注入。
     -->
    <bean id="car" class="autowire.Car" 
    autowire="byType"/>

(6)注入基本类型的值

    <!-- 
        注入基本类型的值(包括String),使用
        value属性。
     -->
<bean id="v
b1" class="value.ValueBean">
        <property name="name" value="花花"/>
        <property name="age" value="20"/>
    </bean>

(7)注入集合类型的值

  <bean id="vb1" class="value.ValueBean">
        <property name="name" value="鲁班"/>
        <property name="age" value="20"/>
        <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="60"/>
                <entry key="math" value="1"/>
            </map>
        </property>
        <property name="db">
            <props>
                <prop key="username">Tom</prop>
                <prop key="password">1234</prop>
            </props>
        </property>
    </bean>

若list中装的是对象,<ref  bean=“该对象的id”/>

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

 <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="90"/>
        <entry key="math" value="80"/>
    </util:map>
    <util:properties id="dbBean">
        <prop key="username">Sally</prop>
        <prop key="password">test</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>

(9)读取properties文件的内容

 <!-- 
        读取.properties文件的内容。
        location属性指定properties文件的位置,
        容器会读取指定文件的内容,然后将这些内容添加到了
        Properties对象里面。
     -->
     <util:properties id="config" 
     location="classpath:config.properties"/>

(10)Spring表达式
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值