不是还有人把Spring IOC和DI混为一谈吧?

73 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

IOC是什么?

IOC全称是Inversion of Control,控制反转。它是一种设计思想,由容器将设计好的对象交给容器控制,而非对象内部直接new。

控制反转的意思就是把我们创建实例的权限交给Spring,由Spring创建实例,并管理实例的生命周期。

IOC是Spring的核心,也是面试中会经常被问到的问题,但是总有人会把IOC和DI混为一谈,问他什么是IOC?,他直接回答DI的内容,而没有说清楚它们之间的关系,面试官听完你的回答,内心就已经把淘汰了,但出于礼貌以及公司的面子考虑,面试官还是会和你客套几句,但无疑这场面试你被淘汰了。

IOC和DI

DI是什么?

DI全称Dependency Injection,即依赖注入。

DI是Spring框架核心IOC的具体实现。

或者说DI是IOC这一设计思想的实现。

IOC核心思想就是控制反转,把对象交给容器控制,而DI的核心就是把对象注入容器。

DI的注入方式

构造器注入

带参数的构造器注入方式: image.png

setter注入

实体类:

image.png

xml配置文件:

image.png

基于注解形式注入依赖

常用注解:

  • @Value
  • @Resource
  • @Autowired

@Value的使用,只能添加到普通类型上

@Component(value = "student")
public class Student {
    @Value("1")
    private Integer id;
}

@Resuorce注解的使用如下,其由JSR-250提供,默认按照名称装配,当没有匹配到该名称的bean,会退而按照类型匹配,匹配不到,则抛出异常。

@Component(value = "student")
public class Student {
   @Resource
   private Worker worker;

@Autowired的使用如下,由Spring提供,默认按照类型来装配,当找不到该类型时会抛出异常

@Component(value = "student")
public class Student {
   @Autowired
   private Worker worker;

工厂注入

这里简单演示一下工厂注入:

package com.bless.springdemo.factory;  
  
import com.bless.springdemo.dao.FactoryDao;  
import com.bless.springdemo.dao.impl.FactoryDaoImpl;  
import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl;  
  
public class DaoFactory {  
    //静态工厂  
    public static final FactoryDao getStaticFactoryDaoImpl(){  
        return new StaticFacotryDaoImpl();  
    }  
}  


public class DaoAction {  
    // 注入对象  
    private FactoryDao factoryDao;  
      
    public void staticFactorySave(){  
        factoryDao.saveFactory();  
    }  
    // 注入对象的set方法  
    public void setFactoryDao(FactoryDao factoryDao) {  
        this.factoryDao = factoryDao;  
    }  
}  


<!--配置bean,配置后该类由spring管理-->  

<bean name="springAction" class="com.demo.springdemo.action.DaoAction" >  
        <!--使用静态工厂的方法注入对象-->  
        <property name="factoryDao" ref="factoryDao"></property>  
        </property>  
</bean>  

<!--获取对象的方式是从工厂类中获取静态方法-->  
<bean name="staticFactoryDao" class="com.demo.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>  

工厂注入是使用最少的,几乎不会使用,在Spring Boot框架未出现之前,在使用SSH框架的时候,大家经常使用的注入方式一般是构造器注入、setter方法注入,后面SSM框架出世,注解来自动装配的也多了起来,到现在几乎都是用注解自动装配。