当前位置: 首页 > 科技观察

Spring系列中IOC的理解与分析

时间:2023-03-21 23:51:42 科技观察

按照日程安排,今天主要是Spring中IOC的理解。对IOC的理解可以从以下几个角度来分析。什么是国际奥委会?用例怎么理解?IOC的实现方式有哪些?IOC的底层实现流程是怎样的?在概念和几种注入方式上,虽然知道它的生命周期,但是对于整个bean管理的宏观视角,并没有深入的了解。IOC:**控制反转(InversionofControl)容器,**是一种设计思想。就是把你设计的对象交给容器来控制。1.1依赖注入的概念是什么理解,我准备用一个案例来表达一下。如果a类包含b类,则说明a类依赖于b类。如果一个人需要一辆车,就意味着这个人对车产生了依赖。classUser{Carcar;publicUser(){car=newCar();}}在上面的例子中,我们可以看到User类包含了Car类,也就是说User类对Car类有依赖。按照传统的方式,如果User类要使用Car,基本上需要在内部新建一个对象。但这有一个很大的缺点,新方法意味着User和Car是紧耦合的。不利于大规模使用。于是改用了另一种方法。也就是用Car的时候,直接从外面传过去就行了。在这种情况下,耦合度大大降低。看看下面的表格是不是好多了。classUser{汽车;publicUser(Carcar){this.car=car;}}这种方式就是依赖注入,即将依赖Car注入到User中。1.2什么是控制反转有了上面依赖注入的概念,马上反转控制就相对简单了。谁控制谁:传统方式User是内部new的,现在我们通过依赖注入注入依赖对象Car。现在spring出现了,发明了IOC。IOC中有一个容器,所有这些依赖对象都交给容器管理。也就是说,这些依赖对象的控制权交给了容器。如何反转:传统的方式,User是主动去new,这种方式就是正向旋转。反转是帮助创建和注入依赖对象的容器;2依赖注入的几种形式目前主要有五种注入方式:SET注入、构造函数注入、静态工厂和实例工厂。本文直接使用网上的基础案例来实现。例如,UserService依赖于UserDao。先定义UserDao,再看如何实现注入。publicclassUserDao{publicStringuserLogin(){return"userLogin()method";}}让我们看一下依赖注入的几种实现。2.1set注入第一步:XML配置Step2:injectpublicclassUserServiceinsetmode{//必须提供属性setter方法privateUserDaouserDao;publicvoiduserlogin(){Stringres=userDao.userLogin();System.out.println(res);}publicvoidsetUserDao(UserDaouserDao){this.userDao=userDao;}}这个方法简单易操作。2.2构造函数注入第一步:XML配置/beans>第2步:构造函数注入ame){super();this.userDao=userDao;this.name=name;}}2.3静态工厂注入第一步:XML配置第二步:定义静态工厂publicclassStaticFactory{publicstaticUserDaocreateuserDao(){returnnewUserDao();}}第三部分:静态工厂注入publicclassUserService{privateUserDaouserDao;publicvoiduserlogin(){Stringres=userDao.userLogin();System.out.println(res);}publicvoidsetUserDao(UserDaouserDao){this.userDao=userDao;}}2.4实例化工厂第一步:XML配置第二步:工厂注入publicclassInstanceFactory{publicUserDaocreateUserDao(){returnnewUserDao();}}以上是几种常见的注入方式它在开发中更常用。在了解了IOC的概念和几种实现方式之后,下面主要讨论IOC的底层实现原理。3IOC底层实现过程上面的几种注入方式可能会有一个疑问,就是bean是如何从xml到注入类的?见下图。SpringIOC容器初始化的核心流程主要有四个步骤(还有post-loader、国际化、eventbroadcaster等流程不展开):Bean定义定位,Bean可能定义在XML中,或者一个注释,或其他形式。这些都是Resource定位的,读取Resource获取BeanDefinition,注册到Bean定义注册中心。对容器的第一个getBean操作将触发Bean创建过程。Bean实例化时,根据BeanDefinition中的类信息来实例化Bean。将实例化的bean放入单列bean缓存中。之后如果再到容器getBean,就会从缓存中获取。这张图是核心流程。这个过程已经被简化,具体的实现方法应该设计成对bean生命周期进行管理。安排到下一章。spring的核心内容就是aop和ioc。知道了这两个是怎么实现的,就是核心bean管理的核心实现了。最后介绍一下配置文件。本文转载自微信公众号“愚公要移山”,可关注下方二维码。转载本文请联系愚公移山公众号。