深入浅出Spring(二) IoC详解

上次的博客深入浅出Spring(一)Spring概述中,我给大家简单介绍了一下Spring相关概念。重点是这么一句:Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。在这句话中重点有两个,一个是IoC,另一个是AOP。今天我们讲第一个IoC。

IoC概念

控制反转(Inversion of Control)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 它还有一个名字叫做依赖注入(Dependency Injection)。IoC不是什么技术,它是一种设计模式。

实例演示

为了更好的说明IoC,我为大家举一个简单的例子,如有这样一个描述:某公司新成立了一个项目组,项目组有若干成员和一个项目组长,项目组成立后第一次开会上,作为项目组长的小李按照惯例首先做了简短的自我介绍。

根据上述的描述,如果我们写出如下代码和类图:

    public class Li {
        public void introduce() {
            System.out.println("大家好,我是小李");
        }
    }
    public class Team {
        public void firstMeeting() {
            Li li = new Li();
            li.introduce();
        }
    }

      具体类图如下:

上述的代码,应该说基本完成了相关的需求,但是仔细考虑之后就会发现,上述的代码是根据具体的场景描述进行的,并没有进行抽象,这样就导致我们不能灵活的安排项目组长去做开场,即根据现在的代码,开场自我介绍被绑定给了小李而不能安排给其他人。为了解决上述的问题,我们引入首先引入Leader接口,相关代码和类图如下:

    public interface Leader {
        public void introduce();
    }

    public class Li implements Leader {
        @Override
        public void introduce() {
            System.out.println("大家好,我是小李");
        }
    }

    public class Team {
        public void firstMeeting() {
            Leader li = new Li();
            li.introduce();
        }
    }

具体类图如下:

虽然上述的代码可以让我们安排给其他成员开场,但是我们可以看出Team类同时依赖Leader接口和Li类,并没有达到我们所期望的Team仅仅依赖于Leader接口的目的,如何解决这个问题呢?当然是引入Boss,由Boss决定具体由谁担任项目组长。具体类图和代码如下:

    public interface Leader {
        public void introduce();
    }

    public class Li implements Leader {
        @Override
        public void introduce() {
            System.out.println("大家好,我是小李");
        }
    }

    public class Team {
        public void firstMetting(Leader leader){
            leader.introduce();
        }
    }

    public class Boss {
        public void direct(){
            Leader leader = new Li();
            Team team = new Team();
            team.firstMetting(leader);
        }
    }

具体类图如下:



深入浅出Spring(二) IoC详解

时间: 2024-10-06 17:20:16

深入浅出Spring(二) IoC详解的相关文章

Spring二 Bean详解

Bean详解 Spring框架的本质其实是:通过XML配置来驱动Java代码,这样就可以把原本由java代码管理的耦合关系,提取到XML配置文件中管理.这样就实现了系统中各组件的解耦,有利于后期的升级和维护.1.Bean的基本定义和Bean别名<beans>元素是Spring配置文件的根元素,该元素可以指定如下属性:default-lazy-init:指定<beans>元素下配置的所有bean默认的延迟初始化行为default-merge:指定<beans>元素下配置的

spring之ioc详解

第一节:spring IOC的详解 首先想说说IoC(Inversion of Control,控制倒转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好.qq号.电话号.ip号.iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对

一步一步造个Ioc轮子(二),详解泛型工厂

一步一步造个Ioc轮子目录 .net core发布了,一步一步造个Ioc轮子,弄点.net魔法,近new的速度(一) 一步一步造个Ioc轮子(二),详解泛型工厂 详解泛型工厂 既然我说Ioc容器就是一个豪华版工厂,自动化装配的工厂,那我们就从工厂入手吧,先造个工厂,然后升级成Ioc容器 首先我们来写一个最最最简单的抽象工厂类,还是以前一篇的短信为例 public class SMSFactory { public static ISMS Get() { return new XSMS(); }

Spring IoC详解

Spring IoC详解 1. 控制反转 控制反转是一种通过描述(XML或者注解)并通过第三方去产生或获取特定对象的方式.在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection, DI). 它最大的好处是降低对象之间的耦合度,在一个系统中有哪些类,具体如何实现并不需要去理解,只需要知道它有什么用就可以.只是这里对象的产生依赖于IoC 容器,而不是开发者主动的行为.主动创建的模式,责任归于开发者,而在被动模式下,责任归于IoC容器,基于这样的被动

Spring的配置详解

Spring的配置详解 3.1XML配置的结构 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www

深入浅出mybatis之启动详解

深入浅出mybatis之启动详解 MyBatis功能丰富,但使用起来非常简单明了,今天我们来追踪一下它的启动过程. 目录 如何启动MyBatis 如何使用MyBatis MyBatis启动过程 如何启动MyBatis 我们知道,SqlSessionFactory是MyBatis中最为核心的组件,每个基于MyBatis的应用都是以一个SqlSessionFactory实例为中心的.SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得,而SqlSess

Spring——jar包详解(转)

Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spring 2.5.6的时候需要asm jar包,spring3.0开始提供它自己独立的asm jar包 org.springframework.aspects——Spring提供的对AspectJ框架的整合 org.springframework.beans——所有应用都用到,包含访问配置文件,创建和

Spring Cache抽象详解

缓存简介 缓存,我的理解是:让数据更接近于使用者:工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存):缓存什么:那些经常读取且不经常修改的数据/那些昂贵(CPU/IO)的且对于相同的请求有相同的计算结果的数据.如CPU--L1/L2--内存--磁盘就是一个典型的例子,CPU需要数据时先从L1/L2中读取,如果没有到内存中找,如果还没有会到磁盘上找.还有如用过Maven的朋友都应该知道,我们找依赖的时候,先从本机仓库找,再从本地服务器仓库找,最后到远程仓库服务器

Spring的资源详解

一.Spring的资源详解 1.1引言 在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源.File资源.ClassPath相关资源.服务器相关资源等等很多资源.因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性:而且处理这些资源步骤都是类似的(打开资源.读取资源.关闭资源),因此如果能抽象出一个统一的接口来对这些底层资源进行统一访问,是不是很方便,而且使我们系统更加简洁,都是对不同的底层资源使用同一个接口进行访问. Spring提供一个Resource接口来统