Spring IOC容器的理解(四)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 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);

}

相关文章
|
18天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
28天前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
9天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
21 0
|
2月前
|
XML Java 测试技术
spring复习01,IOC的思想和第一个spring程序helloWorld
Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。
spring复习01,IOC的思想和第一个spring程序helloWorld
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
126 9
|
1月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
28 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
2月前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
40 4
|
30天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
65 0
|
1月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
45 0
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
23 2