Spring注入内部Bean

举报
CoderX 发表于 2022/04/06 13:34:56 2022/04/06
【摘要】 内部Bean将定义在<bean>元素的<property>或<constructor-arg>元素内部的Bean,称为“内部Bean” Setter方式注入内部Bean通过 setter 方式注入内部 Bean。在 <bean> 标签下的 <property> 元素中,再次使用 <bean> 元素对内部 Bean 进行定义,格式如下。<?xml version="1.0" encoding...

内部Bean

将定义在<bean>元素的<property>或<constructor-arg>元素内部的Bean,称为“内部Bean”

Setter方式注入内部Bean

通过 setter 方式注入内部 Bean。在 <bean> 标签下的 <property> 元素中,再次使用 <bean> 元素对内部 Bean 进行定义,格式如下。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
    <bean id="outerBean" class="……">
        <property name="……" >
            
            <!-- 定义内部 Bean -->
            <bean class="……">
                <property name="……" value="……" ></property>
                ……
            </bean>
            
        </property>
    </bean>
</beans>

注意:内部 Bean 都是匿名的,不需要指定 id 和 name 的。即使制定了,IoC 容器也不会将它作为区分 Bean 的标识符,反而会无视 Bean 的 Scope 标签。因此内部 Bean 几乎总是匿名的,且总会随着外部的 Bean 创建。内部 Bean 是无法被注入到它所在的 Bean 以外的任何其他 Bean 的。

构造函数方式注入内部 Bean

通过构造方法注入内部 Bean。在 <bean> 标签下的 <constructor-arg> 元素中,再次使用 <bean> 元素对内部 Bean 进行定义,格式如下。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="……" class="……">
        <constructor-arg name="……">
            <!--内部 Bean-->
            <bean class="……">
                <constructor-arg name="……" value="……"></constructor-arg>
                ……
            </bean>
        </constructor-arg>
    </bean>
</beans>

示例:

package org.demo2;

/**
 * 部门类
 */
public class Dept {
    private  String deptNo;
    private String deptName;
   //使用setter注入或p命名空间注入,需要有无参构造,有其他带参构造不会默认存在
    public Dept() {
    }

    //c命名空间注入 / 构造函数注入constructor-arg
    public Dept(String deptNo, String deptName) {
        this.deptNo = deptNo;
        this.deptName = deptName;
    }

    //p命名空间注入 setter注入 property
    public void setDeptNo(String deptNo) {
        this.deptNo = deptNo;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptNo='" + deptNo + '\'' +
                ", deptName='" + deptName + '\'' +
                '}';
    }
}
package org.demo2;

/**
 * 员工类
 */
public class Employee {
    private String empNo;
    private String empName;
    private Dept dept;

    //使用setter注入或p命名空间注入,需要有无参构造,有其他带参构造不会默认存在
    public Employee() {
    }
    //c命名空间注入 / 构造函数注入constructor-arg
    public Employee(String empNo, String empName, Dept dept) {
        this.empNo = empNo;
        this.empName = empName;
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "empNo='" + empNo + '\'' +
                ", empName='" + empName + '\'' +
                ", dept=" + dept +
                '}';
    }

    //p命名空间注入 setter注入 property
    public void setEmpNo(String empNo) {
        this.empNo = empNo;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }


}

package org.demo2;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    private static final Log LOGGER = LogFactory.getLog(MainApp.class);
    public static void main(String[] args) {
        //获取 ApplicationContext 容器
        ApplicationContext context=new ClassPathXmlApplicationContext("demo2beans.xml");
       //获取 p命名空间注入 的 Bean
        Employee pEmp = context.getBean("pEmp", Employee.class);
        //获取 c命名空间注入 的 Bean
        Employee cEmp = context.getBean("cEmp",Employee.class);
        //Setter方法注入内部Bean
        Employee sEmp=context.getBean("sEmp",Employee.class);
        //构造方法注入内部Bean
        Employee conEmp=context.getBean("conEmp",Employee.class);
        //通过日志打印信息
        LOGGER.info(pEmp.toString());
        LOGGER.info(cEmp.toString());
        LOGGER.info(sEmp.toString());
        LOGGER.info(conEmp.toString());
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <!--p命名空间注入-->
    <bean id="pEmp" class="org.demo2.Employee" p:empName="P小李" p:empNo="2222" p:dept-ref="pDept"></bean>
    <bean id="pDept" class="org.demo2.Dept" p:deptName="开发部" p:deptNo="1"></bean>
    <!--c命名空间注入-->
    <bean id="cEmp" class="org.demo2.Employee" c:empName="C小王" c:empNo="1111" c:dept-ref="cDpet"></bean>
    <bean id="cDpet" class="org.demo2.Dept" c:deptName="运维部" c:deptNo="2"></bean>
    <!--Setter方法注入内部Bean-->
    <bean id="sEmp" class="org.demo2.Employee">
        <property name="empNo" value="001"></property>
        <property name="empName" value="小王"></property>
        <property name="dept">
            <!--内部Bean-->
            <bean class="org.demo2.Dept">
                <property name="deptNo" value="004"></property>
                <property name="deptName" value="技术部"></property>
            </bean>
        </property>
    </bean>
    <!--构造方法注入内部Bean-->
    <bean id="conEmp" class="org.demo2.Employee">
        <constructor-arg name="empNo" value="002"></constructor-arg>
        <constructor-arg name="empName" value="小李"></constructor-arg>
        <constructor-arg name="dept">
            <!--内部Bean-->
            <bean class="org.demo2.Dept">
                <constructor-arg name="deptNo" value="002"></constructor-arg>
                <constructor-arg name="deptName" value="人事部"></constructor-arg>
            </bean>
        </constructor-arg>

    </bean>
</beans>
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。