简单介绍一下spring bean的生命周期_我国女性劳动参与率

简单介绍一下spring bean的生命周期_我国女性劳动参与率谈谈我对SpringBean生命周期的理解https://www.jb51.net/article/136825.htmSpring中Bean的作用域及生命周期https://cloud.tencent.com/developer/article/1377825SpringBean的生命周期在整个Spring中占有很重要的位置,掌握这些可以加深对Spring的理解…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

谈谈我对Spring Bean 生命周期的理解

https://www.jb51.net/article/136825.htm

Spring 中Bean的作用域及生命周期

https://cloud.tencent.com/developer/article/1377825

Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。这篇文章主要介绍了Spring Bean 生命周期,需要的朋友可以参考下

前言

Spring的ioc容器功能非常强大,负责Spring的Bean的创建和管理等功能。而Spring 的bean是整个Spring应用中很重要的一部分,了解Spring Bean的生命周期对我们了解整个spring框架会有很大的帮助。

BeanFactory和ApplicationContext是Spring两种很重要的容器,前者提供了最基本的依赖注入的支持,而后者在继承前者的基础进行了功能的拓展,例如增加了事件传播,资源访问和国际化的消息访问等功能。本文主要介绍了ApplicationContext和BeanFactory两种容器的Bean的生命周期。

首先看下生命周期图:

简单介绍一下spring bean的生命周期_我国女性劳动参与率

再谈生命周期之前有一点需要先明确:

Spring 只帮我们管理单例模式 Bean 的 完整 生命周期,对于 prototype 的 bean ,Spring 在创建好交给使用者之后则不会再管理后续的生命周期。

注解方式

在 bean 初始化时会经历几个阶段,首先可以使用注解 @PostConstruct , @PreDestroy 来在 bean 的创建和销毁阶段进行调用:

@Component
public class AnnotationBean {
  private final static Logger LOGGER = LoggerFactory.getLogger(AnnotationBean.class);
  @PostConstruct
  public void start(){
    LOGGER.info("AnnotationBean start");
  }
  @PreDestroy
  public void destroy(){
    LOGGER.info("AnnotationBean destroy");
  }
}

InitializingBean, DisposableBean 接口

还可以实现 InitializingBean,DisposableBean 这两个接口,也是在初始化以及销毁阶段调用:

@Service
public class SpringLifeCycleService implements InitializingBean,DisposableBean{
  private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleService.class);
  @Override
  public void afterPropertiesSet() throws Exception {
    LOGGER.info("SpringLifeCycleService start");
  }
  @Override
  public void destroy() throws Exception {
    LOGGER.info("SpringLifeCycleService destroy");
  }
}

自定义初始化和销毁方法

也可以自定义方法用于在初始化、销毁阶段调用:

@Configuration
public class LifeCycleConfig {
  @Bean(initMethod = "start", destroyMethod = "destroy")
  public SpringLifeCycle create(){
    SpringLifeCycle springLifeCycle = new SpringLifeCycle() ;
    return springLifeCycle ;
  }
}
public class SpringLifeCycle{
  private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycle.class);
  public void start(){
    LOGGER.info("SpringLifeCycle start");
  }
  public void destroy(){
    LOGGER.info("SpringLifeCycle destroy");
  }
}

以上是在 SpringBoot 中可以这样配置,如果是原始的基于 XML 也是可以使用:

<bean class="com.crossoverjie.spring.SpringLifeCycle" init-method="start" destroy-method="destroy">
</bean>

来达到同样的效果。

实现 *Aware 接口

*Aware 接口可以用于在初始化 bean 时获得 Spring 中的一些对象,如获取 Spring 上下文 等。

@Component
public class SpringLifeCycleAware implements ApplicationContextAware {
  private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleAware.class);
  private ApplicationContext applicationContext ;
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext ;
    LOGGER.info("SpringLifeCycleAware start");
  }
}

这样在 springLifeCycleAware 这个 bean 初始化会就会调用 setApplicationContext 方法,并可以获得 applicationContext 对象。

BeanPostProcessor 增强处理器

实现 BeanPostProcessor 接口,Spring 中所有 bean 在做初始化时都会调用该接口中的两个方法,可以用于对一些特殊的 bean 进行处理:

@Component
public class SpringLifeCycleProcessor implements BeanPostProcessor {
  private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleProcessor.class);
  /**
   * 预初始化 初始化之前调用
   * @param bean
   * @param beanName
   * @return
   * @throws BeansException
   */
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    if ("annotationBean".equals(beanName)){
      LOGGER.info("SpringLifeCycleProcessor start beanName={}",beanName);
    }
    return bean;
  }
  /**
   * 后初始化 bean 初始化完成调用
   * @param bean
   * @param beanName
   * @return
   * @throws BeansException
   */
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    if ("annotationBean".equals(beanName)){
      LOGGER.info("SpringLifeCycleProcessor end beanName={}",beanName);
    }
    return bean;
  }
}

