【剑指java面试系列】第11篇-1 Spring Bean

目录

一、Spring Bean

1.1 面:谈谈Spring Bean的5个作用域?

1.2 面:Spring bean的生命周期

 

一、Spring Bean

1.1 面:谈谈Spring Bean的5个作用域?

作用域:用于确定Spring创建Bean的实例个数。

Spring bean支持5种scope,默认是Singleton

  • Singleton每一个Spring IoC容器中仅存在一个单实例bean,适合无状态的bean
  • Prototype:每次从容器中请求调用bean时,都会返回一个新的实例,适合有状态的bean【要三思,因为毕竟频繁的创建和销毁bean是有开销的】
  • 此外如果是Web容器,则还支持:
    • Request:每次Http请求都会创建一个新的bean
    • Session:会为每个session创建一个bean实例,同一个HttpSession共享同一个bean,不同的HttpSession使用不同的bean
    • GlobalSession:会为每个全局Http Session创建一个Bean实例,该作用域仅对Portlet有效,同一个全局Session共享一个bean【全局Session,在SSO中,一次登陆,处处登陆】

1.2 面:Spring bean的生命周期

Spring bean的生命流程

深究Spring中Bean的生命周期

  1. Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
  2. Bean实例化后对将Bean的引入和值注入到Bean的属性中
    • 对于普通类型的属性,例如 String,Integer等,比较容易处理,直接设置即可。但是如果某个 bean 对象依赖另一个 bean 对象,此时就不能直接设置了。Spring 容器首先要先去实例化 bean 依赖的对象,实例化好后才能设置到当前 bean 中。
  3. 检查 bean 对象是否实现了 xxxxAware 一类的接口,如果实现了则把相应的依赖设置到 bean 对象中。
    • 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法:在创建此bean的bean工厂中设置bean的名称,在普通属性设置之后调用

    • 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入:回调提供了自己的bean实例工厂,在普通属性设置之后

    • 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。:

  4. 如果存在有Bean实现了BeanPostProcessor接口,Spring就将调用他们的前置处理方法,即 postProcessBeforeInitialization(Object bean, String beanName);【通过实现BeanPostProcessor接口,我们就可以插手Bean的实例化过程】

  5. 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,检查配置文件中是否配置了 init-method 属性,如果配置了,则去调用 init-method 属性配置的方法(即调用自定义初始化方法)。[以及@PostConstruct注解,它会在构造函数之后,init方法之前执行,(自己的理解,@PostConstruct = afterPropertiesSet = init-method,都是初始化方法,不过@PostConstruct会先调用)]【比如我通过实现IntializingBean,在资讯分享网站中在spring一起来的时候就创建了一个消费者】

    • 被BeanFactory在设置所有bean属性之后调用(并且满足BeanFactory 和 ApplicationContextAware)。

  6. 如果存在有Bean 实现了BeanPostProcessor接口,Spring就将调用其后置处理方法,即 postProcessAfterInitialization(Object bean, String beanName)。我们所熟知的 AOP 就是在这里将 Adivce 逻辑织入到 bean 中的;

  7. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

  8. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。【(自己的理解,@PreDestroy = destroy = destroy-method,不过@preDestroy会先调用)】

1.3 使用Spring框架的好处是什么?

轻量:Spring是轻量的,基本的版本大约2MB

控制反转:Spring通过控制反转实现松耦合,对象由IOC容器注入,而不是自己去创建或查找依赖的对象

面向切面编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开

容器:Spring包含并管理应用中对象的生命周期和配置

MVC框架:Spring的web框架是一个精心设计的框架,是Web框架的一个很好的替代品

事务管理:Spring提供一个持续的事务管理接口,可以扩展到到上至本地事务下至全局事务(JTA)

异常处理:Spring提供方便的API把具体技术相关的异常(比如由 JDBC,Hibernate or JDO 抛出的)转化为一致的 unchecked 异常。

 

1.4 有哪些不同类型的 IOC(依赖注入)方式?

 

  • 1、构造器依赖注入: 构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。

 

  • 2、Setter方法注入: Setter 方法注入是容器通过调用无参构造器或无参 static 工厂方法实例化 bean 之后,调用该 bean 的 setter 方法,即实现了基于 setter 的依赖注入。

    最好的解决方案是用构造器参数实现强制依赖,setter 方法实现可选依赖。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值