【Spring Framework】Spring注解设置Bean的初始化、销毁方法的方式
bean的生命周期:创建---初始化---销毁。
Spring中声明的Bean的初始化和销毁方法有3种方式:
@Bean的注解的initMethod、DestroyMethod属性
bean实现InitializingBean、DisposableBean接口
@PostConstruct、@PreDestroy注解
BeanPostProcessor(这种仅仅增强了Bean的初始化方法)
@Bean的注解的initMethod、DestroyMethod属性
--cat类
public class Cat {
public Cat() {
System.out.println("cat...constructor...");
}
public void init() {
System.out.println("cat...init...");
}
public void destroy() {
System.out.println("cat...destory...");
}
}
--配置类
@Configuration
public class SpringConfig {
@Bean(name = "cat", initMethod = "init", destroyMethod = "destroy")
public Cat getCat() {
return new Cat();
}
}
--测试代码
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println("IOC容器创建了...");
context.close();
}
--测试结果

bean实现InitializingBean、DisposableBean接口
实现InitialzingBean接口的afterPropertiesSet方法,即为bean的初始化方法。
实现DisposableBean接口的destroy方法,即为bean的销毁方法。
--dog类
public class Dog implements InitializingBean, DisposableBean {
public Dog() {
System.out.println("dog...constructor...");
}
// Dog类的初始化方法
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("dog...afterPropertiesSet...");
}
// Dog类的销毁方法
@Override
public void destroy() throws Exception {
System.out.println("dog...destroy...");
}
}
--配置类
@Configuration
public class SpringConfig {
@Bean(name = "dog")
public Dog getDog() {
return new Dog();
}
}
--测试代码
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println("IOC容器创建了...");
context.close();
}
--测试结果

@PostConstruct、@PreDestroy注解
这两个注解只能标注在方法上,并且@PostConstruct注解标注的方法为bean的初始化方法,@PreDestroy标注的方法为bean的销毁方法。
--tiger类
public class Tiger {
public Tiger() {
System.out.println("tiger...constructor");
}
@PostConstruct
public void init() {
System.out.println("tiger...init...");
}
@PreDestroy
public void destroy() {
System.out.println("tiger...destroy...");
}
}
--配置类
@Configuration
public class SpringConfig {
@Bean(name = "tiger")
public Tiger getTiger() {
return new Tiger();
}
}
--测试代码
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println("IOC容器创建了...");
context.close();
}
--测试结果

