不同数据类型的依赖注入(一):value和ref
1. 直接注入值 【Straight Values (Primitives, Strings, and so on)】
直接值,常见的就是简单类型的值和字符串。
<property/>
标签的value
属性用来指定一个“人可读”的字符串。通过Spring的转换服务,可以将这些字符串转换为Java规范的类型。
<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="masterkaoli"/>
</bean>
例如,上面的value
的值,都会转换为Java.lang.String
。从字符串转换为字符串可能看起来并不明显,但对于数值(比如说int),Spring可以将字符串转换为数字类型。
2.引用其他的bean 【References to Other Beans (Collaborators)】
在之前的介绍中,使用<proprty/>
和<constructor-arg>
的ref
属性来引用当前上下文(注意不是当前XML文件,会在后面举例说明)中其他的bean。
现在,再来介绍一个<ref/>
标签,它是<proprty/>
和<constructor-arg>
一个最终的标签(树形结构的叶子结点)。
<ref/>
的属性:bean
用来引用一个bean,不管是否在同一个上下文,也不管是当前容器还是父容器。bean
属性的值是要引用的bean的id或者多个name中的一个。
<ref bean="someBean"/>
<ref/>
的属性:parent
引用当前容器的父容器中的bean。parent
的值是要引用的bean的id或者多个name中的一个。
父容器上下文:
<!-- in the parent context -->
<bean id="accountService" class="com.something.SimpleAccountService">
<!-- insert dependencies as required as here -->
</bean>
当前容器(父容器的子容器)上下文:
<!-- in the child (descendant) context -->
<bean id="accountService" <!-- bean name is the same as the parent bean -->
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref parent="accountService"/> <!-- notice how we refer to the parent bean -->
</property>
<!-- insert other configuration and dependencies as required here -->
</bean>
已经弃用的local属性:引用上下文的bean。
等价于<proprty/>
和<constructor-arg>
的ref
属性
当前上下文不等于当前XML文件
注:当前上下文,其实就是当前容器的上下文
将多个XML合成上下文的方法有两个:
方法1:通过<import/>
标签导入其他XML文件
方法2:初始化容器时,传入多个XML文件
在这里,我们使用方法2举例
上下文1以及bean对应的类:
<bean id="collaborator" class="SpringTest.TestAttributeLocal.Collaborator">
<property name="data" value="I'm testBean"/>
</bean>
package SpringTest.TestAttributeLocal;
public class Collaborator {
private String data;
public void setData(String data) {
this.data = data;
}
public String toString() {
return data;
}
}
上下文2以及bean对应的类:
<bean id="testBean" class="SpringTest.TestAttributeLocal.TestBean">
<property name="collaborator" ref="collaborator" />
</bean>
package SpringTest.TestAttributeLocal;
public class TestBean {
private Collaborator collaborator;
public void setCollaborator(Collaborator collaborator) {
this.collaborator = collaborator;
}
public String toString() {
return collaborator + "";
}
}
初始化容器,传入两个XML的URL:
ApplicationContext context = new ClassPathXmlApplicationContext(url1, url2);
查看是否注入成功:
System.out.println(context.getBean("testBean"));
输出结果: