bean的生命周期:创建---初始化---销毁。

Spring中声明的Bean的初始化和销毁方法有3种方式:

  1. @Bean的注解的initMethod、DestroyMethod属性

  2. bean实现InitializingBean、DisposableBean接口

  3. @PostConstruct、@PreDestroy注解

  4. 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是一个接口,这个接口中的postProcessBeforeInitializationpostProcessAfterInitialization方法分别在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的初始化、销毁方法的方式的更多相关文章

  1. Spring Framework核心概念之Bean生命周期管理

    目录 Spring Bean的生命周期 相关接口的分类 测试SpringBean生命周期的Demo程序 小结 Spring Bean的生命周期 Spring容器既Application或者WebApp ...

  2. Spring bean 实现初始化、销毁方法的方式及顺序

    Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作,常用方法有三种: 使用注解,在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是 ...

  3. Spring之使用注解实例化Bean并注入属性

    1.准备工作 (1)导入jar包 除了上篇文章使用到的基本jar包外,还得加入aop的jar包,所有jar包如下 所需jar包 (2)配置xml <?xml version="1.0& ...

  4. Spring中用@DependsOn注解控制Bean的创建顺序

    1. 概述 Spirng容器自己会管理bean的生命周期和bean实例化的顺序,但是我们仍然可以根据我们自己的需求进行定制.我可以可以选择使用SmartLifeCycle接口,也可以用@Depends ...

  5. 编码实现Spring 利用@Resource注解实现bean的注入,xml实现基本数据类型的注入

    首先分析. 1: 肯定要利用dom4j读取xml配置文件,将所有的bean的配置信息读取出来 2: 利用反射技术,实例化所有的bean 3: 写注解处理器, 利用注解和内省实现依赖对象的注入. 4: ...

  6. 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 ...

  7. 分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案

    问题: 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性.但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了. 当这个方 ...

  8. Spring学习--通过注解配置 Bean (三)

    组件装配: <context:component-sacan> 元素还会自动注册 AutowiredAnnotationBeanPostProcesser 实例 , 该实例可以自动装配具有 ...

  9. Spring学习--通过注解配置 Bean (二)

    在 classpath 中扫描组件: 当在组件类上使用了特定的注解之后 , 还需要在 Spring 的配置文件中声明 <context:component-scan>: base-pack ...

随机推荐

  1. PTA 7-1 公路村村通 (30分)

    PTA 7-1 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...

  2. MySQL:互联网公司常用分库分表方案汇总!

    一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用.接下来就 ...

  3. Swift-Framework Error(一)桥接文件

    摘要 Xcode 编译工程代码时,出现编译错误时除了红色图标外,还会附送几句英文文本. 常规操作拷贝英文文本,放到搜索框中找答案,但是读懂这几句话能事半功倍. 项目中如果有 OC 和 Swift 两种 ...

  4. 一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结

    一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结 这是一个十分严重的线上问题 自从最近的某年某月某天起,线上服务开始变得不那么稳定(软病).在高峰期,时常有几台机器的 ...

  5. [cf1305G]Kuroni and Antihype

    对整个过程构造一张有向图,其中$(x,y)\in E$当且仅当$x$把$y$加入,且边权为$a_{x}$ 显然这是一棵外向树森林,并再做如下两个构造: 1.新建一个点$a_{0}=0$,将其向所有入度 ...

  6. [hdu6761]Minimun Index

    $lyndon\ word$(以下简写为Lw):对于一个字符串s,其为Lw当且仅当其的最小后缀为自身 性质:若$u<v$为LW,那么$uv$也为Lw(反证法即可证) $lyndon$分解:将一个 ...

  7. 推荐几款谷歌浏览器(chrome)超实用的插件

    1.github加速器 在谷歌应用商店搜索"Github加速器",安装即可. 说明:在国内访问github有时候非常慢,是让人非常头疼的一件事,安装这个插件后 大大加快github ...

  8. 架构师必备:巧用Canal实现异步、解耦的架构

    本文介绍如何应用Canal实现异步.解耦的架构,后续有空再写文章分析Canal原理和源代码. Canal简介 Canal是用来获取数据库变更的中间件. 伪装自己为MySQL从库,拉取主库binlog并 ...

  9. Codeforces 650D - Zip-line(树状数组)

    Codeforces 题目传送门 & 洛谷题目传送门 我怕不是个 nt--一开始忽略了"询问独立"这个条件--然后就一直在想有什么办法维护全局 LIS--心态爆炸 首先离散 ...

  10. Mike post process with Matlab toolbox

    表怕,这个博客只有题目是英文的-- Matlab toolbox 安装 去DHI官网下载最新的MikeSDK2014与Matlab toolbox,下载好后安装MikeSDK2014,注意电脑上不能有 ...