Spring IOC容器的理解(四)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Spring IOC容器的理解(四)

基于XML管理bean
实验七 给bean的属性赋值:级联属性赋值

实验八 给bean的属性赋值:构造器注入

实验九 给bean的属性赋值:特殊值处理

实验十 给bean的属性赋值:使用p名称空间

实验七 给bean的属性赋值:级联属性赋值

1、配置关联对象的 bean

2、装配关联对象并赋值级联属性

3、测试

实验七 给bean的属性赋值:级联属性赋值
1、配置关联对象的 bean

2、装配关联对象并赋值级联属性
关联对象:happyMachine

级联属性:happyMachine.machineName

<!-- 装配关联对象 -->
<property name="happyMachine" ref="happyMachine2"/>
<!-- 对HappyComponent来说,happyMachine的machineName属性就是级联属性 -->
<property name="happyMachine.machineName" value="cascadeValue"/>


3、测试
@Test
public void testExperiment07() {

HappyComponent happyComponent6 = (HappyComponent) iocContainer.getBean("happyComponent6"); 
String machineName = happyComponent6.getHappyMachine().getMachineName(); 
System.out.println("machineName = " + machineName);

}
实验八 给bean的属性赋值:构造器注入

1、声明组件类

2、配置

3、测试

4、补充

实验八 给bean的属性赋值:构造器注入
1、声明组件类
package com.atguigu.ioc.component;

public class HappyTeam {

    
private String teamName;
private Integer memberCount;
private Double memberSalary;

public String getTeamName() {
    return teamName;
}

public void setTeamName(String teamName) {
    this.teamName = teamName;
}

public Integer getMemberCount() {
    return memberCount;
}

public void setMemberCount(Integer memberCount) {
    this.memberCount = memberCount;
}

public Double getMemberSalary() {
    return memberSalary;
}

public void setMemberSalary(Double memberSalary) {
    this.memberSalary = memberSalary;
}

@Override
public String toString() {
    return "HappyTeam{" +
            "teamName='" + teamName + '\'' +
            ", memberCount=" + memberCount +
            ", memberSalary=" + memberSalary +
            '}';
}

public HappyTeam(String teamName, Integer memberCount, Double memberSalary) {
    this.teamName = teamName;
    this.memberCount = memberCount;
    this.memberSalary = memberSalary;
}

public HappyTeam() {
}

}

2、配置

<constructor-arg value="happyCorps"/>
<constructor-arg value="10"/>
<constructor-arg value="1000.55"/>


3、测试

@Test
public void testExperiment08() {


HappyTeam happyTeam = iocContainer.getBean(HappyTeam.class);

System.out.println("happyTeam = " + happyTeam);

}
4、补充
constructor-arg标签还有两个属性可以进一步描述构造器参数:

index属性:指定参数所在位置的索引(从0开始)
name属性:指定参数名
实验九 给bean的属性赋值:特殊值处理

1、声明一个类用于测试

2、字面量①用Java代码举例说明

②Spring配置文件中举例

[1]字面量举例

[2]类似变量举例

3、null值

4、XML实体

5、CDATA节

实验九 给bean的属性赋值:特殊值处理
1、声明一个类用于测试
package com.atguigu.ioc.component;

public class PropValue {


private String commonValue;
private String expression;

public String getCommonValue() {
    return commonValue;
}

public void setCommonValue(String commonValue) {
    this.commonValue = commonValue;
}

public String getExpression() {
    return expression;
}

public void setExpression(String expression) {
    this.expression = expression;
}

@Override
public String toString() {
    return "PropValue{" +
            "commonValue='" + commonValue + '\'' +
            ", expression='" + expression + '\'' +
            '}';
}

public PropValue(String commonValue, String expression) {
    this.commonValue = commonValue;
    this.expression = expression;
}

public PropValue() {
}

}

2、字面量
①用Java代码举例说明
字面量是相对于变量来说的。看下面的代码:

int a = 10;
声明一个变量a,初始化为10,此时a就不代表字母a了,而是作为一个变量的名字。当我们引用a的时候,我们实际上拿到的值是10。

而如果a是带引号的:'a',那么它现在不是一个变量,它就是代表a这个字母本身,这就是字面量。所以字面量没有引申含义,就是我们看到的这个数据本身。

②Spring配置文件中举例
[1]字面量举例


[2]类似变量举例


3、null值

    <property name="commonValue">
        <!-- null标签:将一个属性值明确设置为null -->
        <null/>
    </property>

4、XML实体

<!-- 小于号在XML文档中用来定义标签的开始,不能随便使用 -->
<!-- 解决方案一:使用XML实体来代替 -->
<property name="expression" value="a &lt; b"/>


5、CDATA节

<property name="expression">
    <!-- 解决方案二:使用CDATA节 -->
    <!-- CDATA中的C代表Character,是文本、字符的含义,CDATA就表示纯文本数据 -->
    <!-- XML解析器看到CDATA节就知道这里是纯文本,就不会当作XML标签或属性来解析 -->
    <!-- 所以CDATA节中写什么符号都随意 -->
    <value><![CDATA[a < b]]></value>
</property>


实验十 给bean的属性赋值:使用p名称空间

1、配置

2、测试

实验十 给bean的属性赋值:使用p名称空间
1、配置
使用 p 名称空间的方式可以省略子标签 property,将组件属性的设置作为 bean 标签的属性来完成。

<bean id="happyMachine3"

  class="com.atguigu.ioc.component.HappyMachine"
  p:machineName="goodMachine"

/>
使用 p 名称空间需要导入相关的 XML 约束,在 IDEA 的协助下导入即可:

<?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:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

具体操作时,输入p:稍微等一下,等IDEA弹出下面的提示:

按Alt+Enter即可导入。

2、测试
@Test
public void testExperiment10() {

HappyMachine happyMachine3 = (HappyMachine) iocContainer.getBean("happyMachine3");

String machineName = happyMachine3.getMachineName();

System.out.println("machineName = " + machineName);

}

相关文章
|
21天前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
108 69
|
20天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
49 21
|
26天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
25天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
30天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
65 6
|
1月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
63 2
|
1月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
41 1
|
2月前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
2月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
2月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
63 0