spring的生命周期

硅谷探秘者 1804 0 0

bean的什么周期

        Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取得的Bean时都会产生一个新的实例,Spring只帮我们管理单例模式Bean的完整生命周期,对于prototype的bean,Spring在创建好交给使用者之后则不会再管理后续的生命周期。

过程

  1. 1.实例化一个Bean(一般通过反射创建)

  2. 2.按照Spring上下文对实例化的Bean进行配置(注入)

  3. 3.如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值

  4. 4.如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以)

  5. 5.如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法)

  6. 6.如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术

  7. 7.如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法

  8. 8.如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法

  9. 9.当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法


测试:

创建一个bean类

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class HelloWord implements 
	BeanNameAware,
	BeanFactoryAware,
	ApplicationContextAware,
	BeanPostProcessor,
	DisposableBean{
	public HelloWord(){
		System.out.println("init");
	}
	@Override
	public void setBeanName(String name) {
		// TODO Auto-generated method stub
		System.out.println("BeanNameAware");
	}
	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("BeanFactoryAware");
	}
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("ApplicationContextAware");
	}
	@Override
	public void destroy() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("DisposableBean");
	}
}

 配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TestController {
	@Bean
	public HelloWord getHelloWord() {
		HelloWord h=new HelloWord();
		return h;
	}
}

输出:

image.png


评论区
请写下您的评论...
暂无评论...
猜你喜欢
前端(h5) 2230 vue笔记参考:http://www.jiajiajia.club/search?str=vuevue对象!DOCTYPEhtmlhtml head metacharset="UTF-8
official 794   Bean描述Spring中一个Bean创建过程和销毁过程中所经历步骤,其中Bean创建过程是重点。程序员可以利用Bean机制对Bean进行自定义加工。
weblog 1753 vue对象!DOCTYPEhtmlhtml head metacharset="UTF-8" title/title scriptsrc="js/vue.min.js"/script
java基础 2162 importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;publicclassMainTest{ privatestaticfinalSimpleDateFormatf=newSimpleDateFormat("yyyy-MM-dd"
java虚拟机(jvm) 3817 类加载时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它整个包括:加载(LoadingVerification)、准备(Preparation)、解析(Resolution)、初始化
spring/springmvc 1630 service层添加事物。这些操作spring都会自动帮我们成代理对象。当我们需要在spring容器启动后获取ioc容器中对象时,这个时候获取确实代理对象了。已经不是我们对象了。这时再去获取
数据库 1028 语法:YEARWEEK(date)或YEARWEEK(date,firstdayofweek)参数值date:需要。从中提取年和或日时间值firstdayofweek:可选,指定星
前端(h5) 4016 js获取一个月前今天/***获取上一个月**@date格式为yyyy-mm-dd,如:2014-01-25*/functiongetPreMonth(date){vararr
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1 2024-08  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript 加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。