Spring IoC容器与Bean管理5:使用XML方式实现Spring IoC预二:Spring IoC初体验二:IoC容器完成【对象与对象之间的依赖关系】;

本文通过案例分析了SpringIoC如何通过配置文件解决传统编码方式中对象实例化和依赖关系硬编码的问题,提高程序的可维护性和可扩展性。在XML配置文件中定义了Apple和Child对象,以及它们之间的依赖关系,然后在程序中通过SpringIoC容器获取和使用这些对象,展示了对象关系从编译时固定到运行时动态注入的转变,强调了解耦和控制反转的概念。

说明:

(1)通过【Spring IoC容器与Bean管理三:Spring初识三:通过一个案例来【分析传统编码方式的不足】;】可知:

          ●  传统编码方式的缺点:传统编码方式中,【一些字符串文本信息,是写死的】,【对象也是在代码中new好的、写死的】,【对象之间的关系,也是写死的;对象之间是硬关联】;这些因素的结果是,当需要调整程序的时候,就必须要修改源代码;这会导致程序可扩展性和可维护性很低;

          ● Spring IoC容器的解决方案:Spring IoC容器则通过配置的方式,完成了【对象实例化】和【对象与对象之间的依赖关系】;从而,可以解决传统编码方式的不足;

(2)在【Spring IoC容器与Bean管理四:使用XML方式,实现Spring IoC一:Spring IoC初体验一:IoC容器完成【对象的实例化】;】中演示了IoC容器,完成【对象的实例化】;本篇博客就来演示,IoC容器完成【对象与对象之间的依赖关系】;

(3)篇博客的目的是,通过一个案例,来对 Spring有个感性认知,也就是初体验;至于,Spring IoC的各个配置和属性的详细介绍,在后面会逐一介绍;

(4)本篇博客废话较多,当成个故事看就行;

目录

一:在【applicationContext.xml】中编写配置文件:

二:实际验证和测试

三:【Spring IoC初体验】部分Summary  

1.用传统的代码方式不好吗?为什么要用这种比较复杂的配置文件来实现【对象之间的依赖】?

比如这个案例

2.Summary:

变化一:对于程序员的直观感受来说,【对象的创建】和【对象之间的依赖关系】实现方式变化了;

变化二:(【对象的创建】和【对象之间的依赖关系】)从【编译时就定死】到【运行时动态进行】的变化;


还是在【Spring IoC容器与Bean管理三:Spring初识三:通过一个案例来【分析传统编码方式的不足】;】的代码基础上,将这个项目改为由Spring IoC管理的程序;然后,本篇博客延续自【Spring IoC容器与Bean管理四:使用XML方式,实现Spring IoC一:Spring IoC初体验一:IoC容器完成【对象的实例化】;】中的内容;

一:在【applicationContext.xml】中编写配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple">
        <property name="title" value="红富士"></property>
        <property name="origin" value="欧洲"></property>
        <property name="color" value="红色"></property>
    </bean>
    <bean id="sourApple" class="com.imooc.spring.ioc.entity.Apple">
        <property name="title" value="青苹果"></property>
        <property name="origin" value="中亚"></property>
        <property name="color" value="绿色"></property>
    </bean>
    <bean id="softApple" class="com.imooc.spring.ioc.entity.Apple">
        <property name="title" value="金帅"></property>
        <property name="origin" value="中国"></property>
        <property name="color" value="黄色"></property>
    </bean>
    <bean id="lily" class="com.imooc.spring.ioc.entity.Child">
        <property name="name" value="莉莉"></property>
        <property name="apple" ref="sweetApple"></property>
    </bean>
    <bean id="andy" class="com.imooc.spring.ioc.entity.Child">
        <property name="name" value="安迪"></property>
        <property name="apple" ref="sourApple"></property>
    </bean>
    <bean id="luna" class="com.imooc.spring.ioc.entity.Child">
        <property name="name" value="露娜"></property>
        <property name="apple" ref="softApple"></property>
    </bean>
</beans>

说明:

(1)通过以下的方式,完成对象之间的依赖关系

二:实际验证和测试

SpringApplication类:

package com.imooc.spring.ioc;

