Spring注入属性中的外部bean、内部bean和级联赋值(超详细)

198 阅读5分钟

目录

外部bean

(1)创建两个类service类和dao类。
(2)在service调用dao里面的方法。
(3)在spring配置文件中进行配置。

UserDao接口:

package com.Keafmd.spring5.dao;

/**
 * Keafmd
 *
 * @ClassName: UserDao
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:30
 */

public interface UserDao {

    public void updat();
}

UserDaoImpl类:

package com.Keafmd.spring5.dao;

/**
 * Keafmd
 *
 * @ClassName: UserDaoImpl
 * @Description: 实现类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:31
 */
public class UserDaoImpl implements UserDao{
    @Override
    public void updat() {
        System.out.println("dao updat.....");
    }
}

UserService 类:

package com.Keafmd.spring5.service;
import com.Keafmd.spring5.dao.UserDao;
import com.Keafmd.spring5.dao.UserDaoImpl;

/**
 * Keafmd
 *
 * @ClassName: UserService
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:29
 */
public class UserService {

    //创建UserDao类型属性,生成set方法
    private  UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    
    public void add(){
        System.out.println("service add.....");
        
        //1、原始方式
        //创建UserDao对象
       /* UserDao userDao = new UserDaoImpl();
        userDao.updat();*/
        
        //调用dao中的updat方法
        userDao.updat();

    }
    
}

bean2.xml:

<?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.xsd">

    <!--外部bean-->
    <!--1 service 和 dao的对象创建-->
    <bean id="userService" class="com.Keafmd.spring5.service.UserService">
        <!--注入userDao对象
            name属性:类里面的属性名称
            ref属性:创建UserDao对象bean标签id值
        -->
        <property name="userDao" ref="userDaoImpl"></property>
    </bean>

    <bean id="userDaoImpl" class="com.Keafmd.spring5.dao.UserDaoImpl"></bean>


</beans>

测试类:

package com.Keafmd.spring5.testdemo;

import com.Keafmd.spring5.User;
import com.Keafmd.spring5.bean.Emp;
import com.Keafmd.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Keafmd
 *
 * @ClassName: TestBean
 * @Description: 注入属性,外部bean
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:46
 */
public class TestBean {

    @Test
    public void testBean1(){
        //1、载Spring的配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean2.xml");

        //2、获取配置文件中创建的对象  默认是执行无参的构造方法创建
        UserService userservice =applicationContext.getBean("userService", UserService.class);

        //System.out.println(userservice);
        userservice.add();

    }


}

输出结果:

service add.....
dao updat.....

Process finished with exit code 0

输出了service的add和dao的update证明调用成功,这就是外部bean。

内部bean

(1)一对多的关系:部门和员工。
(1-1)一个部门有多个员工,一个员工属于一个部门。
(1-2)部门是一,员工是多。
(2)在实体类之间表示一对多的关系,员工表示所属部门,使用对象类型属性进行表示。

Dept类:

package com.Keafmd.spring5.bean;

/**
 * Keafmd
 *
 * @ClassName: Dept
 * @Description: 部门类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:53
 */
public class Dept {

    private String dname;

    public void setDname(String dname) {
        this.dname = dname;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}

Emp类:

package com.Keafmd.spring5.bean;

/**
 * Keafmd
 *
 * @ClassName: Emp
 * @Description: 员工类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:53
 */
public class Emp {

    private String ename;
    private String gender;

    //表示员工属于某一个部门,使用对象的形式表示
    private Dept dept;


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

    public void setEname(String ename) {
        this.ename = ename;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void add(){
        System.out.println(ename+" "+gender+" "+dept);
    }
}

bean3.xml

<?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.xsd">

    <!--内部bean-->
    <bean id="emp" class="com.Keafmd.spring5.bean.Emp">
        <!--先设置两个普通的属性-->
        <property name="ename" value="小明"></property>
        <property name="gender" value="男"></property>

        <!--对象类型的属性-->
        <property name="dept">
            <bean id="dept" class="com.Keafmd.spring5.bean.Dept">
                <property name="dname" value="安保部"></property>
            </bean>
        </property>

    </bean>


</beans>

测试类:

package com.Keafmd.spring5.testdemo;

import com.Keafmd.spring5.User;
import com.Keafmd.spring5.bean.Emp;
import com.Keafmd.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Keafmd
 *
 * @ClassName: TestBean
 * @Description: 注入属性,内部bean
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:46
 */
public class TestBean {

    @Test
    public void testBean2(){
        //1、载Spring的配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean3.xml");

        //2、获取配置文件中创建的对象  默认是执行无参的构造方法创建
        Emp emp =applicationContext.getBean("emp", Emp.class);

		//System.out.println(userservice);
        emp.add();

    }


}

输出结果:

小明 男 Dept{dname='安保部'}

Process finished with exit code 0

这次的我们是把部门bean写到员工bean里的,这就是内部bean。

级联赋值

第一种写法

Dept类和Emp类都不变。写个新的配置文件bean4.xml,改变配置文件的内容。

Dept类:

package com.Keafmd.spring5.bean;

/**
 * Keafmd
 *
 * @ClassName: Dept
 * @Description: 部门类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:53
 */
public class Dept {

