这次的博客比较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!
相关推荐
本文将详细讨论在Spring中使用`@PostConstruct`和`@PreDestroy`注解以及`InitializingBean`和`DisposableBean`接口来控制Bean的生命周期。 1. **使用@PostConstruct和@PreDestroy注解** `@PostConstruct`注解标记...
Spring 提供了多种不同的方式来初始化和销毁 Bean,这些方式包括 init-method/destroy-method、InitializingBean/DisposableBean、@PostConstruct/@PreDestroy 和 ContextStartedEvent/ContextClosedEvent 等。...
而在使用@Bean注解的Java配置中,可以通过`initMethod`属性来指定。 **销毁回调方法** 1. **@PreDestroy注解** 类似于@PostConstruct,@PreDestroy是Java的JSR-250规范的一部分,用于标记一个方法,在Bean即将被...
今天我们将讨论Spring中 Bean 的初始化和销毁的实现方法。 1. 通过@Bean指定init-method和destroy-method 在 Spring 中,我们可以使用 @Bean 注解来指定 Bean 的初始化和销毁方法。例如: ```java @Bean(init...
值得注意的是,Spring 2.5版本后引入了注解的方式,可以使用@PostConstruct和@PreDestroy来代替XML中的init-method和destroy-method,从而更简洁地指定Bean的初始化和销毁方法。 容器本身也具备了极高的扩展性,...
- **初始化方法**:除了使用`@PostConstruct`注解外,还可以通过实现`InitializingBean`接口或在XML配置文件中指定`init-method`属性来实现。 - **销毁方法**:除了使用`@PreDestroy`注解外,还可以通过实现`...
Spring提供了多种方式来管理Bean的生命周期,包括配置元数据(如`init-method`和`destroy-method`属性)、实现InitializingBean和DisposableBean接口、使用JSR-250注解(@PostConstruct和@PreDestroy)等。Bean的生命...
同样,Spring还提供了销毁回调机制,如`DisposableBean`接口的`destroy()`方法,或`@PreDestroy`注解的方法,以及`destroy-method`属性。这些在bean生命周期结束时调用。 通过理解并适当地应用这些回调机制,你...
此外,还可以通过在bean配置文件中指定init-method和destroy-method,或者使用注解@PostConstruct和@PreDestroy来定制bean的生命周期行为。 Spring的Inversion of Control (IoC)或依赖注入(DI)是其核心特性。...
根据Spring的源码,`afterPropertiesSet()`方法会先于`initMethod()`执行,而`destroyMethod()`会先于`destroy()`执行。 ### Spring Bean的初始化过程 Spring容器在初始化Bean时,首先会进行依赖注入,然后按照...
- `Bean类`:包含`@PostConstruct`、`@PreDestroy`注解的方法,以及可能实现的`InitializingBean`和`DisposableBean`接口。 - 测试类:用于启动应用,展示Bean生命周期的不同阶段。 通过分析这个示例,我们可以学习...
Bean可以通过实现InitializingBean和DisposableBean接口,或者在配置文件中定义init-method和destroy-method来声明初始化和销毁回调方法。另外,Spring 3.0引入的注解@PostConstruct和@PreDestroy也可以标记初始化和...
接下来,我们深入讨论了Spring中的bean生命周期。bean的生命周期包括创建、初始化和销毁三个阶段。Spring容器负责管理bean的整个生命周期,并且允许我们在特定的生命周期阶段插入自定义的行为。 首先,我们可以通过...
在初始化阶段,Spring会调用实现了InitializingBean接口的bean的afterPropertiesSet方法,或者执行bean配置文件中指定的init-method。而在bean不再需要时,Spring会调用DisposableBean接口的destroy方法,或者执行...
Spring允许我们为Bean定义初始化方法(init-method)和销毁方法(destroy-method)。在Bean实例化后,Spring会调用指定的初始化方法进行进一步的配置或准备。同样,在容器关闭前,如果Bean声明了销毁方法,Spring会...
在 XML 配置文件中,可以通过 bean 元素的 init-method 属性和 destroy-method 属性来指定当前 Bean 在初始化以后和 ApplicationContext 销毁前的回调方法。需要注意的是,所指定的回调方法必须是没有参数的。 使用...
Bean可以通过实现InitializingBean接口的afterPropertiesSet()方法或定义init-method属性进行初始化,通过DisposableBean接口的destroy()方法或定义destroy-method属性进行销毁。此外,还可以使用@PostConstruct和@...
可以通过实现InitializingBean接口、使用@PostConstruct注解、指定init-method,以及实现DisposableBean接口、使用@PreDestroy注解、指定destroy-method来分别控制Bean初始化和销毁时的行为。 2. **XxxAware接口**...