004-Spring Ioc 依赖详解

基本数据类型、字符串注入

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <!-- results in a setDriverClassName(String) call -->
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="root"/>
    <property name="password" value="misterkaoli"/>
</bean>

使用p命名空间设置

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close"
        p:driverClassName="com.mysql.jdbc.Driver"
        p:url="jdbc:mysql://localhost:3306/mydb"
        p:username="root"
        p:password="misterkaoli"/>

</beans>

配置java.util.Properties实例

<bean id="mappings"
    class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">

    <!-- typed as a java.util.Properties -->
    <property name="properties">
        <value>
            jdbc.driver.className=com.mysql.jdbc.Driver
            jdbc.url=jdbc:mysql://localhost:3306/mydb
        </value>
    </property>
</bean>

内部bean配置

<bean id="outer" class="...">
    <!-- instead of using a reference to a target bean, simply define the target bean inline -->
    <property name="target">
        <bean class="com.example.Person"> <!-- this is the inner bean -->
            <property name="name" value="Fiona Apple"/>
            <property name="age" value="25"/>
        </bean>
    </property>
</bean>

集合配置

<bean id="moreComplexObject" class="example.ComplexObject">
    <!-- results in a setAdminEmails(java.util.Properties) call -->
    <property name="adminEmails">
        <props>
            <prop key="administrator">administrator@example.org</prop>
            <prop key="support">support@example.org</prop>
            <prop key="development">development@example.org</prop>
        </props>
    </property>
    <!-- results in a setSomeList(java.util.List) call -->
    <property name="someList">
        <list>
            <value>a list element followed by a reference</value>
            <ref bean="myDataSource" />
        </list>
    </property>
    <!-- results in a setSomeMap(java.util.Map) call -->
    <property name="someMap">
        <map>
            <entry key="an entry" value="just some string"/>
            <entry key ="a ref" value-ref="myDataSource"/>
        </map>
    </property>
    <!-- results in a setSomeSet(java.util.Set) call -->
    <property name="someSet">
        <set>
            <value>just some string</value>
            <ref bean="myDataSource" />
        </set>
    </property>
</bean>

映射键或值或集合值的值也可以是以下任何元素:

bean | ref | idref | list | set | map | props | value | null

Null 和空字符串值

<bean class="ExampleBean">
    <property name="email" value=""/>
    <property name="phone"></null></property>
</bean>

延迟初始化

默认情况下,Spring 容器会在初始化过程中预实例化单例的bean。但某些时候我们不希望它在容器初始化的时候实例化,这时我们可以使用延迟初始化。

<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.something.AnotherBean"/>

但是,当延迟初始化 bean 是未延迟初始化的单例 bean 的依赖项时,它ApplicationContext会在启动时创建延迟初始化 bean,因为它必须满足单例的依赖项。延迟初始化的 bean 被注入到其他地方没有延迟初始化的单例 bean 中。

您还可以通过使用元素default-lazy-init上的属性来控制容器级别的延迟初始化 ,如以下示例所示:

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>

Bean 作用域

<bean/>标签的scope属性,定义了该bean的作用域。一个bean有如下几种作用域

名称value
singleton(默认)单例,只在第一次实例化bean,之后获取都是该bean的同一个实例化对象
prototype每次获取bean都会新实例化bean
request将单个 bean 定义范围限定为单个 HTTP 请求的生命周期。
session将单个 bean 定义范围限定为 HTTP 的生命周期Session
application将单个 bean 定义范围限定为ApplicationContext。spring容器范围内
websocket将单个 bean 定义范围限定为WebSocket

其中最常见的是singleton和prototype

单例作用域

在这里插入图片描述
Spring IoC 容器会创建该 bean 定义定义的对象的一个​​实例。该单个实例存储在此类单例 bean 的缓存中,并且对该命名 bean 的所有后续请求和引用都返回缓存对象。

原型作用域

在这里插入图片描述
在xml中配置原型作用域

<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>

单例作用域的bean依赖原型作用域的bean

假设你希望单例范围的 bean 在运行时重复获取原型范围的 bean 的新实例。则不能将原型范围的 bean 依赖注入到单例 bean 中,因为该注入仅发生一次,当 Spring 容器实例化单例 bean 并解析并注入其依赖项时。如果在运行时多次需要原型 bean 的新实例,请使用方法注入。

上一篇:003-Spring Ioc Bean的初始化过程与循环依赖
下一篇:005-Spring Bean的生命周期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值