谈谈对你Spring IoC的理解
IoC,控制反转,控制什么,反转什么?
控制:对对象的控制权反转
反转:将开发者对对象的控制权交给IoC容器
在传统的开发当中对于对象的创建销毁等通常由开发者控制,但是这会导致对象之间耦合度高,而使用IoC就可以做到解耦合,同时也可以大大降低开发难度
在Spring中,IoC容器是实现IoC的载体,IoC容器底层是由Map实现的,Map中存放的是各种对象
什么是Spring的Bean
由IoC容器管理的对象就是Bean
将一个类声明为Bean的注解有哪些?
@Component:可以用在任何类上
@Mapper:通常用在Mapper层(Dao层),主要用于和数据库打交道
@Service:通常用于服务层,主要负责处理一些复杂的业务
@Controller:通常用于控制层,主要负责接收前端传来的请求并返回数据给前端页面
@Component和@Bean有什么区别
@Component通常用在类上面,并且他一般要配合@ComponentScan一起使用,如果不使用@ComponentScan默认扫描的是当前包及其子包
@Bean通常用在方法上面,他一般出现在具体@Configuration的注解中,但是在没有@Configuration的类中同样有效
注入Bean的方法有哪些?
- 通过注解注入(字段(Field)注入)
- 通过构造函数注入
- 通过Setter方法注入
注入Bean的注解有哪些
@Autowired Spring提供的注解
@Resource JDK提供的注解
@Inject:使用较少
@Autowired和@Resource有什么区别
@Autowired:byType,类型匹配,通俗来说就是注入接口的实现类。比如说,如果一个接口有多个实现类,不指定某一个就会报错
当一个接口于多个实现类时,可以使用@Qualifier注解指明
@Qualifier(value = "name")
@Resource:byName,按名字匹配,也就是说就是通过名字去查找。如果无法通过byName查找到Bean的话,就会使用byType,使用一个接口有多个实现类不指定名字也会和@Autowired一样报错
当一个接口有多个实现类时,可以直接通过name属性指定
@Resource(name = "name")
Bean的作用域
常用两个
- singleton
- prototype
Bean是线程安全的吗
主要取决于作用域和状态
-
如果是多例prototype,那么每次获取都会创建一个新的Bean实例,是线程安全的
-
如果是单例singleton,
- 如果Bean是无状态的话,是线程安全的
- 如果Bean是有状态的话,是线程不安全的
大多数情况的Bean都是无状态的,在这种情况下是线程安全的
补充:有状态指的是有可变的成员变量的对象
Bean的生命周期
- 创建Bean的实例
- Bean属性赋值
- Bean初始化
- 销毁Bean
待补充具体过程,可以看这篇文章:如何记忆Spring Bean的生命周期 - 草捏子 (chaycao.github.io)