Spring IOC容器的理解(四)

简介: 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);

}

相关文章
|
2月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
441 2
|
6月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
197 1
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
7月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
9月前
|
Java 容器 Spring
什么是Spring IOC 和DI ?
IOC : 控制翻转 , 它把传统上由程序代码直接操控的对象的调用权交给容 器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转 移,从程序代码本身转移到了外部容器。 DI : 依赖注入,在我们创建对象的过程中,把对象依赖的属性注入到我们的类中。
|
4月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
839 108