聊聊依赖注入
前面的《Spring中的 IOC》聊了IOC思想,也知道了DI是实现IOC的一种方式,现在来进一步探索依赖注入 DI。
依赖注入
Dependency Injection,DI
依赖 : 指Bean对象的创建依赖于容器 ,Bean对象的依赖资源
注入 : 指Bean对象所依赖的资源 ,由容器来设置和装配
注入方式
构造器注入
《Spring中的 IOC》聊过了。
Set注入
要注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is
不同数据类型的注入
为了测试,先来个POJO,包含一些常用的类型的属性。
public class Student { private String name; private Address address;//自己定义的Address private String[] books; private List<String> hobbys; private Map<String,String> card; private Set<String> games; private String wife; private Properties info; .... get\set\toString等 }
public class Address { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
Bean注入
这里说的Bean注入不是把一个Bean对象注入到容器,而且说把容器内一个Bean注入到另一个Bean作为一个引用类型的属性,举例上面的Student类中的地址属性。
<bean id="addr" class="com.hwl.pojo.Address"> <property name="address" value="成都"/> </bean> <bean id="student" class="com.hwl.pojo.Student"> <property name="address" ref="addr"/> </bean>
常量注入
<bean id="student" class="com.hwl.pojo.Student"> <property name="name" value="李华"/> </bean>
数组注入
<property name="books"> <array> <value>西游记</value> <value>红楼梦</value> <value>水浒传</value> </array> </property>
List注入
<property name="hobbys"> <list> <value>听歌</value> <value>看书</value> <value>爬山</value> </list> </property>
Map注入
<property name="card"> <map> <entry key="招行" value="1234567890"/> <entry key="建行" value="0987654321"/> </map> </property>
Set注入
<property name="games"> <set> <value>橘子</value> <value>苹果</value> <value>凤梨</value> </set> </property>
Null注入
<property name="wife"> <null/> </property>
Properties注入
<property name="info"> <props> <prop key="学号">20210704</prop> <prop key="姓名">小花</prop> <prop key="性别">女</prop> </props> </property>
p命名注入和c命名注入
p命名注入
p,properties,属性
属性需要有set方法,而且需要导入命名空间:
xmlns:p="http://www.springframework.org/schema/p"
用法
在bean标签中添加属性,格式:p:字段名=字段值,例如:p:name="李华"
<bean id="user" class="com.hwl.pojo.User" p:name="李华" p:age="28"/>
c命名注入
c,constructor,构造器
属性需要有set方法,有参构造器,而且需要导入命名空间:
xmlns:c="http://www.springframework.org/schema/c"
用法
在bean标签中添加属性,格式:c:字段名=字段值,例如:p:name="李华"
<bean id="user" class="com.hwl.pojo.User" c:name="小华" c:age="24"/>
Bean的作用域
Singleton |
默认,IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例 |
Prototype |
每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例 |
Request |
在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,只能用在基于web的Spring ApplicationContext环境 |
Session |
在一个HTTP Session中,一个bean定义对应一个实例,只能用在基于web的Spring ApplicationContext环境 |
作用域配置
Singleton
<bean ... scope="singleton">
Prototype
<bean ... scope="prototype"/> 或者 <bean ... singleton="false"/>
Request
<bean ... scope="request"/>
Session
<bean ... scope="session"/>