首页 > 其他分享 >说说 Bean 的生命周期

说说 Bean 的生命周期

时间:2023-11-04 15:57:24浏览次数:32  
标签:生命周期 Spring springframework Bean beans import org

说说 Bean 的生命周期

(29条消息) Spring中bean的生命周期_kykangyuky的博客-CSDN博客

解题思路

得分点 Spring Bean 生命周期的四大部分以及详细步骤

标准回答

Bean的生命周期主要包括:Bean定义,Bean初始化,Bean生存期,Bean销毁。

具体步骤如下

  1. Spring 启动,需要查找并加载,Spring 管理的 Bean,进行 Bean 的实例化。

  2. Bean实例化后,进行Bean的属性依赖注入。

  3. 如果 Bean 实现了 BeanNameAware 接口的话,Spring 将 Bean 的 Id 传递给 setBeanName() 方法去执行

    package org.springframework.beans.factory;
    
    public interface BeanNameAware extends Aware {
    	void setBeanName(String name);
    }
    
  4. 如果 Bean 实现了 BeanFactoryAware 接口的话,Spring 将调用 setBeanFactory() 方法,将 BeanFactory 的 ioc容器实例传入

    package org.springframework.beans.factory;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.BeanFactoryAware;
    import org.springframework.beans.factory.SmartInitializingSingleton;
    import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
    
    @Configuration
    public class CanalGlueAutoConfiguration implements SmartInitializingSingleton, BeanFactoryAware {
    
        private ConfigurableListableBeanFactory configurableListableBeanFactory;
    
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            this.configurableListableBeanFactory = (ConfigurableListableBeanFactory) beanFactory;
        }
    }
    
  5. 如果 Bean 实现了ApplicationContextAware 接口的话,Spring 将调用 Bean 的 setApplicationContext() 方法,将 bean 所在应用上下文引用传入进来。

    package com.mall4j.cloud.common.util;
    
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    
    @Component
    public class SpringContextUtils implements ApplicationContextAware {
    
    	public static ApplicationContext applicationContext;
    
    	@SuppressWarnings("NullableProblems")
    	@Override
    	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    		SpringContextUtils.applicationContext = applicationContext;
    	}
    
    }
    
    
  6. 如果Bean实现了 BeanPostProcessor 接口,Spring 就将调用他们的 postProcessBeforeInitialization() 方法。

    package org.springframework.beans.factory.config;
    
    import org.springframework.beans.BeansException;
    import org.springframework.lang.Nullable;
    
    
    public interface BeanPostProcessor {
    
    	@Nullable
    	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    
    	@Nullable
    	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    
    }
    
    
  7. 如果 Bean 实现了 InitializingBean 接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用

    package com.mall4j.cloud.biz.config;
    
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    
    @Component
    public class MinioTemplate implements InitializingBean {
    
        @Autowired
        private OssConfig ossConfig;
    
        private MinioClient minioClient;
    
        static  final Logger logger = LoggerFactory.getLogger(MinioTemplate.class);
    
        @Override
        public void afterPropertiesSet() throws Exception {
            this.minioClient =  MinioClient.builder().endpoint(ossConfig.getEndpoint())
                    .credentials(ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret())
                    .build();
        }
    
    }
    
    
  8. 如果 Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。

    package org.springframework.beans.factory.config;
    
    import org.springframework.beans.BeansException;
    import org.springframework.lang.Nullable;
    
    
    public interface BeanPostProcessor {
    
    	@Nullable
    	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    
    	@Nullable
    	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    
    }
    
    
  9. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

  10. 如果 Bean 实现了 DisposableBean 接口,Spring 将调用它的destory()接口方法,同样,如果bean使用了destory() 声明销毁方法,该方法也会被调用。

    package org.springframework.beans.factory;
    
    public interface DisposableBean {
    
    	void destroy() throws Exception;
    
    }
    
    

加分回答

这个过程是由Spring容器自动管理的,其中有两个环节我们可以进行干预。

  1. 我们可以自定义初始化方法,并在该方法前增加@PostConstruct注解,届时Spring容器将在调用SetBeanFactory方法之后调用该方法。

  2. 我们可以自定义销毁方法,并在该方法前增加@PreDestroy注解,届时Spring容器将在自身销毁前,调用这个方法。

具体流程如下:

1,spring启动,查找并加载所需的Bean,然后初始化。

2,进行Bean的属性依赖注入。