    private String dname;

    public void setDname(String dname) {
        this.dname = dname;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}

Emp类:

package com.Keafmd.spring5.bean;

/**
 * Keafmd
 *
 * @ClassName: Emp
 * @Description: 员工类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:53
 */
public class Emp {

    private String ename;
    private String gender;

    //表示员工属于某一个部门,使用对象的形式表示
    private Dept dept;


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

    public void setEname(String ename) {
        this.ename = ename;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void add(){
        System.out.println(ename+" "+gender+" "+dept);
    }
}

bean4.xml:

<?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.xsd">

    <!--级联赋值第一种写法-->
    <bean id="emp" class="com.Keafmd.spring5.bean.Emp">
        <!--先设置两个普通的属性-->
        <property name="ename" value="小红"></property>
        <property name="gender" value="女"></property>

        <!--级联赋值-->
        <property name="dept" ref ="dept"></property>

    </bean>


    <bean id="dept" class="com.Keafmd.spring5.bean.Dept">
        <property name="dname" value="财务部"></property>
    </bean>

</beans>

测试类只改变了配置文件。
测试类:

package com.Keafmd.spring5.testdemo;

import com.Keafmd.spring5.User;
import com.Keafmd.spring5.bean.Emp;
import com.Keafmd.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Keafmd
 *
 * @ClassName: TestBean
 * @Description: 注入属性,内部bean
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:46
 */
public class TestBean {

    //级联赋值第一种方法测试
    @Test
    public void testBean3(){
        //1、载Spring的配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean4.xml");

        //2、获取配置文件中创建的对象  默认是执行无参的构造方法创建
        Emp emp =applicationContext.getBean("emp", Emp.class);

		//System.out.println(userservice);
        emp.add();

    }

}

输出结果:

小红 女 Dept{dname='财务部'}

Process finished with exit code 0

第二种写法

Dept类不变,Emp类多加个生成dept的get方法,改变配置文件的内容,在配置文件中加上<property name="dept.dname" value="技术部"></property>语句。

Dept类:

package com.Keafmd.spring5.bean;

/**
 * Keafmd
 *
 * @ClassName: Dept
 * @Description: 部门类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:53
 */
public class Dept {

    private String dname;

    public void setDname(String dname) {
        this.dname = dname;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}

Emp类:

package com.Keafmd.spring5.bean;

/**
 * Keafmd
 *
 * @ClassName: Emp
 * @Description: 员工类 级联赋值的第二种写法
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:53
 */
public class Emp {

    private String ename;
    private String gender;

    //表示员工属于某一个部门,使用对象的形式表示
    private Dept dept;


     // 级联赋值的第二种办法加的语句,生成dept的get方法
    public Dept getDept() {
        return dept;
    }

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

    public void setEname(String ename) {
        this.ename = ename;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void add(){
        System.out.println(ename+" "+gender+" "+dept);
    }
}

bean4.xml:

<?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.xsd">

    <!--级联赋值-->
    <bean id="emp" class="com.Keafmd.spring5.bean.Emp">
        <!--先设置两个普通的属性-->
        <property name="ename" value="小红"></property>
        <property name="gender" value="女"></property>

        <!--级联赋值-->
        <property name="dept" ref ="dept"></property>



        <!--级联赋值第二种办法的语句,需要get方法-->
        <property name="dept.dname" value="技术部"></property>


    </bean>


    <bean id="dept" class="com.Keafmd.spring5.bean.Dept">
		<!--<property name="dname" value="财务部"></property>-->
    </bean>

</beans>

测试类只改变了配置文件。
测试类:

package com.Keafmd.spring5.testdemo;

import com.Keafmd.spring5.User;
import com.Keafmd.spring5.bean.Emp;
import com.Keafmd.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Keafmd
 *
 * @ClassName: TestBean
 * @Description: 注入属性,内部bean
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 9:46
 */
public class TestBean {

    //级联赋值第二种方法测试
    @Test
    public void testBean3(){
        //1、载Spring的配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean4.xml");

        //2、获取配置文件中创建的对象  默认是执行无参的构造方法创建
        Emp emp =applicationContext.getBean("emp", Emp.class);

		//System.out.println(userservice);
        emp.add();

    }

}

输出结果:

小红 女 Dept{dname='技术部'}

Process finished with exit code 0

用级联赋值的第二种写法,小红的部门变为了技术部。

看完如果对你有帮助,感谢点赞支持!
如果你是电脑端的话,看到右下角的 “一键三连” 了吗,没错点它[哈哈]

在这里插入图片描述

加油!

共同努力!

Keafmd