3-Spring-DI

注:

以下知识是根据跟开涛学spring3(第1-6章) 一书提炼而出

在此权作为读书笔记

Spring注入常量

Spring在配置Bean时,有时会选择给其注入常量,一般是通过value属性进行注入。同一输入字符串,Spring在底层自动的进行类型转换,将其转变成我们需要的类型,如果转换错误会抛出异常。那么当我们注入的常量是Boolean类型时,除了true和false,Spring还支持”yes/no”,”on/off”,”1/0”

构造器注入

构造器注入可以根据
1. 参数索引注入
2. 参数类型注入
3. 参数名注入

<!-- 通过构造器参数索引方式依赖注入 -->
<bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg index="0" value="Hello World!"/>
    <constructor-arg index="1" value="1"/>
</bean> 
<!-- 通过构造器参数类型方式依赖注入 -->
<bean id="byType" class="cn.javass.spring.chapter3.HelloImpl3">
   <constructor-arg type="java.lang.String" value="Hello World!"/>
   <constructor-arg type="int" value="2"/>
</bean> 
<!-- 通过构造器参数名称方式依赖注入 -->
<bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3">
   <constructor-arg name="message" value="Hello World!"/>
   <constructor-arg name="index" value="3"/>
</bean>

Bean的ID注入

假设我们现在有一个类,其有属性为id

public class IdRefTestBean {
    private String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}

现在我们通过Spring来创建它,并需要校验,我们创建时,其ID是否存在

  1. 在IOC容器初始化时,校验注入的ID对应的Bean是否存在,如果不存在则抛出异常
  2. 在XML解析时校验注入的ID对于的Bean在当前配置文件中是否存在,如果不存在将抛出异常
<!-- id -->
<bean id="bean1" class="java.lang.String">
<constructor-arg index="0" value="test"/>
</bean>
<bean id="bean2" class="java.lang.String">
    <constructor-arg index="0" value="test"/>
</bean>
<!-- IdRefTestBean  -->
<bean id="idrefBean1" class="cn.javass.spring.chapter3.bean.IdRefTestBean">
        <property name="id"><idref bean="bean1"/></property>
</bean>
<bean id="idrefBean2" class="cn.javass.spring.chapter3.bean.IdRefTestBean">
    <property name="id"><idref local="bean2"/></property>
</bean>

处理null值

我们在创建Bean时,可能存在Bean中某个属性注入null的情况
Spring中使用<null/>标签,代表null

<bean id="hello" class="com.wzw.spring.model.Hello">
    <property name="msg"><null/></>
</bean>

循环依赖

首先先了解一下循环依赖和循环调用的概念

  • 循环依赖:类与类之间相互依赖,形成了循环。如:A调用B,B调用C,C调用A。
  • 循环调用:方法之间相互依赖,形成了循环。
    既然存在着循环依赖的问题,那么Spring中如何解决呢。
    对于Spring来说,在我们创建Bean注入属性的时候,主要由两种方式:构造器和set方法
  • 针对于构造器注入形成的循环依赖,是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖。Spring容器将每一个正在创建的Bean 标识符放在一个“当前创建Bean池”中,Bean标识符在创建过程中将一直保持在这个池中,因此如果在创建Bean过程中发现自己已经在“当前创建Bean池”里时将抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的Bean将从“当前创建Bean池”中清除掉。
  • 针对于set方法注入形成的循环依赖,通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(如setter注入)的Bean来完成的。只能解决单例作用域的Bean循环依赖。

延迟初始化Bean

首先,我们先来了解一下Bean的生命周期以及作用域
参考:

https://blog.csdn.net/a327369238/article/details/52193822
https://www.cnblogs.com/zhanglei93/p/6231882.html

我们都知道,Spring真正使用需要在web.xml中配置监听器,既当服务器启动时候,执行Spring,创建IOC容器,同时,Bean作用域默认为Singleton,此时,Bean就被创建了。
那么,如果我们需要Bean只在其被使用的时候在创建。我们只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean。

<bean id="helloApi" class="cn.javass.spring.chapter2.helloworld.HelloImpl" lazy-init="true"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值