3,如果Bean实现了BeanNameAware接口(@Resource,@Qualifier),spring会将Bean的Id传入SetBeanName方法去执行。

4,如果Bean实现了BeanFactoryAware接口,spring会调用Bean的setBeanFactory方法将BeanFactory的ioc容器传入。

5,如果Bean实现的时ApplicationContextAware接口的话,Spring会调用Bean的setApplicationContext将Bean应用的上下文传入进来。

6,还一些其他的设定例如使用@PostContruct来定义Bean在初始化时执行的方法,或者使用@PreDestory来定义Ioc容器被销毁时执行的方法等。

标签:生命周期,Spring,springframework,Bean,beans,import,org
From: https://www.cnblogs.com/liuzonglin/p/17724618.html

相关文章

  • JavaScript函数变量的生命周期,自执行函数、闭包、反转数组案例及冒泡排序案例
    一、变量的生命周期JavaScript变量的生命期从它们被声明的时间开始。局部变量会在函数运行以后被删除。全局变量会在页面关闭后被删除。二、自执行函数执行函数通常都是定义之后立即执行,以后都不再会调用,所以声明时可以省略函数名,因此自执行函数又叫匿名函数。通用的自执行......
  • Spring Boot Bean的多种加载方式
     在SpringBoot中,您可以以多种方式加载Bean,这取决于项目的需求和设计。以下是一些常见的加载Bean的方式以及相应的示例源代码。1.组件扫描(ComponentScanning)组件扫描是SpringBoot中默认的Bean加载方式,它会自动扫描指定包及其子包,寻找带有@Component及其衍生注......
  • in org.springframework.cache.annotation.ProxyCachingConfiguration required a be
    我的项目是springboot项目,在启动过程中报错如何下Parameter0ofmethodcacheAdvisorinorg.springframework.cache.annotation.ProxyCachingConfigurationrequiredabeanoftype'org.springframework.cache.interceptor.CacheOperationSource'thatcouldnotbefound......
  • springboot正常启动的时候,@Configuration的@Bean属于初始化就得加载的,当该springboot
      ......
  • Redis队列升级版利用Spring项目BeanDefinition自动注入
    利用Redis实现队列先进先出队列:https://www.cnblogs.com/LiuFqiang/p/16366813.html延迟队列:https://www.cnblogs.com/LiuFqiang/p/16592522.html定长队列:https://www.cnblogs.com/LiuFqian/p/17372463.html在使用Redis做消息队列的时候,需要配置队列属性的bean,如果自己项目......
  • 【keng】 Vue2 多次传参进入同一页面 页面不走生命周期函数
    比如一个搜索跳转功能 搜索123进入页面加载数据再次搜索456 还是进入这个页面这个页面就不会走生命周期了 解决方案在App.vue上为router-view增加一个key 这个key就是随便写一个随机数就可以不要重复eg:  ......
  • spring注入bean错误-Bean named 'abc' is expected to be of type 'AAA' but was actu
    先看如下两个注入到spring容器中的bean,一个是UserNewManager,一个是UserManager。@ServicepublicclassUserNewManager{publicvoiddoSomething(){}}@ServicepublicclassUserManager{...}再看下面的testcase,利用@Resource注解来注入bean。@SpringB......
  • spring BeanFactory版本的快速入门
       代码示例:  publicstaticvoidmain(String[]args){//创建一个工厂对象DefaultListableBeanFactorybeanFactory=newDefaultListableBeanFactory();//创建一个读取器(读xml文件)XmlBeanDefinitionReaderreader=newXmlBeanDefinitionRead......
  • Pod生命周期说明
    一、Pod生命周期Pod对象从创建开始至终止退出之间的时间称为其生命周期,这段时间里的某个时间点,Pod会处于某个特定的运行阶段或相位(phase),以概括描述其在生命周期中所处的位置。Kubernetes为Pod资源严格定义了5种相位,并将特定Pod对象的当前相位存储在其内部的子对象PodStatus的phas......
  • Spring Bean 名称暗藏玄机,这样取名就不会被代理
    一些使用小细节就是在不断的源码探索中逐步发现的,今天就来和小伙伴们聊一下通过beanName的设置,可以让一个bean拒绝被代理!1.代码实践假设我有如下一个切面:@Aspect@EnableAspectJAutoProxy@ComponentpublicclassLogAspect{@Pointcut("execution(*org.javaboy.demo.s......