依赖注入

依赖注入

1、基于构造函数的依赖注入

<!--bean1和bean2无继承关系且不存在歧义,顺序一致-->
<bean id="bean" class="..">
	<constructor-arg ref="bean1"/>
	<constructor-arg ref="bean2"/>
</bean>
<bean id="bean1" class="..."></bean>
<bean id="bean2" class="..."></bean>

<!--如果是基础类型,spring无法确定位置,需要指定类型-->
<bean id="user" class="...">
	<constructor-arg type="int" value="233"></constructor-arg>
	<constructor-arg type="java.lang.String" value="张三"></constructor-arg>
</bean>

<!--使用index指定构造函数的索引
****注意下标是从0开始
****使用引索不仅可以解决基本类型歧义问题,还可以解决两个相同类型参数的歧义。
-->
<bean id="exampleBean" class="...">
	<constructor-arg index="0" value="233"></constructor-arg>
	<constructor-arg index="1" value="张三">
</bean>

<!--使用构造参数的名称
****编译为调试才能用
-->
<bean id="exampleBean" class="...">
	<constructor-arg name="id" value="233"></constructor-arg>
	<constructor-arg name="name" value="张三">
</bean>

注意:如果使用构造器注入,无法解析存在循环依赖的场景。
例:类A通过构造函函数注入需要类B的实例,而类B通过构造函函数注入需要类A的实例。
spring会在运行时检测这种循环依赖,并抛出BeanCurrentlyInCreationException

2、基于setter的依赖注入

<bean id="exampleBean" class="...">
    <!-- 使用标签的方式注入 -->
    <property name="beanOne">
        <ref bean="anotherExampleBean"/>
    </property>

    <!-- 使用属性方式 -->
    <property name="beanTwo" ref="yetAnotherBean"/>
    <property name="integerProperty" value="1"/>
</bean>

<bean id="anotherExampleBean" class="..."/>
<bean id="yetAnotherBean" class="..."/>

依赖关系的详细配置

常量

基础类型

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <!-- 将设置属性为String -->
    <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="masterkaoli"/>
</bean>

直接为java.util.Properties设置值

<bean id="mappings"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <!-- 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>

官方文档中还有使用命名空间配置和idref标签,不常用就不记了。

引用

<bean id="exampleBean" class="...">
	<propery name="a">
		<ref bean="oneBean" />
	</property>
	<propery name="b" ref="twoBean"></bean>
</bean>
<bean id="oneBean" class="..."></bean>
<bean id="twoBean" class="..."></bean>

集合

注意区分<list/><set/><map/><props/>collectionproperties

<bean id="moreComplexObject" class="example.ComplexObject">
    <!-- java.util.Properties -->
    <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>
    <!-- java.util.List -->
    <property name="someList">
        <list>
            <value>a list element followed by a reference</value>
            <ref bean="myDataSource" />
        </list>
    </property>
    <!-- java.util.Map -->
    <property name="someMap">
        <map>
            <entry key="an entry" value="just some string"/>
            <entry key ="a ref" value-ref="myDataSource"/>
        </map>
    </property>
    <!-- java.util.Set  -->
    <property name="someSet">
        <set>
            <value>just some string</value>
            <ref bean="myDataSource" />
        </set>
    </property>
</bean>

map映射的元素可以以下元素:
bean | ref | idref | list | set | map | props | value | null

空值和字符串

inner beans

<bean id="outer" class="...">
    <!-- 这里定义了一个内部的bean,而不是直接引用-->
    <property name="target">
        <bean class="com.example.Person"> <!-- <<<<<<<<<<<<<<<<<<<<<< -->
            <property name="name" value="Fiona Apple"/>
            <property name="age" value="25"/>
        </bean>
    </property>
</bean>

空值和空字符串

Spring将属性的空参数视为空字符串,设置null值使用<null />

<bean class="exampleBean">
	<property name="email">
		<null />
	</property>
</bean>

depands-no

该属性可以强制初始化bean。当一个bean是另一个bean的依赖时,可以在使用该bean前强制初始化,以触发一些类中的静态内容。

<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
    <property name="manager" ref="manager" />
</bean>

<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />

延时初始化bean

默认情况下,applicationContent会初始化所有配置和单例。但有时并不需要启动时一次性初始化所有bean,而是在第一次使用时才加载。使用lazy-init来控制加载

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

如果延时初始化的bean是单例bean的依赖,依然会在容器启动时加载。
直接指定容器级别的延时初始化

<beans default-lazy-init="true">
	....
</beans>

文档中还有自动装配,和方法注入,不常用就不写了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值