import com.imooc.spring.ioc.entity.Apple;
import com.imooc.spring.ioc.entity.Child;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringApplication {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        Apple apple1 = context.getBean("sweetApple", Apple.class);
        System.out.println(apple1.getTitle());

        Child childLily = context.getBean("lily",Child.class);
        childLily.eat();
        Child childAndy = context.getBean("andy",Child.class);
        childAndy.eat();
        Child childLuna = context.getBean("luna",Child.class);
        childLuna.eat();

    }
}

说明: 

(1)程序执行:从IoC容器中,获取想要的对象;

(2)运行结果

三:【Spring IoC初体验】部分Summary  

1.用传统的代码方式不好吗?为什么要用这种比较复杂的配置文件来实现【对象之间的依赖】?

使用配置方式来实现【对象之间的依赖】目的是:提高程序上线后的可维护性;

          ● 比如,当莉莉不喜欢吃红富士后,如果采用传统的在代码中new对象的方式,就需要去修改源代码;但如果采用上面的配置方式,我们只需要修改配置文件就行了,不需要修改源代码;

          ● 又比如,莉莉不喜欢吃红富士了,而是喜欢吃除了红富士、青苹果、金帅之外的的另一种苹果【美国的蛇果】,而这个蛇果在配置文件是没有的;那么我们也不需要修改源代码,只需要在配置文件中,新创建一个对象,然后将其和莉莉设置上就可以了;

所以,Spring IoC容器根本的用途就是【让对象和对象之间有效的解耦】;

比如这个案例

案例: 莉莉不喜欢吃红富士了,而是喜欢吃除了红富士、青苹果、金帅之外的的另一种苹果【美国的蛇果】

完全不需要修改源代码,因为IoC中的对象是通过配置得来的,所以这儿我们只需在applicationContext.xml配置文件中,增加蛇果这个Apple对象的配置就行了,不用修改任何源代码;

2.Summary:

引入Spring IoC容器后,编程上带来了一个巨大变化;以前,对象关系是写在代码中的,即对象关系是通过代码来维护的;现在,对象关系是通过配置的方式来维护;

这给软件开发理念带来了颠覆式的变化;

变化一:对于程序员的直观感受来说,【对象的创建】和【对象之间的依赖关系】实现方式变化了;

       以前传统的编码方式:所有的对象都是通过new关键字得来的,在编译时就决定了对象之间的依赖关系;可以认为,【对象的创建】和【对象之间的依赖关系】都是由程序主动发起的;

       引入Spring IoC容器后:所有对象的创建都是在Spring IoC容器初始化的时候,自动实例化的;虽然其本质,在程序最底层也是通过反射机制去创建并实例化对象,然后再给这个对象贴上一个标签,但是这个工作交给了Spring IoC来做;作为程序员的我们,不需要关心底层的依赖关系,只需要知道【从哪个标签中,可以获取到我们需要的对象】,而这个对象的底层到底依赖其他哪个对象,大部分情况下我们不需要知道,因为这个对象的关联工作都是IoC容器帮我们做好的;在运行时,IoC容器会主动的进行对象的注入,而我们在获取对象的时候,从IoC容器中进行提取,将现成的对象直接拿出来用就行了;上面这是一个被动的过程,因为对象已经由IoC容器创建好了,对象创建的主体也从【程序代码】转移到了【Spring IoC容器中】,这也是IoC容器的【控制反转】的意涵所在;

上面的过程其实可以这样理解:(如有理解错误,随时更改。

      ● 现在有两个工作【在配置文件中,完成Spring IoC容器的配置工作】和【在程序代码中,直接去获取IoC容器中的对象】;

      ● 对于自己来说,这两个工作都需要自己去完成;

      ● 只是,当自己完成了【在配置文件中,完成Spring IoC容器的配置工作】后,,,,,再去做【在程序代码中,直接去获取IoC容器中的对象】的时候,就可以暂时不用关心对象的创建和对象底层依赖的内容,因为这些内容在我们做【在配置文件中,完成Spring IoC容器的配置工作】的时候就已经弄好了。

变化二:(【对象的创建】和【对象之间的依赖关系】)从【编译时就定死】到【运行时动态进行】的变化;

以前传统的编码方式:通过程序代码进行对象的主动创建和设置对象之间关系时,程序在编译时,就已经完全固定了;

引入Spring IoC容器后:所有对象的创建和对象之间的关系,都是被IoC容器来做的;而这个过程是在程序运行时,通过反射技术来进行动态的注入;所以,这种方式更加灵活;

正是由于引入了Spring IoC,大大提高了程序的可维护性和可扩展性;

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值