1、IOC基本概念和原理

1.1、什么是IOC

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做**依赖注入(Dependency Injection,简称DI**),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

通俗点讲:控制反转就是把对象创建和对象之间的调用过程,交给Spring管理。上章的基础案例就是IOC的实现。

1.2、底层实现原理

① dom4j解析xml文档;

② 工厂模式

③ 采用反射设计模式创建对象

IOC设计模式的由来

在对象的创建和相互的调用过程中,我们看一下以下最原始的实现方式:

image-1659953634458

我们想在UserService中调用UserDao的方法,需要通过以上方式来实现,可以看到耦合度还是很高的

于是便出现了以下的实现方式:

image-1659953643137

当然通过上面的工厂模式并不能将代码耦合度降至最低,在IOC的实现原理中还需要依赖上面提到的dom4j解析xml和反射模式来创建对象。

我们来看下IOC的工厂模式的实现过程:

image-1659953652689

通过以上方式实现的工厂模式进一步降低了代码的耦合度。

2、创建对象的方式

2.1、使用无参构造创建对象(Spring默认使用该方式)

下面是使用无参的形式描述一个bean,Spring初始化的时候便根据这个描述来实例化一个对象,需要注意的是User类必须拥有无参的构造方法,否则在启动spring容器的时候会报错。

<bean id="user" class="cc.leeleo.entity.User"></bean>

接下来我们写一个方法来干掉类的无参构造方法,可以看到项目在启动的过程中就已经报错了

image-1659953664715

2.2、使用有参构造创建对象

  • 下标赋值

    <!--下标赋值-->  
    <bean id="user" class="cc.leeleo.entity.User">      
    	<constructor-arg index="0" value="tiantian"/>  
    </bean>
    
  • 类型赋值

    <!--类型赋值(不建议使用)-->  
    <bean id="user" class="cc.leeleo.entity.User">      
    	<constructor-arg type="java.lang.String" value="tiantian"/>  
    </bean>
    
  • 参数名赋值当在xml配置文件加载时,容器中管理里的对象就已经初始化了(注册bean时就已经被实例化了),无需等到getBean(),

    <!--参数名赋值-->  
    <bean id="user" class="cc.leeleo.entity.User">      
    	<constructor-arg name="name" value="tiantian"/>  
    </bean>
    

    Spring容器在启动完成以后,就已经将所有bean加载到内存中了

3、Spring配置

接下来讲解一下spring的配置文件都包含哪些东西

3.1、别名

<!--别名,如果添加了别名,也可以通过别名获取到这个对象-->
  <alias name="user" alias="usernew"/>
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
User user=(User)context.getBean("usernew");
user.show();

3.2、配置

<!--
  id:bean的唯一标识符,相当于学过的对象名
  class:bean对象所对应的全限定名:包名+类型
  name:也是别名,name可以取多个别名
  -->
<bean id="usertt" class="cc.leeleo.entity.User" name="user,usr u;user2">
    <property name="name" value="张三"/>
</bean>

3.3、导入其他配置

应用场景:在开发过程中将所有的bean都写到一个配置文件中,到后期维护

以下有四个模块的配置文件,最终将他们导入至一个配置文件中

applicationContext.xml

<import resource="userBeans.xml"/>
<import resource="sysBeans.xml"/>
<import resource="companyBeans.xml"/>
<import resource="orgBeans.xml"/>

在Spring启动的时候启动总的applicationContext.xml即可将导入的其他四个配置文件中的beans加载进来了