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

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

外部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

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


相关文章
|
1月前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
1月前
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
|
18天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
1月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
74 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
1月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
88 1
|
XML 缓存 Java
聊聊Spring内部的依赖管理(下)
聊聊Spring内部的依赖管理(下)
161 0
|
存储 Java Spring
聊聊Spring内部的依赖管理(上)
聊聊Spring内部的依赖管理(上)
142 0
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
177 2
下一篇
无影云桌面