Spring中Bean的作用域、生命周期知识点总结

  • 时间:
  • 8691人关注

这篇文章主要介绍了浅谈Spring中Bean的作用域、生命周期,具有一定借鉴价值,需要的朋友可以参考下,另外这篇文章主要知识点是关于spring、bean生命周期、springbean的生命周期、spring、bean的作用域、spring、bean作用域、spring中bean的作用域、Spring的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

本文主要探究的是关于Bean的作用域、生命周期的相关内容,具体如下。

Bean的作用域

Spring 3中为Bean定义了5中作用域,分别为singleton(单例)、prototype(原型)、request、session和global session,5种作用域说明如下:

1.singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式,配置为:

<bean id="userDao" class="com.ioc.UserDaoImpl" scope="singleton"/>

2.prototype:原型模式,每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而singleton全局只有一个对象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。

3.request:在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。

<bean id="loginAction" class="com.cnblogs.Login" scope="request"/> ,针对每一次Http请求,Spring容器根据该bean的定义创建一个全新的实例,且该实例仅在当前Http请求内有效,而其它请求无法看到当前请求中状态的变化,当当前Http请求结束,该bean实例也将会被销毁。

4.session:在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。

<bean id="userPreference" class="com.ioc.UserPreference" scope="session"/>,同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,则实例将被销毁。

5.global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。

Bean的生命周期

经过如上对Bean作用域的介绍,接下来将在Bean作用域的基础上讲解Bean的生命周期。

Spring容器可以管理singleton作用域下Bean的生命周期,在此作用域下,Spring能够精确地知道Bean何时被创建,何时初始化完成,以及何时被销毁。而对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean的实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的Bean的生命周期。Spring中Bean的生命周期的执行是一个很复杂的过程,读者可以利用Spring提供的方法来定制Bean的创建过程。Spring容器在保证一个bean实例能够使用之前会做很多工作:

浅谈Spring中Bean的作用域、生命周期

浅谈Spring中Bean的作用域、生命周期

总结

以上就是本文关于浅谈Spring中Bean的作用域、生命周期的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

码农之家
详解SpringIOC容器中bean的作用范围和生命周期

4小时28分钟前回答

详解SpringIOC容器中bean的作用范围和生命周期

bean的作用范围:
可以通过scope属性进行设置:

  • singleton 单例的(默认)
  • prototype 多例的
  • request 作用于web应用的请求范围
  • session 作用于web应用的会话范围
  • global-session 作用于集群环境的会话范围(全局会话范围)

测试:

<!-- 默认是单例的(singleton)-->
<bean id="human" class="com.entity.Human"></bean>
<bean id="human" class="com.entity.Human" scope="singleton"></bean>
@Test
 public void test(){
  //通过ClassPathXmlApplicationContext对象加载配置文件方式将javabean对象交给spring来管理
  ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
  //获取Spring容器中的bean对象,通过id和类字节码来获取
  Human human = applicationContext.getBean("human", Human.class);
  Human human1 = applicationContext.getBean("human", Human.class);
  System.out.println(human==human1);
 }

结果:

将scope属性设置为prototype时

  <bean id="human" class="com.entity.Human" scope="prototype"></bean>

结果:

singleton和prototype的区别

  • 如果bean属性设置为singleton时,当我们加载配置文件时对象已经被初始化
  • 而如果使用prototype时,对象的创建是我们什么时候获取bean时什么时候创建对象

当设置为prototype时


当设置为singleton时

bean对象的生命周期

单例对象:

  • 出生:当容器创建时对象出生
  • 活着:只有容器还在,对象一直活着
  • 死亡:容器销户,对象死亡
  • 单例对象和容器生命周期相同

测试:
先设置属性init-method和destroy-method,同时在person类中写入两个方法进行输出打印

 public void init(){
  System.out.println("初始化...");
 }

 public void destroy(){
  System.out.println("销毁了...");
 }
<bean id="person" class="com.entity.Person" scope="singleton" init-method="init" destroy-method="destroy">
   
  </bean>

