手动实现一个Spring 框架IOC容器
创始人
2024-02-19 05:07:08
0

一:什么是spring中的bean?

在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是由 Spring IoC 容器实例化、组装和管理的对象。通俗的来说,就是由spring的IOC容器管理的所有的对象都叫做bean。

二:什么是IOC?什么是DI

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,其中最常见的方式叫做依赖注入(Dependency Injection,简称DI。DI是控制反转实现的具体方式。
那么控制反转是什么意思呢?哪些方面的控制被反转了呢?我的答案是依赖的对象的获得被反转了。我们来看下面一段代码:

1.应用场景

假设我们现在有有两个类,其中类A有普通类型的aMethod方法,类B有普通类型的bMethod方法,现在我们想要在A类中使用B类的bMethod方法,请你分别写出,普通写法和控制反转的写法。

2.具体实现

如果我们使用普通的方式,进行使用,一般是显示的在A类直接new一个B类的对象(方法内或者类内方法外),如果是在方法内,A类依赖B类,如果在方法外,类内,A类关联B类。

//依赖使用
public class A{public void aMethod(){System.out.println("我是A类的aMethod方法");B b = new B();//调用B类的方法B.bMethod();}
}
//关联使用
public class A{B b = new B();public void aMethod(){System.out.println("我是A类的aMethod方法");//调用B类的方法B.bMethod();}
}

现在获得依赖的对象的方式,是正向的,从A类之中,直接创建一个B类对象,他们之间是紧耦合的。整个获取的过程是正向的。
使用依赖注入实现控制反转:
那么控制反转的写法该如何实现呢?

//依赖注入  构造传递
public class A{private	B b ;public B(B b) {this.b = B;}public void aMethod(){System.out.println("我是A类的aMethod方法");//调用B类的方法B.bMethod();}
}//依赖注入  Setter传递
public class A{private	B b ;public void setB(B b) {this.b = B;}public void aMethod(){System.out.println("我是A类的aMethod方法");//调用B类的方法B.bMethod();}
}

这时候,A类在未被Set进B类的对象的时候,A类和B类其实是没有关系的,因为在Set对象之前,B类的对象是一个null值。A类获取B类对象的方式变了,从主动进行获取变成了被动注入。A类和B类的耦合关系,就拿出来了。接下来我们还可以根据自己的需要,将setB获取B对象放到配置文件中,让二者的耦合放到配置文件中决定,并可以随时更改。

三:什么是IOC容器

上文我们说道,控制反转的实现,说的是一个B类对象的注入,如果多了呢?假设我们有成千上万个类,并且这写类可能还作为另一些类的属性,我们该如何进行管理呢?这时候就引出了IOC容器的概念。
IOC容器是负责实例化、配置和组装 bean。容器通过读取配置元数据来获取关于要实例化、配置和组装哪些对象的指令。

四:如何手动实现一个IOC容器

BeanFactory工厂

public class BeanFactory {//定义一个properties对象private static Properties props;//定义一个Map,用于存放我们创建的对象(单例,当类加载之后就有了对象,之后从Map中获取)private static Map beans = new HashMap<>();//容器static {try {props=new Properties();//将bean.properties放在了resources路径下InputStream is=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");props.load(is);//实例化容器//从配置文件中获取所有key值Enumeration keys = props.keys();while (keys.hasMoreElements()){//取出每一个keyString key = keys.nextElement().toString();//根据key获取valueString path = props.getProperty(key);//此处使用反射,获取类对象Object value=Class.forName(path).newInstance();//放入容器中beans.put(key,value);}}catch (Exception e){e.printStackTrace();}}//提供一个访问Map容器的入口public static Object  getInstance(String name){return beans.get(name);}
}
 

配置文件

Chassis=Chassis
Tyre=Tyre
CarBody=CarBody
Car=Car

Client方法

public class Client {public static void main(String[] args) {//车轱辘Tyre tyre = (Tyre)BeanFactory.getInstance("Tyre");//车底盘Chassis chassis= (Chassis)BeanFactory.getInstance("Chassis");//将车轮注入到车底盘chassis.setTyre(tyre);//车身CarBody carBody = (CarBody) BeanFactory.getInstance("CarBody");//将底盘注入到车身carBody.setChassis(chassis);//车Car car = (Car) BeanFactory.getInstance("Car");//将车身注入到车中car.setCarBody(carBody);car.run();}
}

注入的类

//轮子类
public class Tyre {public void tyre(){System.out.println("车轮一个");}
}
//底盘类
public class Chassis {private  Tyre tyre;public void setTyre(Tyre tyre) {this.tyre = tyre;}public void chassis(){System.out.println("底盘");}
}
//车身类
public class CarBody {private Chassis chassis;public void setChassis(Chassis chassis) {this.chassis = chassis;}public void carBody(Chassis chassis){System.out.println("车身");}
}
//车类
public class Car {private CarBody carBody;public void setCarBody(CarBody carBody) {this.carBody = carBody;}public void run(){System.out.println("车跑了");}
}

BeanFactory模拟的就是spring的IOC容器,使用容器来管理一个又一个的bean对象,在配置文件中,将这些类交由BeanFactory进行管理。

相关内容

热门资讯

将虾苗卖到“小龙虾之乡” □四川日报全媒体记者 陈丽霏  5月,鲜活肥美的小龙虾大量上市,中江县黄鹿镇也迎来了一年中最繁忙的时...
建圈强链 四川农业明确产业“路... 5月11日,四川省大邑县现代农业(粮食产业)园区,工人在试验田中开展小麦新品的测产工作。 李旭 摄(...
AI技术为品牌舆情处置带来新变...   张志恒 王鑫 济南报道  危机管理专家、新传媒网危机管理首席顾问叶东,围绕品牌舆情管理的核心理念...
341名中小学生将获益 本报讯 近日,德阳市2025年春季学期中小学特困学生“零费用入学”项目拟资助学生名单公示结束,341...
我省农业科学家发明“冷链保鲜全... □ 本报记者 张 宣 买菜时最怕遇到叶子发黄、蔫巴巴的蔬菜?现在,我省科学家研发的保鲜“神器”...
向家坝灌区一期一步工程首次大规...   眼下正值我省春灌用水高峰期。近日,在向家坝灌区一期一步工程内江供水管道出水口,清澈的金沙江水顺着...
成都11家平台拟入选 本报讯(四川日报全媒体记者 薛维睿)近日,工业和信息化部公示了首批重点培育中试平台初步名单,成都11...
深耕“三农”金融 奏响乡村振兴... 泰兴农商银行作为当地“营业网点最多、政银融合最深、综合贡献最大”的地方法人银行,始终以服务“三农”、...
中国人民抗日战争暨世界反法西斯... (新华社发) 新华社北京5月13日电 国务院新闻办公室今天公开发布中国人民抗日战争暨世界反...
硅碳负极新材料项目在内江投产 本报讯(四川日报全媒体记者 陈宇)5月13日,内江埃普诺硅碳负极新材料项目在内江经开区投产。当天点火...
这份特殊答卷,应该得到满分   评论员 张琪 郝东智  “考试可以重来,但人的生命只有一次,我不后悔!”车上急救挽回同学生命后,...
构建物流运输“云端川廊” 四川... 汶川县萝卜寨海拔较高,交通不便,通过无人机吊装运输方式可大大提高车厘子运输效率,减少损耗。无人机拍摄...
公开通报李献林、叶金广等人违规...   新华社北京5月13日电 日前,中央层面深入贯彻中央八项规定精神学习教育工作专班、中央纪委办公厅公...
外盘头条:美国撤销拜登时代AI...   全球财经媒体昨夜今晨共同关注的头条新闻主要有:  1、美国商务部撤销拜登时代AI扩散规定   ...
全年要实现306 个优良天 □四川日报全媒体记者 吴亚飞污染防治目标  大气污染防治:全年空气质量优良天数达到306天、PM2....
景顺长城中证港股通科技ETF联... 景顺长城中证港股通科技交易型开放式指数证券投资基金发起式联接基金(简称:景顺长城中证港股通科技ETF...
离岸人民币兑美元较周一纽约尾盘... 转自:财联社【离岸人民币兑美元较周一纽约尾盘涨15点】财联社5月14日电,离岸人民币(CNH)兑美元...
CBA总决赛北汽队继续拼争 图为北京北汽男篮主教练许利民。本报记者 刘平摄  本报记者 陈嘉堃  与第三场比赛间隔一天,2024...
希望与中方携手发出更强南方声音   巴西总统卢拉日前在接受中国驻巴西媒体集体采访时表示,巴方希望利用中拉论坛、金砖国家合作机制、《联...
华安大安全混合A净值下跌3.0... 华安大安全主题灵活配置混合型证券投资基金(简称:华安大安全混合A,代码002181)公布5月13日最...