专栏首页程序员的时光Spring系列——带你了解什么是IOC(控制反转)?

Spring系列——带你了解什么是IOC(控制反转)?

思维导图:

1,什么是IOC?

1. 控制反转;

IOC(Inversion of Control),控制反转;是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度

2. 常见方式;

其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),也是轻量级Spring框架的核心。

2,IOC实例讲解;

1,耦合实例:

我们定义一个Cat类:

package com.java.service;

public class Cat {
    public void test(){
        System.out.println("Cat-测试人员");
    }
}

接着来个Work类(调用Cat类):

package com.java.service;

public class Work {
    public void dotest(){
        Cat cat=new Cat();
        //Cat做测试
        cat.test();
    }
}

测试类:

package com.java.test;

import com.java.service.Work;

public class WorkTest {
    public static void main(String[] args) {
        Work work=new Work();
        work.dotest();
    }
}

运行结果:

这是一个简单的类调用方法,但是这个Work和人Cat是完全耦合在一起的; 如果说我还有另外一个Dog也要参加测试,那么只能在Work里面进行再次修改代码; 这样代码的耦合度很高。

另外建一个Dog类:

package com.java.service;

public class Dog {
    public void test(){
        System.out.println("Dog-测试人员");
    }
}

当要Dog做测试时,只能在Work里面继续修改代码:

package com.java.service;

public class Work {
    public void dotest(){
        /*Cat cat=new Cat();
        //Cat做测试
        cat.test();*/
        Dog dog=new Dog();
        //Dog做测试
        dog.test();
    }
}

测试类代码不变:

package com.java.test;

import com.java.service.Work;

public class WorkTest {
    public static void main(String[] args) {
        Work work=new Work();
        work.dotest();
    }
}

运行结果:

分析一下,这样修改会改变很多代码,执行效率不高; 我们怎么样能修改一下这种实现的方式,让代码效率更高呢?

2,用接口实现,提高效率;

我们先来定义一个接口:

package com.java.service;

public interface Tester {
    public void test();
}

并让所有参与测试的人员继承这个接口:

package com.java.service;

public class Dog implements Tester{
    public void test(){
        System.out.println("Dog-测试人员");
    }
}

package com.java.service;

public class Cat implements Tester{
    public void test(){
        System.out.println("Cat-测试人员");
    }
}

然后我们在Work类里面定义一个对象Tester;

具体谁来测试我们在主函数里面设置;

package com.java.service;

public class Work {
    private Tester tester;

    public void setTester(Tester tester) {
        this.tester = tester;
    }

    public void dotest(){
        /*Cat cat=new Cat();
        //Cat做测试
        cat.test();*/
        /*Dog dog=new Dog();
        //Dog做测试
        dog.test();*/
        tester.test();
    }
}

主函数(可以设置谁来进行测试,比方说Cat):

package com.java.test;

import com.java.service.Cat;
import com.java.service.Work;

public class WorkTest {
    public static void main(String[] args) {
        /*Work work=new Work();
        work.dotest();*/

        Work work=new Work();
        //将Cat设置为测试人员
        work.setTester(new Cat());
        work.dotest();
    }
}

运行结果:

这样就实现了控制反转! 控制权在我们自己传入的对象里面,也就是在自己手里

但好像还是有点麻烦,于是乎,我们就来看看Spring中有什么更简单的方式吧~

3,Spring如何管理Bean;

那么,Spring是如何管理Bean的呢?

我们先在beans.xml配置文件里面写几个bean;

<?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
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--通过id来标识类
    <bean id="helloWorld" class="com.java.test.HelloWorld"></bean>-->
    <bean id="cat" class="com.java.service.Cat"></bean>

    <bean id="dog" class="com.java.service.Dog"></bean>

    <bean id="work" class="com.java.service.Work">
        <!--这里的name对应的是Work类对应的tester,ref是指让谁去测试-->
        <property name="tester" ref="cat"></property>
    </bean>
</beans>

测试类:

注意这里的bean里面的id就是bean.xml配置文件的work;

package com.java.test;

import com.java.service.Work;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        //加载beans.xml文件,调用Spring接口
        ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
        //通过id获取bean,返回一个对象
        Work work=(Work)ac.getBean("work");
        //调用方法
        work.dotest();
    }
}

运行结果:

如果想换成Dog测试,那么直接修改bean.xml里面的ref值就可以了, 简单方便! 你们看,用Spring来管理Bean,极大地降低了面向对象中代码的耦合度!

本文分享自微信公众号 - 程序员的时光(gh_9211ec727426),作者:时光太瘦哇

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Struts2核心知识(下)

    struts2默认给我们执行的是execute()方法,而当我们想执行掐方法时,就可以用method,其中属性写上我们想要调用的方法就可以了!

    程序员的时光001
  • Struts2——核心知识

    程序员的时光001
  • 骚一下,修改SpringBoot启动 Logo?

    在 src/main/resources 放入 banner.txt 文件,该文件名字不能随意,

    程序员的时光001
  • Netty之JavaNIO编程模型介绍02

      NIO 非阻塞 网络编程相关的(Selector、SelectionKey、ServerScoketChannel和SocketChannel) 关系梳理图

    用户4919348
  • 迪米特法则与重构

    在面向对象设计的世界里,有一个寻常却又常常为人所忽略的原则——“迪米特(Law of Demeter)”法则。这个原则认为,任何一个对象或者方法,它应该只能调用...

    张逸
  • JVM | 老婆孩子热炕头-GC收集器概念篇

    本篇内容以概念为主,先了解概念,知道有哪些名词,东西, 再实战看里面的东西去加深理解

    微笑的小小刀
  • SpringBoot整合SpringSecurity实现JWT认证

    该类继承OncePerRequestFilter,顾名思义,它能够确保在一次请求中只通过一次filter 该类使用JwtTokenUtils工具类进行toke...

    智慧zhuhuix
  • Java 8 Lambda 的实现原理及源码剖析

    为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成...

    挨踢小子部落阁
  • SpringBoot入门系列(二)Controller介绍及如何返回json数据

    前面介绍了Spring Boot的优点,然后介绍了如何快速创建Spring Boot 项目。不清楚的朋友可以看看之前的文章:https://www.cnblog...

    架构师精进
  • HIbernate 中的 继承映射

    数据库中Delivery表:id,recipient,phone,address,postcode,delivery_type,parcel_number,ex...

    Hongten

扫码关注云+社区

领取腾讯云代金券