cyxCoder
明天你会感谢今天奋力拼搏的你。
ヾ(o◕∀◕)ノヾ
首页
AI相关
AI网站导航
AI取名
个人简历
个人作品
Spring调用初始化与销毁方法的几种实现
2020-02-19 10:52
1497
0
Spring对象的初始化这里就不细讲了,后面在源码分析中讲解。
首先简单说一下Spring会在何时调用对象初始化和销毁方法。
1、对象的初始化
spring在对bean初始化时会先把其对象创建完成、然后对其参数进行赋值、最后会调用初始化方法。在调用初始化方法之前还会先判断此对象是否实现了后置处理器。
2、对象销毁
单实例:容器关闭的时候
多实例:容器不会管理这个bean;容器不会调用销毁方法;
Bean的创建(执行构造函数)-》初始化(自定义init方法)-》销毁
什么时候调用销毁方法?在applicationContext调用close方法时会去执行bean的销毁方法。
3、实现方式
方法一、通过@Bean指定init-method和destory-method
方法二、通过让Bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑)
方法三、Spring还支持基于JSR-250的注解:
@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作。
怎么在初始化方法前后执行一些逻辑,这就要用到后置处理器,想了想这些都留到后面的文章中再做详解,卖个关子。
3.1、方法一示例
package com.cyx.initdemo;
import org.springframework.context.annotation.*;
@Configuration
public class MyInitConfig {
@Bean(initMethod = "initMethod",destroyMethod = "destroyMethod")
public MyEntity myEntity(){
return new MyEntity ();
}
}
class MyEntity {
public MyEntity(){
System.out.println("执行了MyEntity无参构造函数》》》》》》");
}
private void initMethod(){
System.out.println("执行了init方法》》》》》》》》》》》》");
}
private void destroyMethod(){
System.out.println("执行了 destroy方法》》》》》》》》》》》》》");
}
}
测试代码如下:
package com.cyx.initdemo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestInit {
public static void main (String[] args){
//以注解的方式执行
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyInitConfig.class);
//获取对象
MyEntity myEntity = context.getBean("myEntity", MyEntity.class);
System.out.println(myEntity.toString());
//再次调用
MyEntity myEntity2 = context.getBean("myEntity", MyEntity.class);
System.out.println(myEntity2.toString());
//销毁
context.close();
}
}
执行结果:
3.2、方法二示例
package com.cyx.initdemo;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.*;
@Configuration
public class MyInitConfig {
@Bean
public MyEntity myEntity(){
return new MyEntity ();
}
}
class MyEntity implements InitializingBean, DisposableBean {
public MyEntity(){
System.out.println("执行了MyEntity无参构造函数》》》》》》");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("执行了init方法》》》》》》》》》》》》");
}
@Override
public void destroy() throws Exception {
System.out.println("执行了 destroy方法》》》》》》》》》》》》》");
}
}
同样的测试类,执行结果如下:
3.3、方法三示例
package com.cyx.initdemo;
import org.springframework.context.annotation.*;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Configuration
public class MyInitConfig {
@Bean
public MyEntity myEntity(){
return new MyEntity ();
}
}
class MyEntity{
public MyEntity(){
System.out.println("执行了MyEntity无参构造函数》》》》》》");
}
@PostConstruct
public void afterPropertiesSet() throws Exception {
System.out.println("执行了init方法》》》》》》》》》》》》");
}
@PreDestroy
public void destroy() throws Exception {
System.out.println("执行了 destroy方法》》》》》》》》》》》》》");
}
}
测试结果相同:
相关文章
【转】spring 自定义事件发布及监听(简单实例)
编译spring源码问题总结
spring以注解方式加载容器的简单示例
提交
全部评论
全部评论