`
zk_chs
  • 浏览: 214801 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Spring中@PostConstruct、@PreDestroy、InitializingBean、DisposableBean、initMethod、des

 
阅读更多

这次的博客比较Spring中@PostConstruct、@PreDestroy、InitializingBean、DisposableBean、initMethod、destoryMethod的执行顺序,顺便会将construct以及与注入顺序一并比较

 

为了方便起见,这次不使用xml文件定义bean,完全采用注解配置,共3个类,都放在annotations包下

下面是定义的两个bean,Bean2直接加上@Conponent注解,加入到ioc容器

而Bean1,有1个注入属性、1个普通属性、1个构造器、3个初始化方法、3个销毁方法

public class Bean1 implements InitializingBean, DisposableBean{
	
	@Autowired
	public Bean2 bean2;
	
	public String state;
	
	public Bean1 (){
		state = "construct!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}
	
	public void init_method (){
		state = "init-method!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}
	
	public void destory_method (){
		state = "destory-method!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}
	
	@PostConstruct 
	public void postConstruct (){
		state = "postConstruct!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}
	
	@PreDestroy 
	public void preDestory (){
		state = "preDestory!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}

	@Override
	public void destroy() throws Exception {
		state = "destory!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		state = "afterPropertiesSet!";
		System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
	}

}

@Component
public class Bean2 {
	
}

 

不要奇怪为什么Bean1没有加入到ioc容器,我们下面马上进行:

@Configuration
@org.springframework.context.annotation.ComponentScan(basePackages = "annotations")
public class ComponentScan {
	
	@Bean(initMethod = "init_method", destroyMethod = "destory_method")
	public Bean1 bean1 (){
		return new Bean1();
	}

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
		ctx.register(ComponentScan.class);
		ctx.refresh();
		ctx.registerShutdownHook();
	}
	
}

 可以通过@Configuration注册bean,和xml是一样的效果

 

打印结果为

bean1 -> construct!...bean2: null
bean1 -> postConstruct!...bean2: annotations.Bean2@35fc6dc4
bean1 -> afterPropertiesSet!...bean2: annotations.Bean2@35fc6dc4
bean1 -> init-method!...bean2: annotations.Bean2@35fc6dc4
bean1 -> preDestory!...bean2: annotations.Bean2@35fc6dc4
bean1 -> destory!...bean2: annotations.Bean2@35fc6dc4
bean1 -> destory-method!...bean2: annotations.Bean2@35fc6dc4

 

所以执行顺序如下:

初始化时:构造器Construct  ->  属性注入  ->  @PostConstruct  ->  InitializingBean接口  ->  bean定义的initMethod 

销毁时:@PreDestroy  ->  DisposableBean接口 ->  bean定义的destoryMethod

 

When you work directly in Java, you can do anything you like with your objects and do not always need to rely on the container lifecycle!

 

分享到:
评论

相关推荐

    14、加载spring启动首先进入的类方法注解1

    本文将详细讨论在Spring中使用`@PostConstruct`和`@PreDestroy`注解以及`InitializingBean`和`DisposableBean`接口来控制Bean的生命周期。 1. **使用@PostConstruct和@PreDestroy注解** `@PostConstruct`注解标记...

    Spring Bean初始化及销毁多种实现方式

    Spring 提供了多种不同的方式来初始化和销毁 Bean,这些方式包括 init-method/destroy-method、InitializingBean/DisposableBean、@PostConstruct/@PreDestroy 和 ContextStartedEvent/ContextClosedEvent 等。...

    Spring bean初始化及销毁你必须要掌握的回调方法.docx

    而在使用@Bean注解的Java配置中,可以通过`initMethod`属性来指定。 **销毁回调方法** 1. **@PreDestroy注解** 类似于@PostConstruct,@PreDestroy是Java的JSR-250规范的一部分,用于标记一个方法,在Bean即将被...

    Spring初始化和销毁的实现方法

    今天我们将讨论Spring中 Bean 的初始化和销毁的实现方法。 1. 通过@Bean指定init-method和destroy-method 在 Spring 中,我们可以使用 @Bean 注解来指定 Bean 的初始化和销毁方法。例如: ```java @Bean(init...

    Spring.pdf

    值得注意的是,Spring 2.5版本后引入了注解的方式,可以使用@PostConstruct和@PreDestroy来代替XML中的init-method和destroy-method,从而更简洁地指定Bean的初始化和销毁方法。 容器本身也具备了极高的扩展性,...

    spring annotation 入门

    - **初始化方法**:除了使用`@PostConstruct`注解外,还可以通过实现`InitializingBean`接口或在XML配置文件中指定`init-method`属性来实现。 - **销毁方法**:除了使用`@PreDestroy`注解外,还可以通过实现`...

    spring资料5

    Spring提供了多种方式来管理Bean的生命周期,包括配置元数据(如`init-method`和`destroy-method`属性)、实现InitializingBean和DisposableBean接口、使用JSR-250注解(@PostConstruct和@PreDestroy)等。Bean的生命...

    spring里面想要让一个类的实例在所有属性都准备好之后就让它自动执行某些方法

    同样,Spring还提供了销毁回调机制,如`DisposableBean`接口的`destroy()`方法,或`@PreDestroy`注解的方法,以及`destroy-method`属性。这些在bean生命周期结束时调用。 通过理解并适当地应用这些回调机制,你...

    互联网大厂Java中级面试真题

    此外,还可以通过在bean配置文件中指定init-method和destroy-method,或者使用注解@PostConstruct和@PreDestroy来定制bean的生命周期行为。 Spring的Inversion of Control (IoC)或依赖注入(DI)是其核心特性。...

    spring启动加载程序的几种方法介绍

    根据Spring的源码,`afterPropertiesSet()`方法会先于`initMethod()`执行,而`destroyMethod()`会先于`destroy()`执行。 ### Spring Bean的初始化过程 Spring容器在初始化Bean时,首先会进行依赖注入,然后按照...

    Spring Bean Lifecycle Control

    - `Bean类`:包含`@PostConstruct`、`@PreDestroy`注解的方法,以及可能实现的`InitializingBean`和`DisposableBean`接口。 - 测试类:用于启动应用,展示Bean生命周期的不同阶段。 通过分析这个示例,我们可以学习...

    百度-Java面试.pdf

    Bean可以通过实现InitializingBean和DisposableBean接口,或者在配置文件中定义init-method和destroy-method来声明初始化和销毁回调方法。另外,Spring 3.0引入的注解@PostConstruct和@PreDestroy也可以标记初始化和...

    Spring笔记(第三次)1

    接下来,我们深入讨论了Spring中的bean生命周期。bean的生命周期包括创建、初始化和销毁三个阶段。Spring容器负责管理bean的整个生命周期,并且允许我们在特定的生命周期阶段插入自定义的行为。 首先,我们可以通过...

    开源框架面试专题及答案.pdf

    在初始化阶段,Spring会调用实现了InitializingBean接口的bean的afterPropertiesSet方法,或者执行bean配置文件中指定的init-method。而在bean不再需要时,Spring会调用DisposableBean接口的destroy方法,或者执行...

    bean的生命周期1

    Spring允许我们为Bean定义初始化方法(init-method)和销毁方法(destroy-method)。在Bean实例化后,Spring会调用指定的初始化方法进行进一步的配置或准备。同样,在容器关闭前,如果Bean声明了销毁方法,Spring会...

    详解Spring中bean生命周期回调方法

    在 XML 配置文件中,可以通过 bean 元素的 init-method 属性和 destroy-method 属性来指定当前 Bean 在初始化以后和 ApplicationContext 销毁前的回调方法。需要注意的是,所指定的回调方法必须是没有参数的。 使用...

    Spring面试问答

    Bean可以通过实现InitializingBean接口的afterPropertiesSet()方法或定义init-method属性进行初始化,通过DisposableBean接口的destroy()方法或定义destroy-method属性进行销毁。此外,还可以使用@PostConstruct和@...

    详解如何在低版本的Spring中快速实现类似自动配置的功能

    可以通过实现InitializingBean接口、使用@PostConstruct注解、指定init-method,以及实现DisposableBean接口、使用@PreDestroy注解、指定destroy-method来分别控制Bean初始化和销毁时的行为。 2. **XxxAware接口**...

Global site tag (gtag.js) - Google Analytics