Spring-IOC

109 阅读3分钟

IOC 概念介绍

IOC(控制反转)不是什么技术,而是一种设计思想。它的目的是指导我们设计出更加松耦合的程序。

控制: 指的是控制权,在java中可以简单理解为 对象的控制权限(比如对象的创建、销毁等权限)

反转: 指的是将对象的控制权由原来的 程序员在类中主动控制 反转到 由Spring容器来控制

Bean的懒加载

单例情况下,默认 lazy = false ,也就是容器创建,对象创建;true:第一次获取对象时才创建对象

Bean的作用域

Bean的作用域是指Spring给我们创建出的对象的存活范围(存活周期)。

可以在spring配置文件中通过bean标签中的scope属性来对当前bean对象的作用域进行指定。 scope属性有五个取值:

  • singleton(默认) 创建出的实例为单例模式, IOC只创建一次,然后一直存在
  • prototype 创建出的实例为多例模式, 每次获取bean的时候,IOC都给我们重新创建新对象
  • request(web) web项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
  • session (web) web项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
  • globalSession (用于分布式web开发) 创建的实例绑定全局session对象

Bean的生命周期

Bean对象生命周期指的是Bean创建到销毁的这么一段时间。

spring配置文件中通过bean标签中的

init-method属性:指定bean对象创建之后调用的方法

destroy-method: 指定容器销毁之前调用的方法

Spring中单例对象的生命周期:

  • 出生:IOC容器加载时出生
  • 存活:IOC容器存活(没销毁)时存活
  • 销毁:IOC容器销毁之前销毁

Spring中多例对象的生命周期:

  • 出生:每次getBean()都会创建对象,然后执行init()方法
  • 存活:一直存活
  • 销毁:不受IOC容器管控,由Java垃圾回收器负责销毁

依赖注入

依赖注入(Dependency Injection,DI) 其实就是给对象中的属性赋值。

使用构造函数注入属性值
<!--构造函数注入属性值 <constructor-arg> -->
<!--
给哪个构造函数的参数赋值:
    name: 构造函数的参数名
    index: 构造函数中参数的位置,从0开始
构造函数的参数赋值
    value: 简单类型赋值, 基本类型+包装类型+String
    ref: 引用类型赋值,值是其他bean的ID -->
<bean id="account" class="com.eponine.spring.domain.Account">
    <constructor-arg name="id" value=""></constructor-arg>
    <constructor-arg name="name" value="hawk"></constructor-arg>
    <constructor-arg name="balance" value="10000"></constructor-arg>
</bean>
使用set方法给属性赋值
<!--使用set方法进行属性注入-->
<!--
property:
给哪个方法穿参:name -> 去掉set之后的方法的名称,不是以set开头的方法不会被识别
传递的参数值:
    value: 简单类型值
    ref: 引用类型值,值是容器中其他bean的ID
-->
<bean id="accountService" class="com.eponine.spring.service.impl.AccountServiceImpl">
    <property name="accountDao" ref="accountDao"></property>
</bean>
p名称空间

前提条件:xml头部引入p名称空间约束 xmlns:p="www.springframework.org/schema/p"

<!--:p名称空间
        1. 需要配置:p名称空间的约束 xmlns:p="http://www.springframework.org/schema/p"
        2. 每个属性有2个选项:
            属性名称 (给普通属性赋值) 
            属性名称-ref(给特殊类型-bean类型的属性赋值)
    -->
<bean id="account" class="com.eponine.spring.domain.Account" 
      p:id=""
      p:name="hawk"
      p:balance="10000">
</bean>
注入集合属性

就是给类中的集合成员传值,它用的也是 set方法注入的方式,只不过变量的数据类型都是集合。

<bean id="book" class="com.eponine.spring.domain.Book">
    <property name="myArr">
        <array>
            <value>1</value>
            <value>1</value>
        </array>
    </property>
    <property name="myList">
        <list>
            <ref bean="account"></ref>
            <ref bean="account"></ref>
        </list>
    </property>
    <property name="myMap">
        <map>
            <entry key="a1" value-ref="account"></entry>
            <entry key="a2" value-ref="account"></entry>
        </map>
    </property>
    <property name="mySet">
        <set>
            <value>1</value>
            <value>2</value>
        </set>
    </property>
    <property name="properties">
        <props>
            <prop key="p1">1</prop>
            <prop key="p2">2</prop>
        </props>
    </property>
</bean>

配置文件模块化

  • 并列引入:分多个文件配置,创建容器时指定多个配置文件
  • 主从引入:分多个文件配置,由一个主配置文件引入其他所有配置文件,创建容器时指定主配置文件
<import resource="applicationContext.xml"></import>

注意:

同一个xml文件中不能出现ID相同名称的bean,如果出现会报错

多个xml文件如果出现ID相同名称的bean,不会报错,但是后加载的会覆盖前加载的bean