Spring IOC容器的理解(三)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Spring IOC容器的理解(三)

基于XML管理bean
目录

实验一 [重要]创建bean

实验二 [重要]获取bean

实验三 [重要]给bean的属性赋值:setter注入

实验四 [重要]给bean的属性赋值:引用外部已声明的bean

实验五 [重要]给bean的属性赋值:内部bean

实验六 [重要]给bean的属性赋值:引入外部属性文件

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

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

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

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

实验十一 给bean的属性赋值:集合属性

实验十二 自动装配

实验十三 集合类型的bean

实验十四 FactoryBean机制

实验十五 bean的作用域

实验十六 bean的生命周期

实验三 [重要]给bean的属性赋值:setter注入

1、给组件类添加一个属性

2、在配置时给属性指定值

3、测试

实验三 [重要]给bean的属性赋值:setter注入
1、给组件类添加一个属性
public class HappyComponent {

private String componentName; 
public String getComponentName() {
    return componentName;
}
public void setComponentName(String componentName) {
    this.componentName = componentName;
} 
public void doWork() {
    System.out.println("component do work ...");
} 

}
2、在配置时给属性指定值
通过property标签配置的属性值会通过setXxx()方法注入,大家可以通过debug方式验证一下

<!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 -->
<!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关) --> 



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

HappyComponent happyComponent3 = (HappyComponent) iocContainer.getBean("happyComponent3");  
String componentName = happyComponent3.getComponentName();      System.out.println("componentName = " + componentName); 

​​​​​​​}
实验四 [重要]给bean的属性赋值:引用外部已声明的bean

1、声明新的组件类

2、原组件引用新组件

3、配置新组件的 bean

4、在原组件的 bean 中引用新组件的 bean5、测试6、易错点

实验四 [重要]给bean的属性赋值:引用外部已声明的bean
1、声明新的组件类
public class HappyMachine {

private String machineName;
public String getMachineName() {
    return machineName;
}

public void setMachineName(String machineName) {

    this.machineName = machineName;
}

}
2、原组件引用新组件

3、配置新组件的 bean

<property name="machineName" value="makeHappy"


4、在原组件的 bean 中引用新组件的 bean

<!-- ref 属性:通过 bean 的 id 引用另一个 bean -->
<property name="happyMachine" ref="happyMachine"/>


这个操作在 IDEA 中有提示:

5、测试
@Test
public void testExperiment04() {

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

}
6、易错点
如果错把ref属性写成了value属性,会抛出异常: Caused by: java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.atguigu.ioc.component.HappyMachine' for property 'happyMachine': no matching editors or conversion strategy found 意思是不能把String类型转换成我们要的HappyMachine类型 说明我们使用value属性时,Spring只把这个属性看做一个普通的字符串,不会认为这是一个bean的id,更不会根据它去找到bean来赋值

实验五 [重要]给bean的属性赋值:内部bean

1、重新配置原组件

2、测试

实验五 [重要]给bean的属性赋值:内部bean
1、重新配置原组件
在bean里面配置的bean就是内部bean,内部bean只能在当前bean内部使用,在其他地方不能使用。

<property name="happyMachine">
    <!-- 在一个 bean 中再声明一个 bean 就是内部 bean -->
    <!-- 内部 bean 可以直接用于给属性赋值,可以省略 id 属性 -->
    <bean class="com.atfun.ioc.component.HappyMachine">
        <property name="machineName" value="makeHappy"/>
    </bean>
</property>


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

HappyComponent happyComponent4 = (HappyComponent) iocContainer.getBean("happyComponent4");

HappyMachine happyMachine = happyComponent4.getHappyMachine();

String machineName = happyMachine.getMachineName();

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

}
实验六 [重要]给bean的属性赋值:引入外部属性文件

1、加入依赖

2、创建外部属性文件

3、引入

4、使用

5、测试

实验六 [重要]给bean的属性赋值:引入外部属性文件
1、加入依赖

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.3</version>
    </dependency>
    <!-- 数据源 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.31</version>
    </dependency>

2、创建外部属性文件

jdbc.user=root
jdbc.password=(你自己数据库password)
jdbc.url=jdbc:mysql://localhost:3306/mybatis-example
jdbc.driver=com.mysql.jdbc.Driver
3、引入

<context:property-placeholder location="classpath:jdbc.properties"/>

4、使用

<property name="url" value="${jdbc.url}"/>
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>


点赞三连多多支持!!!!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
XML Java 测试技术
spring复习01,IOC的思想和第一个spring程序helloWorld
Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。
spring复习01,IOC的思想和第一个spring程序helloWorld
|
21天前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
74 9
|
18天前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
17 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
27天前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
33 4
|
5天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
17 0
|
1月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
80 3
|
13天前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
32 0
|
2天前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第12天】
13 5
|
7天前
|
存储 运维 云计算
探索Docker容器化:从入门到实践
在这个快速发展的云计算时代,Docker容器化技术正在改变应用的开发、部署和管理方式。本文旨在为初学者提供一个关于Docker的全面入门指南,并通过实践案例展示Docker在实际开发中的应用。我们将一起了解Docker的核心概念、基本操作、网络和存储,以及如何构建和部署一个简单的Web应用。无论你是开发者还是运维人员,本文都会帮助你快速掌握Docker的核心技能。