执行之后观察结果:

018-03-21 00:40:24.856 [restartedMain] INFO c.c.s.p.SpringLifeCycleProcessor - SpringLifeCycleProcessor start beanName=annotationBean
2018-03-21 00:40:24.860 [restartedMain] INFO c.c.spring.annotation.AnnotationBean - AnnotationBean start
2018-03-21 00:40:24.861 [restartedMain] INFO c.c.s.p.SpringLifeCycleProcessor - SpringLifeCycleProcessor end beanName=annotationBean
2018-03-21 00:40:24.864 [restartedMain] INFO c.c.s.aware.SpringLifeCycleAware - SpringLifeCycleAware start
2018-03-21 00:40:24.867 [restartedMain] INFO c.c.s.service.SpringLifeCycleService - SpringLifeCycleService start
2018-03-21 00:40:24.887 [restartedMain] INFO c.c.spring.SpringLifeCycle - SpringLifeCycle start
2018-03-21 00:40:25.062 [restartedMain] INFO o.s.b.d.a.OptionalLiveReloadServer - LiveReload server is running on port 35729
2018-03-21 00:40:25.122 [restartedMain] INFO o.s.j.e.a.AnnotationMBeanExporter - Registering beans for JMX exposure on startup
2018-03-21 00:40:25.140 [restartedMain] INFO com.crossoverjie.Application - Started Application in 2.309 seconds (JVM running for 3.681)
2018-03-21 00:40:25.143 [restartedMain] INFO com.crossoverjie.Application - start ok!
2018-03-21 00:40:25.153 [Thread-8] INFO o.s.c.a.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@3913adad: startup date [Wed Mar 21 00:40:23 CST 2018]; root of context hierarchy
2018-03-21 00:40:25.155 [Thread-8] INFO o.s.j.e.a.AnnotationMBeanExporter - Unregistering JMX-exposed beans on shutdown
2018-03-21 00:40:25.156 [Thread-8] INFO c.c.spring.SpringLifeCycle - SpringLifeCycle destroy
2018-03-21 00:40:25.156 [Thread-8] INFO c.c.s.service.SpringLifeCycleService - SpringLifeCycleService destroy
2018-03-21 00:40:25.156 [Thread-8] INFO c.c.spring.annotation.AnnotationBean - AnnotationBean destroy

直到 Spring 上下文销毁时则会调用自定义的销毁方法以及实现了 DisposableBean 的 destroy() 方法。

总结

以上所述是小编给大家介绍的Spring Bean 生命周期,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

 

Spring Bean对象的作用域:

在Spring容器中管理的Bean对象,可以在声明时通过scope属性或者相关注解指定其作用域

在Spring容器中,Bean对象的作用域一共有5种:singleton(单例模式)、prototype(原型模式)、request(HTTP请求)、session(会话)、global-session(全局会话)。

简单介绍一下spring bean的生命周期_我国女性劳动参与率

Bean的五种作用域

其中最常用的是singleton和prototype两种:

1)singleton(单例模式)

singleton是默认的作用域,当我们定义Bean时,如果没有给scope指定属性值,Spring会默认Bean的作用域为singleton。singleton属于单例模式,被singleton标识的对象具备全局唯一性,也就是在整个spring的容器中有且仅有一个该Bean的实例。

singleton的 配置文件如下:

<!-- 通过指定scope属性的值,来确定Bean的作用域 -->
<bean id="user" class="com.beans.User" 
   scope="singleton">
</bean>

2)prototype:这个作用域标识的对象每次获取调用都会创建新的对象

<!-- 通过指定scope属性的值,来确定Bean的作用域 -->
<bean id="user" class="com.beans.User" 
    scope="prototype">
</bean>

至于request(HTTP请求)、session(会话)、global-session(全局会话)三种作用域,用的话一般会配合SpringMVC框架进行使用,在这里不做深入了解;

Bean的生命周期

在Spring框架应用中,所有的Bean对象都有生命周期,就是指Bean对象的创建,初始化,服务,销毁的这个过程,我们称之为Bean对象的生命周期;

在Spring配置文件中,我们可以通过配置init-method,destory-method的属性来指定Bean的生命周期方法。

<!-- 比如连接池的配置 -->
<bean id="cPool" class="com.beans.ConnectionPool"
      scope="singleton"
      init-method="init"
      destroy-method="close">
</bean>

在链接池的配置中,我们可以为连接池指定由连接池提供的 init close 的方法来给连接池对象指定生命周期。

在Spring中Bean对象的销毁是由Bean对象的作用域的配置来决定的:

