基本介绍:IoC是一种帮助我们解耦各业务对象间依赖关系的对象绑定方式。
一、IoC的实现方式
1.通过构造方法实现:将依赖对象由构造方法的参数传入
2.通过setter方法实现:为每个依赖对象提供一个set方法
3.通过接口的方式实现(已经被废弃)
二、IoC的优势
下面以构造方式实现IoC,NewsProvider需要依赖对象INewsResource ,和IDataPersister 来实现相关功能。
/**
* @Description 数据抓取接口
* @Date 2021-06-29 16:30
**/
public interface INewsResource {
void getResource();
}
/**
* @Description 网易新闻抓取接口
* @Date 2021-06-29 16:31
**/
public class NeteasyNewsResource implements INewsResource{
@Override
public void getResource() {
System.out.println("爬取网易的新闻...");
}
}
/**
* @Description 新浪新闻抓取接口
* @Date 2021-06-29 16:30
**/
public class SinaNewsResource implements INewsResource{
@Override
public void getResource() {
System.out.println("爬取新浪的新闻...");
}
}
/**
* @Description 数据持久化接口
* @Date 2021-06-29 16:32
**/
public interface IDataPersister {
void save();
}
/**
* @Description 网易
* @Date 2021-06-29 16:33
**/
public class MySQLDataPersister implements IDataPersister{
@Override
public void save() {
System.out.println("保存数据到数据库...");
}
}
/**
* @Description 新闻收集器
* @Date 2021-06-29 16:29
**/
public class NewsProvider {
private INewsResource newsResource;
private IDataPersister dataPersister;
/**
* 非IoC的方式,如果改成NeteasyNewsResource,需要重新写一个NewsProvider,比较麻烦。
*
*
*/
public NewsProvider(){
newsResource = new NeteasyNewsResource();
dataPersister = new MySQLDataPersister();
}
/**
* IoC的方式:将依赖对象newsResource,dataPersister通过构造方法的方式注入到NewsProvider
*
* @param newsResource
* @param dataPersister
*/
public NewsProvider(INewsResource newsResource, IDataPersister dataPersister){
this.newsResource = new NeteasyNewsResource();
this.dataPersister = new MySQLDataPersister();
}
public void handleNews(){
// 得到数据
newsResource.getResource();
// 保存数据
dataPersister.save();
}
public static void main(String[] args){
// 非IoC方式
NewsProvider newsProvider = new NewsProvider();
newsProvider.handleNews();
// IoC方式
NewsProvider newsProviderIoC = new NewsProvider(new NeteasyNewsResource(), new MySQLDataPersister());
// 无需创建一个新的NewsProvider类,而是直接将新的数据源注入新的对象中,就可以达到切换数据源的目的。
NewsProvider newsProviderIoC1 = new NewsProvider(new SinaNewsResource(), new MySQLDataPersister());
}
}