• Spring中Bean的作用域和生命周期


    目录

    Bean的作用域

    singleton 

    prototype

    request

    session

    application

    websocket

    单例作用域和全局作用域的区别

    Bean的生命周期


    Bean的作用域

    Bean的作用域是指Bean在Spring整个框架中的某种行为模式,比如singleton单例作用域,就表示Bean在整个Spring中只有一份,它是全局共享的,当其他人修改了这个值后,另一个人读取到的就是被修改的值.

    Spring容器在初始化一个Bean的实例时,同时会指定该实例的作用域.Spring有六种作用域,最后四种基于Spring MVC生效

    · singleton:单例作用域

    · prototype:原型作用域

    · request:请求作用域

    · session:会话作用域

    · application:全局作用域

    · websocket:HTTP WebSocket作用域

    singleton 

    该作用域下的Bean在IoC容器中只存在一个实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(通过@Autowired注入)都是同一个对象。

    场景:通常无状态的Bean使用该作用域,无状态表示Bean对象的属性状态不需要更新

    Spring默认选择该作用域

    prototype

    每次对该作用域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配(通过@Autowired注入)都是新的对象实例。

    通常有状态的Bean使用该作用域

    request

    每次HTTP请求都会创建新的Bean实例,类似于prototype

    一次http的请求和响应的共享bean,限定在Spring MVC中使用

    session

    在一个http session中,定义一个Bean实例

    用户会话的共享bean,比如记录一个用户的登录信息,限定在Spring MVC中使用

    application

    在一个http servlet Context中定义一个Bean实例

    Web应用的上下文信息,比如记录一个应用的共享信息,限定在Spring MVC中使用

    websocket

    在一个HTTP WebSocket的生命周期中,定义一个Bean实例

    WebSocket 的每次会话中,保存了一个 Map 结构的头信息,将用来包裹客户端消息头。第一
    次初始化后,直到 WebSocket 结束都是同一个Bean,限定在Spring MVC中使用。

    单例作用域和全局作用域的区别

    · singleton是Spring Core的作用域;application是Spring MVC中的作用域

    · singleton作用于IoC容器,而application作用于Servlet容器

    Bean的生命周期

    1、实例化Bean(为Bean分配内存空间),类似于new对象

    2、设置属性(Bean注入和装配)

    3、Bean初始化(表示Bean要初始化很多内容才能使用)

          · 实现了各种Aware通知的方法,如BeanNameAware、BeanFactoryAware、ApplicationContextAware的接口方法;bean实现这些通知接口后,在这个时机就会依次执行Aware通知接口的方法

          · 执行BeanPostProcessor初始化前置方法;BeanPostProcessor接口中的一个方法(XXXbeforeXXX)

           · 执行@PostConstruct初始化方法,依赖注入操作之后被执行;

           · 执行自己制定的init-method方法

           · 执行BeanPostProcessor初始化后置方法;BeanPostProcessor接口中的一个方法(XXXafterXXX)

    4、使用Bean

    5、销毁Bean

    代码示例 

     

    LifecycleConfig类

    1. package org.lifecycle.config;
    2. import org.lifecycle.model.MyBean;
    3. import org.springframework.beans.BeansException;
    4. import org.springframework.beans.factory.config.BeanPostProcessor;
    5. import org.springframework.context.annotation.Bean;
    6. import org.springframework.context.annotation.Configuration;
    7. @Configuration
    8. public class LifestyleConfig implements BeanPostProcessor {
    9. //如果MyBean类去掉@Service注解,就需要这么写
    10. @Bean(initMethod = "myInitMethod", destroyMethod = "destroy2")//initMethod的值,是对象中方法的名称
    11. public MyBean bean() {
    12. return new MyBean();
    13. }
    14. @Override
    15. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    16. System.out.println("BeanPostProcessor生命周期初始化前置方法");
    17. return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    18. }
    19. @Override
    20. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    21. System.out.println("BeanPostProcessor生命周期初始化后置方法");
    22. return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    23. }
    24. }

     MyBean类

    1. package org.lifecycle.model;
    2. import org.springframework.beans.BeansException;
    3. import org.springframework.beans.factory.*;
    4. import org.springframework.context.ApplicationContext;
    5. import org.springframework.context.ApplicationContextAware;
    6. import javax.annotation.PostConstruct;
    7. import javax.annotation.PreDestroy;
    8. public class MyBean implements BeanNameAware,
    9. BeanFactoryAware,
    10. ApplicationContextAware,
    11. InitializingBean,
    12. DisposableBean {
    13. public MyBean() {
    14. System.out.println("Bean对象实例化");
    15. }
    16. @Override
    17. public void setBeanName(String s) {
    18. System.out.println("BeanNameAware生命周期方法");
    19. }
    20. @Override
    21. public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
    22. System.out.println("BeanFactoryAware生命周期方法");
    23. }
    24. @Override
    25. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    26. System.out.println("ApplicationContextAware生命周期方法");
    27. }
    28. @PostConstruct
    29. public void init() {
    30. System.out.println("Bean的初始化方法:@PostConstruct");
    31. }
    32. @Override
    33. public void afterPropertiesSet() throws Exception {
    34. System.out.println("Bean的初始化方法:InitializingBean接口实现");
    35. }
    36. //初始化方法2
    37. public void myInitMethod() {
    38. System.out.println("Bean的初始化方法:@Bean(initMethod=本方法名)来制定的初始化");
    39. }
    40. //销毁方法1
    41. @PreDestroy
    42. public void destroy1() {
    43. System.out.println("Bean的销毁方法,@PreDestroy");
    44. }
    45. //销毁方法2
    46. @Override
    47. public void destroy() throws Exception {
    48. System.out.println("Bean的销毁方法,DisposableBean接口实现");
    49. }
    50. //销毁方法3
    51. public void destroy2() {
    52. System.out.println("Bean的销毁方法,@Bean(destroyMethod=本方法名)");
    53. }
    54. }

    启动类

    1. package org.lifecycle;
    2. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    3. public class App {
    4. public static void main(String[] args) {
    5. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("org.lifecycle");
    6. //销毁容器,就会执行bean的销毁方法
    7. context.close();
    8. }
    9. }

     通过输出结果,可以完整的观察到Bean对象的生命周期

     

     

  • 相关阅读:
    【解刊】Elsevier旗下CCF-B类,3区SCI,见刊快,值得投吗?
    95. 不同的二叉搜索树 II
    stm32应用、项目、调试
    C++模板编程和标准模板库(STL)
    动手学深度学习_目标检测
    C++11相较于C++98 标准新增内容:包装器
    springboot如何返回中文json,保证顺序。LinkedHashMap应用实例
    Springboot启动之后立即执行某些方法可以怎么做?Springboot生命周期,Springboot生命周期钩子函数总结大全
    Java对接微信公众号事件监听回调
    C/C++数据结构——QQ帐户的申请与登陆(散列表)
  • 原文地址:https://blog.csdn.net/qq_58284486/article/details/127973640