持续创作,加速成长!这是我参与「掘金日新计划 · 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的注入方式
构造器注入
带参数的构造器注入方式:
setter注入
实体类:
xml配置文件:
基于注解形式注入依赖
常用注解:
- @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框架出世,注解来自动装配的也多了起来,到现在几乎都是用注解自动装配。