Spring是什么、spring容器、IOC和DI

2018-12-06 07:33:29来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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>元素来配置构造器注入。

 <bean id="cpu" class="ioc.Cpu"/>
    <!-- 
        constructor-arg元素用来配置构造器
        注入。
        index属性用于指定参数的下标。
        ref属性用于指定被注入的bean的id。
     -->
    <bean id="cp" class="ioc.Computer">
        <constructor-arg index="0" 
        ref="cpu"/>
    </bean>

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.用法如下图:


 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:以面向对象的思想实现数据表的添加和查询,JDBC代码超详细

下一篇:Springboot拦截器未起作用