Spring的bean作用域有哪些?Spring Bean的生命周期?bean的自动装配

Spring的bean作用域有哪些?

  1. 默认是singleton,即单例模式;每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。该对象的生命周期是与Spring IOC容器一致的(但在第一次被注入时才会创建)。可以开启懒加载,决定是否在容器启动的时候就创建对象。
  2. prototype,每次从容器调用bean时都会创建一个新的对象,比如整合Struts2框架的时候,spring管理action对象则需要这么设置。不对bean的生命周期负责。不能开启懒加载。
  3. request,每次http请求都会创建一个对象,bean被定义为在每个HTTP请求中创建一个单例对象,也就是说在单个请求中都会复用这一个单例对象。
  4. session,同一个session共享一个对象,与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean随之失效。
  5. global-session 全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。

Spring Bean的生命周期?

  • 实例化 Instantiation
  • 属性赋值 Populate
  • 初始化 Initialization
  • 销毁 Destruction
    在这里插入图片描述
    Bean实例化的时机也分为两种,BeanFactory管理的Bean是在使用到Bean的时候才会实例化Bean,ApplicantContext管理的Bean在容器初始化的时候就回完成Bean实例化。

在这里插入图片描述
在这里插入图片描述

详细的10步

  1. Bean的实例化:spring启动后,会查找和加载需要被spring管理的Bean,并且实例化。
  2. Bean属性注入:Bean被实例化后对将Bean的引入和值注入到Bean的属性中。
  3. 调用BeanNameAware的setBeanName()方法:如果实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法。
  4. 调用BeanFactoryAware的setBeanFactory()方法:如果Bean实现了BeanFactoryAware接口的话,spring就将调用他们的setBeanFactory()方法,将BeanFactory容器实例传入。
  5. 调用ApplicationContextAware的setApplicationContext方法:如果Bean实现了ApplicationContextAware接口的话,spring将调用Bean的setApplicationContext方法,将Bean所在用用上下文引用传入进来。
  6. 调用BeanPostProcessor的预初始化方法:如果Bean实现了BeanPostProcessor接口,spring将调用他们的 postProcessBeforeInitialization()方法。
  7. 调用InitializingBean的afterPropertiesSet()方法:如果Bean实现了InitializingBean接口,spring将调用他们的afterPropertiesSet()方法,类似的,如果Bean使用init-method生命了初始化方法的话,这个方法也会被调用。
  8. 调用BeanPostProcessor的初始化后的方法:如果Bean实现了BeanPostProcessor接口,spring就将调用他们的postprocessAfterInitialization()方法。
  9. Bean可以使用了:这个时候,Bean就已经准备好了,可以被应用程序使用了,他们将一直驻留在应用的上下文中,直到应用的上下文被销毁。
  10. 调用DisposableBean的destory()方法:如果Bean实现DisposableBean接口,spring将嗲用他的destory()就扣方法,相同的,如果Bean使用了destory-method生命销毁方法,该方法也会被调用。
    在这里插入图片描述
    参考大佬的博客

什么是bean的自动装配,有哪些方式?

开启自动装配,只需要在xml配置文件中定义“autowire”属性。

<bean id="cutomer" class="com.xxx.xxx.Customer" autowire="" />

autowire属性有五种装配的方式:

  • no – 缺省情况下,自动配置是通过“ref”属性手动设定 。

手动装配:以value或ref的方式明确指定属性值都是手动装配。 需要通过‘ref’属性来连接bean。

  • byName-根据bean的属性名称进行自动装配。

Cutomer的属性名称是person,Spring会将bean id为person的bean通过setter方法进行自动装配。

<bean id="cutomer" class="com.xxx.xxx.Cutomer" autowire="byName"/>
<bean  id="person" class="com.xxx.xxx.Person"/>
  • byType-根据bean的类型进行自动装配。

Cutomer的属性person的类型为Person,Spirng会将Person类型通过setter方法进行自动装配。

<bean id="cutomer" class="com.xxx.xxx.Cutomer" autowire="byType"/> 
<bean id="person" class="com.xxx.xxx.Person"/>
  • constructor-类似byType,不过是应用于构造器的参数。如果一个bean与构造器参数的类型形同,则进行自动装配,否则导致异常。

Cutomer构造函数的参数person的类型为Person,Spirng会将Person类型通过构造方法进行自动装 配。

<bean id="cutomer" class="com.xxx.xxx.Cutomer" autowire="construtor"/> 
<bean id="person" class="com.xxx.xxx.Person"/>
  • autodetect-如果有默认的构造器,则通过constructor方式进行自动装配,否则使用byType方式进行自动装配。

如果有默认的构造器,则通过constructor方式进行自动装配,否则使用byType方式进行自动装配。

@Autowired自动装配bean,可以在字段、setter方法、构造函数上使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值