测试类:

@Test
 public void test(){
  //通过ClassPathXmlApplicationContext对象加载配置文件方式将javabean对象交给spring来管理
  ClassPathXmlApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
//  //获取Spring容器中的bean对象,通过id和类字节码来获取
  Person person = Context.getBean("person", Person.class);
  //销毁容器
  Context.close();
 }

结果:

总结:单例对象和容器生命周期相同

当属性改为prototype多例时

  • 出生:当我们使用对象时spring框架为我们创建
  • 活着:对象只要是在使用过程中就一直活着
  • 死亡:当对象长时间不用,且没有别的对象应用时,由java垃圾回收器回收对象

测试类:

@Test
 public void test(){
  //通过ClassPathXmlApplicationContext对象加载配置文件方式将javabean对象交给spring来管理
  ClassPathXmlApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
//  //获取Spring容器中的bean对象,通过id和类字节码来获取
  Person person = Context.getBean("person", Person.class);
  //销毁容器
  Context.close();
 }

结果:

总结:由于Spring容器不知道多例对象什么时候使用,什么时候能用完,只有我们自己知道,因此它不会轻易的把对象销毁,它会通过java垃圾回收器回收对象

到此这篇关于SpringIOC容器中bean的作用范围和生命周期的文章就介绍到这了,更多相关SpringIOC容器bean作用范围和生命周期内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!

展开阅读

上一篇:springboot中的jar包部署步骤总结

下一篇:Jetty启动项目中引用json-lib相关类库报错ClassNotFound怎么办

相关内容

  • Spring启动后获取特定注解的Bean实例分析

    这篇文章主要介绍了Spring启动后获取所有拥有特定注解的Bean实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    06-07Spring获取特定注解的Bean实例

    阅读更多
  • Spring Boot 2企业应用实战

    Spring Boot 2企业应用实战

    本书全面介绍了全新的Spring Boot 2和常用第三方框架整合开发相关的各方面知识。书中操作步骤细致,编程思路清晰,语言平实易懂。读者参考本书的架构,可以身临其境地感受企业实际项目开发。

    大小:92.99 MBSpring Boot

    点击下载
  • 深入浅出Spring Boot 2.x

    深入浅出Spring Boot 2.x

    spring boot 2实战精髓 企业级应用开发实战 微服务实战指南 结合主流持久层框架MyBatis 讲述企业级Spring Boot开发要点 赠送作者讲解的部分配套视频课程

    大小:257.67 MBSpring Boot

    点击下载
  • Spring Data JPA从入门到精通

    Spring Data JPA从入门到精通

    真正的从入门到精通,结合案例与工程实践,深入浅出,完整介绍Spring Data JPA,既是开发手册,又是实战指南,从整体到局部,深刻认识Spring Data JPA

    大小:84.93 MBSpring

    点击下载

学习笔记

22小时13分钟前回答

spring boot拦截器注入不了java bean的原因

一、如何实现拦截器 在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作。拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理。实现拦截器的方式很简单,主要由以下两个步骤: 自定义拦截器类实现HandlerInterceptor接口 自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类 简要实现代码如下: 自定义拦截器 LoginInterceptor: public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("token"); if(StringUtils.isEmpty(token)){ ... return false; } return true; }} 配置自定义拦截……

12小时28分钟前回答

解决Spring Boot 多模块注入访问不到jar包中的Bean问题

情景描述 一个聚合项目spring-security-tutorial,其中包括4个module,pom如下所示: project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" modelVersion4.0.0/modelVersion groupIdcom.github.jdkong.security/groupId artifactIdspring-security-tutorial/artifactId version1.0-SNAPSHOT/version packagingpom/packaging modules`` modulesecurity-core/module modulesecurity-app/module modulesecurity-browser/module modulesecurity-demo/module /modules !-- 其他部分省略-- /project 在此项目中,子项目security-browser是一个简单的maven项目,打成jar包,供security-demo使用,security-demo项目是一个springboot项目。……