spring中的bean的生命周期
bean的生命周期:bean的创建 —— 初始化 ——销毁的过程
容器管理bean的生命周期,我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期就会调用我们的方法
在xml配置文件中是在bean的标签内使用init-method和destroy-method
<bean id="person" class="com.springbean.Person" init-method="" destroy-method="" >
这里我们使用注解的方法
第一种指定初始化和销毁方法
首先创建一个bean
public class Foo {
public Foo(){
System.out.println("bean的创建");
}
public void init(){
System.out.println("bean的初始化");
}
public void destroy(){
System.out.println("bean的销毁");
}
}
创建一个配置类:
@Bean注解上指定初始化和销毁方法
@Configuration
public class MainBeanConfig {
@Bean(initMethod = "init",destroyMethod = "destroy")
public Foo foo(){
return new Foo();
}
}
测试:
public class BeanTest {
@Test
public void test(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainBeanConfig.class);
}
}
bean如果没有指定作用域,就是单例的,就在容器加载的时候就会创建bean,所以打印的结果是:
bean的创建
bean的初始化
销毁:当容器关闭的时候,就会调用destroy方法,打印 bean的销毁
applicationContext.close();
如果要指定bean的作用域为prototype,就需要在配置类中MainBeanConfig,加上注解@Scope("prototype"),如
@Bean
@Scope("prototype")
public Foo foo(){
return new Foo();
}
指定bean的作用域为@Scope("prototype"),这时候容器加载的时候就不会创建和初始化bean,而是在获取bean的时候。
容器关闭的时候也不会去调用destroy方法,需要自己手动调用。
第二种我们通过bean实现InitializingBean(定义初始化逻辑)和DisposableBean(定义销毁逻辑)
创建一个类Hero,实现InitializingBean,DisposableBean接口,加上注解@Component
@Component
public class Hero implements InitializingBean,DisposableBean { public Hero(){
System.out.println("创建");
}
@Override
public void destroy() throws Exception {
System.out.println("销毁");
} @Override
public void afterPropertiesSet() throws Exception {
System.out.println("初始化");
}
}
在配置中加上注解ComponentScan去扫描包,也可以使用@Import来将组件加入容器中
如:@Import({Hero.class})
@ComponentScan("com.springbean")
public class MainBeanConfig {
测试:
@Test
public void test(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainBeanConfig.class);
applicationContext.close();
}
打印结果:
创建
初始化
销毁
第三种使用@PostConstruct(构造器创建之后)和@PreDestroy(容器销毁之前)两个注解,这是JSR250的两个注解。
@PostConstruct
public void init(){
System.out.println("bean的初始化");
} @PreDestroy
public void destroy(){
System.out.println("bean的销毁");
}
第四种使用BeanPostProcessor后置处理器,这个接口中有两个方法postProcessBeforeInitialization和postProcessAfterInitialization:
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;
Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}
分别在bean初始化之前执行这个方法,这个类似aop里面的前后通知,写一个实现类MyBeanPostProcesser
/**
*后置处理器,处理前后初始化的工作
*/
@Component
public class MyBeanPostProcesser implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println(" postProcessBeforeInitialization ...beanname="+s+",bean="+o);
return o;
} @Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("postProcessAfterInitialization.... beanname="+s+",bean="+o);
return o;
}
}
加入到配置类中MainBeanConfig
@Configuration
@Import({Hero.class, MyBeanPostProcesser.class})
public class MainBeanConfig {
测试:输出结果,是在bean的初始化的前后操作
postProcessBeforeInitialization ...beanname=com.springbean.Hero,bean=com.springbean.Hero@4ba2ca36
初始化
postProcessAfterInitialization.... beanname=com.springbean.Hero,bean=com.springbean.Hero@4ba2ca36
spring中的bean的生命周期的更多相关文章
- (转)Spring管理的Bean的生命周期
http://blog.csdn.net/yerenyuan_pku/article/details/52834011 bean的初始化时机 前面讲解了Spring容器管理的bean的作用域.接着我们 ...
- Spring基础14——Bean的生命周期
1.IOC容器中的Bean的生命周期方法 SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务.SpringIOC容器对Bean的生命周期进行管理 ...
- spring-第八篇之容器中的bean的生命周期
1.容器中的bean的生命周期 spring容器可以管理singleton作用域的bean的生命周期,包括bean何时被创建.何时初始化完成.何时被销毁.客户端代码不能控制该类型bean的销毁.spr ...
- Spring 学习笔记---Bean的生命周期
生命周期图解 由于Bean的生命周期经历的阶段比较多,我们将通过一个图形化的方式进行描述.下图描述了BeanFactory中Bean生命周期的完整过程: Bean 的生命周期从Spring容器着手实例 ...
- Spring实战(二)Spring容器和bean的生命周期
引入问题: 在XML配置文件中配置bean后,这些文件又是如何被加载的?它们被加载到哪里去了? Spring容器——框架核心 1.什么是Spring容器?它的功能是什么? 在基于Spring的应用中, ...
- spring(二):bean的生命周期
bean的生命周期指的是bean的创建——>初始化——>销毁的过程,该过程是由spring容器进行管理的 我们可以自定义bean初始化和销毁的方法:容器在bean进行到当前生命周期时,调用 ...
- Spring初学之bean的生命周期
实体Bean: Car.java: package spring.beans.cycle; public class Car { private String name; private int pr ...
- 面试突击80:说一下 Spring 中 Bean 的生命周期?
Java 中的公共类称之为 Bean 或 Java Bean,而 Spring 中的 Bean 指的是将对象的生命周期,交个 Spring IoC 容器来管理的对象.所以 Spring 中的 Bean ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring Bean的生命周期
Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁. 而对于 protot ...
随机推荐
- [HTML5] Lazyload below the fold images and iframes with native browser lazy-loading
In this lesson, you'll learn how to use the loading="lazy" attribute available on images a ...
- 016_STM32程序移植之_舵机
STM32程序移植之舵机PWM测试 接线图如下: STM32引脚 舵机引脚 功能 GND GND 正极电源 具体看舵机的额定电压 PA6 PWM引脚 STM32引脚 CH340引脚 GND GND 3 ...
- 快速了解AMD、CMD、CommonJS、ESM
1.ES6 Module javascript在ES2015(ES6)中出现了语言层面的模块(module). ES6的模块既可以用于浏览器端,也可以用于服务器端(nodeJS). ES6模块是静态化 ...
- vue-cli脚手架构建项目
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. 一.安装node.js 二.安装vue-cli npm install -g vue-cl ...
- jinja2-模版继承
一 简要 简单的来说模板继承包含基本模板和子模板.其中基本模板里包含了你这个网站里的基本元素的基本骨架,但是里面有一些空的或者是不完善的块(block)需要用子模板来填充. 二 基本模版样例 这个模板 ...
- flask 设置配置文件的方式
from flask import Flask from flask import current_app """ 配置参数设置与读取 """ ...
- csp-s模拟106
这场其实心态十分爆炸,首先一下午改上次破T3卡常一下午没过,心情十分暴躁.上来开题不顺利,T1想了一个小时没动.于是跳到T2,看T2的80pts貌似可拿就先打了.T3只会判10分,又想打个$2^{2N ...
- puppeteer爬虫服务
爬虫文件 baidu.js const puppeteer = require("puppeteer"); const path = require('path'); const ...
- Jmeter Web 性能测试入门 (一):环境配置 (免安装版)
去官网下载并安装java jdk8 去官网下载jmeter binaries最新的zip,并解压到某路径下.(注:由于jmeter-server的限制,放置的路径不要太长,路径不要带空格,例如:D:\ ...
- JMeter压力测试及并发量计算-2
一个每天1000万PV的网站需要什么样的性能去支撑呢?继续上一篇,下面我们就来计算一下,前面我们已经搞到了一票数据,但是这些数据的意义还没有说.技术是为业务服务的,下面就来说说怎么让些数据变得有意义. ...