BeanPostProcessor
BeanPostProcessor是一个接口,这个接口中的postProcessBeforeInitialization、postProcessAfterInitialization方法分别在Bean的初始化方法执行的前后执行,本质上不算是声明Bean的初始化和销毁方法的一种,而是仅仅对bean的初始化方法的一个功能增强,并且在Spring中使用非常广泛,例如DI注解Autowired,当IOC容器调用无参构造创建对象之后,就会进行依赖注入,而且依赖注入在Bean的初始化方法执行之前,所以可以适用BeanPostProcessor来完成这一功能,Spring底层也是这么完成的。
--MyBeanPostProcessor
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* 在初始化之前执行
* @param bean 初始化的bean
* @param beanName bean的名字
* @return 初始化的bean或者包装过的bean
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + " ==> " + "postProcessBeforeInitialization...");
return bean;
}
/**
* 在初始化之后执行
* @param bean 初始化的bean
* @param beanName bean的名字
* @return 初始化的bean或者包装过的bean
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + " ==> " + "postProcessAfterInitialization...");
return bean;
}
}
--配置类
@Configuration
public class SpringConfig {
@Bean(name = "tiger")
public Tiger getTiger() {
return new Tiger();
}
@Bean(name = "myBeanPostProcessor")
public MyBeanPostProcessor getMyBeanPostProcessor() {
return new MyBeanPostProcessor();
}
}
--测试代码
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println("IOC容器创建了...");
context.close();
}
--测试结果

【Spring Framework】Spring注解设置Bean的初始化、销毁方法的方式的更多相关文章
- Spring Framework核心概念之Bean生命周期管理
目录 Spring Bean的生命周期 相关接口的分类 测试SpringBean生命周期的Demo程序 小结 Spring Bean的生命周期 Spring容器既Application或者WebApp ...
- Spring bean 实现初始化、销毁方法的方式及顺序
Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作,常用方法有三种: 使用注解,在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是 ...
- Spring之使用注解实例化Bean并注入属性
1.准备工作 (1)导入jar包 除了上篇文章使用到的基本jar包外,还得加入aop的jar包,所有jar包如下 所需jar包 (2)配置xml <?xml version="1.0& ...
- Spring中用@DependsOn注解控制Bean的创建顺序
1. 概述 Spirng容器自己会管理bean的生命周期和bean实例化的顺序,但是我们仍然可以根据我们自己的需求进行定制.我可以可以选择使用SmartLifeCycle接口,也可以用@Depends ...
- 编码实现Spring 利用@Resource注解实现bean的注入,xml实现基本数据类型的注入
首先分析. 1: 肯定要利用dom4j读取xml配置文件,将所有的bean的配置信息读取出来 2: 利用反射技术,实例化所有的bean 3: 写注解处理器, 利用注解和内省实现依赖对象的注入. 4: ...
- Difference between BeanFactory and FactoryBean in Spring Framework (Spring BeanFactory与Factory区别)
参见原文:http://www.geekabyte.io/2014/11/difference-between-beanfactory-and.html geekAbyte Codes and Ran ...
- 分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案
问题: 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性.但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了. 当这个方 ...
- Spring学习--通过注解配置 Bean (三)
组件装配: <context:component-sacan> 元素还会自动注册 AutowiredAnnotationBeanPostProcesser 实例 , 该实例可以自动装配具有 ...
- Spring学习--通过注解配置 Bean (二)
在 classpath 中扫描组件: 当在组件类上使用了特定的注解之后 , 还需要在 Spring 的配置文件中声明 <context:component-scan>: base-pack ...
随机推荐
- 7-7 后缀式求值 (25分)的python实现
exp=input().split() ls=list() def Cal(a,b,i): if i=="+": return a+b elif i=="-": ...
- springboot利用mock进行junit单元测试,测试controller
1 spring-boot-starter-test内置mockito,添加pom依赖 <dependency> <groupId>org.springframework.b ...
- F5 BIG-IP 远程代码执行RCE(CVE-2020-5902)复现
漏洞简介 F5 BIG-IP 是美国``F5公司一款集成流量管理.DNS.出入站规则.web应用防火墙.web网关.负载均衡等功能的应用交付平台. 在F5 BIG-IP产品的流量管理用户页面 (TMU ...
- 高德地图API中折线polyline不能跨越180度经度线的解决方案
1.问题 最近在使用高德地图的API,有一个需求是画出对象的历史轨迹,采用了高德地图API中的折线polyline函数.但如果需要跨180度经度线的折线,会出现不能跨越的情况,如下图所示: 图中有三个 ...
- Python变量和数据类型,类型转换
a.变量的定义 把数据分别用一个简单的名字代表,方便在接下来的程序中引用. 变量就是代表某个数据(值)的名称. 变量就是用来存储数据的,将不同的数据类型存储到内存 b.变量的赋值 变量名= 初始值 ...
- [源码解析] PyTorch分布式(6) -------- DistributedDataParallel -- 初始化&store
[源码解析] PyTorch分布式(6) ---DistributedDataParallel -- 初始化&store 目录 [源码解析] PyTorch分布式(6) ---Distribu ...
- [bzoj1101]Zap
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 50001 4 int t,n,m,k,ans,mu[N],vis ...
- P7416 [USACO21FEB] No Time to Dry P
题目传送门 题意简述:给出颜色序列 \(a\),多次询问给出 \(l,r\),求涂成 \(a_l,a_{l+1},\cdots,a_r\) 的最小操作次数.每次涂色只能用一段数值更大的颜色覆盖原有的颜 ...
- 比对软件Blast,Blast+,Diamond比较
1. Blast (1)格式化数据库 formatdb -i db.seq -p T -o T -l logfile 主要参数: -i 输入需要格式化的源数据库名称 -p 文件类型,是核苷酸序列数据库 ...
- Linux openssl 升级、降级
Linux openssl 升级.降级 最近遇到一些朋友使用微信退款,报openssl版本为问题,需要对openssl进行降级. 现在环境的openssl版本如下: root@c215a2b695ef ...