注:
以下知识是根据跟开涛学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是否存在
- 在IOC容器初始化时,校验注入的ID对应的Bean是否存在,如果不存在则抛出异常
- 在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"/>