Spring注解开发系列Ⅲ --- 生命周期
Bean的生命周期
Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。
首先看下生命周期图:
再谈生命周期之前有一点需要先明确:
Spring 只帮我们管理单例模式 Bean 的完整生命周期,对于 prototype 的 bean ,Spring 在创建好交给使用者之后则不会再管理后续的生命周期。
Bean的初始化和销毁方法
/**
* Bean的生命周期
* ---由容器管理bean的创建,初始化,销毁
*
* 构造,创建对象
* 单实例:在容器启动的时候创建对象
* 多实例:在每次获取的时候创建对象
*
* 初始化:
* 对象创建完成,并赋值好,然后调用初始化方法...
* 销毁:
* 单实例:容器关闭时,进行销毁
* 多实例:容器不会管理这个bean,bean不会销毁
* 1).使用自定义的初始化和销毁方法
* 指定init-methdo和destroy-method
*
* 2)使用InitializingBean和DisposableBean初始化和销毁方法
*
* 3)使用@PostConstruct&@PreDestroy
* @PostConstruct 在bean创建完成并属性赋值完成,执行初始化方法
* @PreDestroy 在容器销毁前通知我们清理
*
* 4)BeanPostProcessor,bean的后置处理器
* ---1.postProcessBeforeInitialization 在bean的初始化方法之前进行一些处理工作
* ---2.执行初始化方法
* ---3.postProcessAfterInitialization 在bean的初始化方法调用之后进行调用
*
* Spring底层对BeanPostProcessor的使用:
* bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Asybc等都是通过BeanPostProcessor完成的
*
* */
1.@Bean指定初始化和销毁方法
在bean初始化的时执行init方法,销毁时执行destroy方法
实体类:
package com.wang.bean; public class Car {
public Car(){
System.out.println("car cons...");
}
public void init(){
System.out.println("car init...");
}
public void destroy(){
System.out.println("car destroy...");
}
}
xml方式:
<bean id="car" class="com.wang.bean.Car" scope="prototype" lazy-init="true" init-method="init" destroy-method="destroy">
</bean>
注解方式:
@Configuration
public class LifeCycleConfig {
//@Scope("prototype")
@Bean(initMethod = "init",destroyMethod = "destroy")
public Car car(){
return new Car();
}
}
Test:
@Test
public void test(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
System.out.println("容器创建完成"); annotationConfigApplicationContext.getBean("car");//多实例,获取bean时调用创建对象,容器关闭不会销毁bean
annotationConfigApplicationContext.close();//关闭容器,执行销毁方法 }
2.InitializingBean和DisposableBean初始化和销毁方法
在实体类中实现InitializingBean和DisposableBean接口:
public class Car implements InitializingBean,DisposableBean {
public Car(){
System.out.println("car cons...");
} @Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet...在properties设置之后调用(初始化方法)");
} @Override
public void destroy() throws Exception {
System.out.println("destroy方法");
}
}
在配置类中注册该实体类bean:
@Bean
public Car car(){
return new Car();
}
3.@PostConstruct&@PreDestroy
@PostConstruct 在bean创建完成并属性赋值完成,执行初始化方法,@PreDestroy 在容器销毁前通知我们清理
实体类:
public class Dog {
public Dog(){
System.out.println("Dog Cons...");
}
@PostConstruct
public void init(){
System.out.println("Dog PostConstruct...");
}
@PreDestroy
public void destroy(){
System.out.println("Dog PreDestroy...");
}
}
在配置类中注册该实体类bean:
@Bean
public Dog dog(){
return new Dog();
}
4.BeanPostProcessor
执行顺序为:
1.postProcessBeforeInitialization 在bean的初始化方法之前进行一些处理工作
2.执行初始化方法
3.postProcessAfterInitialization 在bean的初始化方法调用之后进行调用
@Component //将后置处理器加入容器中
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization is run ...."+"bean:"+bean+"=>beanName:"+beanName); //返回要用的bean对象
return bean;
} @Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization is run ...."+"bean:"+bean+"=>beanName:"+beanName);
return bean;
}
}
Spring注解开发系列Ⅲ --- 生命周期的更多相关文章
- 浅尝Spring注解开发_Bean生命周期及执行过程
Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含Bean生命周期.自定义初始化方法.Debug BeanPostProcessor执行过程及在Spring底层中的应 ...
- Spring注解开发系列Ⅵ --- AOP&事务
注解开发 --- AOP AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,横向重复,纵向抽取.详细的AO ...
- Spring注解开发系列专栏
这个系列主要是讲Spring注解的使用,可以为后面SpringBoot的学习带来一定的帮助.我觉得从Spring直接过度到SpringBoot还是有点快,还是得需要一个演变的过程.从Spring开发, ...
- Spring注解开发系列VIII --- SpringMVC
SpringMVC是三层架构中的控制层部分,有过JavaWEB开发经验的同学一定很熟悉它的使用了.这边有我之前整理的SpringMVC相关的链接: 1.SpringMVC入门 2.SpringMVC进 ...
- Spring注解开发系列Ⅰ--- 组件注册(上)
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
- Spring注解开发系列Ⅴ --- 自动装配&Profile
自动装配: spring利用依赖注入和DI完成对IOC容器中各个组件的依赖关系赋值.自动装配的优点有: 自动装配可以大大地减少属性和构造器参数的指派. 自动装配也可以在解析对象时更新配置. 自动装配的 ...
- Spring注解开发系列VII --- Servlet3.0
Servlet3.0简介 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用 ...
- Spring注解开发系列Ⅱ --- 组件注册(下)
1.@Import注册组件 @Import主要功能是通过导入的方式实现把实例加入springIOC容器中, /** * 给容器注册组件 * 1.包扫描+组件标注注解(@Controller,@Serv ...
- Spring注解开发系列Ⅳ --- 属性赋值
在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ...
随机推荐
- 1037 在霍格沃茨找零钱 (20 分)C语言
题目描述 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二 十九个纳特(Knut)兑一个西可 ...
- 1052 卖个萌 (20 分)C语言
萌萌哒表情符号通常由"手"."眼"."口"三个主要部分组成.简单起见,我们假设一个表情符号是按下列格式输出的: [左手]([左眼][口][右 ...
- 小米6X谷歌套件
话不多说真机测试完美适配,安卓万物基于谷歌链接如下(个别MIUI版本不同谷歌商店会报错,如遇到请留言我会第一时间回复解决) 链接:https://pan.baidu.com/s/1b2Cs0u9J2b ...
- java中高级并发SPI机制
Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制. 适用于:调用者根据实际使用需要,启用.扩展.或者替换框架的实现策略. 要使用Java SPI,需要遵循如下约定 ...
- 微信小程序之豆瓣电影
此文是学习小程序第二天做出的一个小demo,调用了豆瓣电影的api,但是需要填上自己appId,现在项目的 目录如下图: 效果图如下: 在这个demo里面,我更改了小程序的navigationBar, ...
- ArcGIS Desktop直连PostgreSQL安装及配置图解(windows)
目录 1 PostgreSQL 11.0安装及配置 2 psqlODBC安装及配置 3 PostGIS安装及配置 4 pgAdmin4使用入门 5 空间数据导入 5.1 将PostgreSQL的bin ...
- Jquery图片上传功能整理
最近在做一个图片上传到服务器的功能,之前基本没有什么JS的经验,用的也是网上的插件.做了一个星期才把他弄好,现在做一下总结,方便以后查看. 用的插件是WebUploader,上面有很多例子,我找的例子 ...
- Scanner使用方法
import java.util.Scanner; //导入包 public void main (String args[]){ Scanner a=new Scanner(System.in); ...
- selenium中的xpath用法,使用xpath定位元素
xpath路径选择器定位元素 1. xpath: 使用路径表达式来定位xml或者html中文档中选取节点.在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档节点( ...
- js正则定义支付宝账号、手机号、邮箱
一.支付宝账号:可以只输入数字.字母.字母(数字)+数字(字母),其中只字母中可以含有@._或者.也可以三者都可以包含并且可以在任意位置,限制:小于等于30位(可根据需求自定义范围): let zh ...