Spring IOC容器的理解(三)

本文涉及的产品
容器镜像服务 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}"/>


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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
6天前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
91 2
|
8月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
542 26
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
5月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
10月前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
207 69
|
7月前
|
Java 容器 Spring
什么是Spring IOC 和DI ?
IOC : 控制翻转 , 它把传统上由程序代码直接操控的对象的调用权交给容 器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转 移,从程序代码本身转移到了外部容器。 DI : 依赖注入,在我们创建对象的过程中,把对象依赖的属性注入到我们的类中。
|
8月前
|
XML Java 数据格式
Spring容器的本质
本文主要讨论Spring容器最核心的机制,用最少的代码讲清楚Spring容器的本质。
|
10月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
10月前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
150 21
|
10月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
240 12