Spring IOC

本文介绍了Spring的IOC(控制反转)概念,通过实例展示了如何通过接口和setter方法实现依赖注入,降低了代码间的耦合度。文章还提供了一个简单的数据库时间获取模块的示例,解释了如何避免手动创建对象,转而由Spring进行对象的管理和创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

众所周知,Spring向来以IOC和AOP独创江湖,这是Spring的招牌和成名作。一直以来只是学着用Spring去快速开发一些项目,只知道如何配置实用,却没有去仔细看一下Spring的IOC是个什么东东。于是在网上找到几个介绍Spring IOC的文章,看过之后发现IOC的概念也没有什么难理解的,不过,Spring将其发光发热了,将IOC用的炉火纯青,淋漓尽致。好了,我就把一些介绍IOC的文章粗略记录一下吧,以备复习之用,参考了很多别人的文章,在此一并谢过!

IOC(有人也叫DI),就是控制反转,也叫依赖注入。大体的意思就是:不再靠程序员去手动创建类,由Spring替你创建和管理,降低业务逻辑之间的耦合程度。那么简答一句话:控制反转,到底控制什么反转了?答案就是获取对象的方式。我们可以简单地把IOC理解为一个管家,作为主人的你,你需要告诉你需要什么样的东西,管家就会帮你找出来,前提当然是这个东西是你的并且管家也知道有这么个东西。哈哈哈,有管家真好。。。

那么,Spring是如何实现IOC的呢?最好的方式是去看源代码,不过如果你只是想了解IOC,那么下面的例子可能会对你有帮助。

如何实现IOC,大体思路如下:

1.实现接口或者继承超类

2.使用setter方式或者构造函数的方式定义注入类

3.调用IOC获得注入类并调用其实现方法

假设场景:项目经理要你开发一个获取数据库时间的通用模块,要你兼容Mysql,Oracle,SQLServer,客户端调用者只需要传入要调用哪种数据库,你就返回对应的数据库时间。你会怎么做?

1.声明一个获取数据库时间的接口,提供一个获取数据库时间的接口方法

package com.robin;
 
 
public interface IDataBase {
     
    public String getDate();
 
}

2.声明三个实现接口的类

package com.robin;
 
 
public class MySqlImpl implements IDataBase {
 
    @Override
    public String getDate() {
        return "MYSQL的时间是2010-mysql";
    }
 
}
package com.robin;
 
 
public class OracleImpl implements IDataBase {
 
    @Override
    public String getDate() {
        return "Oracle的时间是2010-oracle";
    }
 
}
package com.robin;
 
 
public class SqlServerImpl implements IDataBase {
 
    @Override
    public String getDate() {
        return "SqlServer的时间是2010-SqlServer";
    }
 
}

3.使用setter方式或者构造函数的方式定义注入类

package com.robin;
 
public class BaseDataImpl {
     
    private IDataBase database;
     
    public void setDatebase(IDataBase database){
        this.database = database;
    }
     
    public BaseDataImpl(IDataBase database){
        this.database = database;
    }
     
    public String getDate(){
        return database.getDate();
    }
 
}

4.测试一下

package com.robin;
 
public class TestGetDate {
     
    public static void main(String[] args) {
        BaseDataImpl base = new BaseDataImpl(new MySqlImpl());
        BaseDataImpl base1 = new BaseDataImpl(new OracleImpl());
        BaseDataImpl base2 = new BaseDataImpl(new SqlServerImpl());
         
        System.out.println(base.getDate());
        System.out.println(base1.getDate());
        System.out.println(base2.getDate());
    }
 
}

在测试类中调用不懂得实现类,就会输入不同的时间,我们就实现了不再采用new的方式去获取对象,只需要传入一个标示数据库类型的名字就可以了,这就是IOC的简单实现,Spring的IOC原理大体也是这样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值