1、singleton 作用域的对象可以在容器关闭时会由Spring调用对象的销毁资源的方法来销毁Bean对象;

2、prototype 作用域的对象可以由容器创建对象,初始化对象,但Spring容器不负责销毁。

另外在Spring框架应用中,容器初始化时会默认构建所有由Spring管理的对象,但如果这些对象长时间不使用还占着内存就会造成一定的资源浪费,为了解决这个问题,Spring中还提供了一种延时加载机制,以此来提高系统资源的有效使用。

Spring 中的延时加载有两种方式:

1)在bean元素中将 lazy-init 属性的值设为 false,这种方式只对当前设置的单个bean元素有效:

<!-- 例如连接池的延时加载设置 -->
<bean id="cPool" class="com.beans.ConnectionPool"
      scope="singleton"
      init-method="init"
      destroy-method="close"
      lazy-init="false">
</bean>

2)在beans元素中将 default-lazy-init 属性的值设为 true ,这种方式用于指定 beans 标签中所有 bean 的延时加载策略。例如:

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
    xmlns="http://www.springframework.org/schema/beans" 
    xsi:schemaLocation="  
       http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
       
    <bean id="cPool" 
			class="com.beans.ConnectionPool" 
			scope="singleton" 
			init-method="init" 
			destroy-method="destroy">
	 </bean>
	
</beans>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193094.html原文链接:https://javaforall.net

(0)
上一篇 2025年12月2日 上午10:22
下一篇 2025年12月2日 上午11:01


相关推荐

  • IT信息化厂商

    IT信息化厂商这是软件厂商公司名单库 更新版 希望能给软件圈 关注软件圈的朋友 提供一个可参考的文档 以下 enjoy 1 ERP 厂商 sap oracle 赛捷 sage 用友 金蝶 鼎捷 神州数码 浪潮 新中大 东软 中软 宝信软件 博科 天元国信 微软 正航软件 管家婆 金算盘 管易 智邦国际 德米萨 通易 精效 ERP 万里牛懒人 ERP 来钱快速达 任我行 美萍 精算软件 艾特 快普 商友 东华软件 高格 ERP 汉得信息 哲霖软件 九天软件 网店管家 吉客云 2

    2026年3月19日
    2
  • 利用IDEA搭建SpringBoot项目,整合mybatis,实现简单的登录功能。

    利用IDEA搭建SpringBoot项目,整合mybatis,实现简单的登录功能。利用 IDEA 搭建 SpringBoot 项目 整合 mybatis 实现简单的登录功能 利用闲余时间想自己搭建一个 springboot mybatis 的项目 提升一下自己对项目的了解 毕竟自己还是一个小白 在这里为自己创建项目的过程做一个记录 以便以后回忆 同时将搭建中遇到的问题也在这里做记录 如有遇到同样问题的同学 希望能给你一下借鉴 springboot 的优势之一

    2026年3月19日
    2
  • shiro框架使用_shiro配置

    shiro框架使用_shiro配置一、什么是ShiroApacheShiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能:认证-用户身份识别,常被称为用户“登录”;授权-访问控制;密码加密-保护或隐藏数据防止被偷窥;会话管理-每用户相关的时间敏感的状态。对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro要简单的多。二

    2025年10月3日
    5
  • Spidermonkey_gomonkey

    Spidermonkey_gomonkey参考如下:最近升级了系统到MacOSX10.10并且更新了XCode6.1和iOS8.1之前app用到的libmp3lame.a静态库,也要支持64位的模拟器(x86_64)和64位的真机(arm64)指令集。需要重新编译查阅了下资料,按照如下步骤,并做了些注释和改动1.http://sourceforge.net/projects/lame/files/lame/3.9…

    2022年10月16日
    4
  • python 保留小数位数不够补0_python怎么赋值

    python 保留小数位数不够补0_python怎么赋值对于python的初学者,通常情况下,只需要输出结果符合预期即可,所以通常情况下,print就能够满足需求。print但是如果对于数据流转的情况下,我一开始没有找到合适的方法:例如,我想把1.2000保留三位有效数字,如果按照其他方法:a=1.2345print(round(a,3))输出的结果是:1.234末尾有0但是如果是要将1.2000保留三位有效数字呢:a=…

    2022年8月12日
    6
  • 支持二级汉字的 php 汉字助记码生成

    支持二级汉字的 php 汉字助记码生成gbk2312编码范围共94区,0-55区为一级汉字,是按照拼音顺序排列的,可以按照编码区间确定汉字的拼音,但是56区以后是按笔画顺序排列的,所以只能用对照表来确定拼音鉴于目前我找不到现成的代码,固整理了一份,测试可用./***PHP汉字转拼音*echoCUtf8_PY::encode(‘字符串’);//编码为拼音首字母*echoCUtf8_P…

    2022年6月21日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号