不同数据类型的依赖注入(一):value和ref

不同数据类型的依赖注入(一):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"));

输出结果:

                                                        

发布了213 篇原创文章 · 获赞 116 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/104210961