[Series] Spring Core - Keep It Simple (P6): Bean Lifecycle Callback
Java
155
spring
65
spring core
49
White

Nguyễn Tuấn Anh viết ngày 11/04/2019

Giống như EJB, Spring cũng hỗ trợ 2 loại lifecycle callback sau:

  • Initialization method: phương thức này sẽ được gọi ngay sau khi Spring IoC container khởi tạo bean và inject các dependency của bean thành công, và ngay trước khi instance của bean được request.
  • Destruction method: phương thức này sẽ được gọi ngay trước khi Spring IoC Container chứa bean đó bị hủy bỏ/đóng.

Chú ý: Destruction method không hoạt động với prototype bean.

Kể từ phiên bản Spring 2.5, chúng ta có 3 cách để chúng ta định nghĩa lifecycle callback:

  1. Chỉ định initialization method và destruction method thông qua 2 thuộc tính initMethoddestroyMethod của @Bean => không thể áp dụng cho component.
  2. Chỉ định initialization method và destruction method thông qua 2 annotation @PostConstruct@PreDestroy (được đặc tả ở JSR-250).
  3. Bean implement 2 interface InitializingBeanDisposableBean, rồi ghi đè 2 phương thức afterPropertiesSet()destroy().

1. initMethoddestroyMethod

FooService.java

package org.ashina.tutorial.spring;

public class FooService {

    public void init() {
        System.out.println("fooService was initialized");
    }

    @Override
    public void doStuff() {
        System.out.println("This is fooService bean");
    }

    public void destroy() {
        System.out.println("fooService was destroyed");
    }

}

AppConfig.java

package org.ashina.tutorial.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean(initMethod = "init", destroyMethod = "destroy")
    public FooService fooService() {
        return new FooService();
    }

}

Main.java

package org.ashina.tutorial.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        FooService fooService = ctx.getBean(FooService.class);
        fooService.doStuff();
        ctx.close();
    }

}

Kết quả:

fooService was initialized
This is fooService bean
fooService was destroyed

2. @PostConstruct@PreDestroy

FooService.java

package org.ashina.tutorial.spring;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class FooService {

    @PostConstruct
    public void init() {
        System.out.println("fooService was initialized");
    }

    @Override
    public void doStuff() {
        System.out.println("This is fooService bean");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("fooService was destroyed");
    }

}

AppConfig.java

package org.ashina.tutorial.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public FooService fooService() {
        return new FooService();
    }

}

Main.java

package org.ashina.tutorial.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        FooService fooService = ctx.getBean(FooService.class);
        fooService.doStuff();
        ctx.close();
    }

}

Kết quả:

fooService was initialized
This is fooService bean
fooService was destroyed

3. InitializingBeanDisposableBean

FooService.java

package org.ashina.tutorial.spring;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class FooService implements InitializingBean, DisposableBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("fooService was initialized");
    }

    @Override
    public void doStuff() {
        System.out.println("This is fooService bean");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("fooService was destroyed");
    }

}

AppConfig.java

package org.ashina.tutorial.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public FooService fooService() {
        return new FooService();
    }

}

Main.java

package org.ashina.tutorial.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        FooService fooService = ctx.getBean(FooService.class);
        fooService.doStuff();
        ctx.close();
    }

}

Kết quả:

fooService was initialized
This is fooService bean
fooService was destroyed

Tài liệu tham khảo

https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-lifecycle

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyễn Tuấn Anh

24 bài viết.
151 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
45 41
MyContact là một ứng dụng mà mình thường viết mỗi khi học một ngôn ngữ hay công nghệ mới. MyContact chỉ là một ứng dụng CRUD đơn giản, cho phép ngư...
Nguyễn Tuấn Anh viết hơn 2 năm trước
45 41
White
27 14
Hướng dẫn lập trình Spring Security Trong bài viết lần này, mình sẽ giúp các bạn bước đầu tìm hiểu (Link) thông qua xây dựng các chức năng: Đăng ...
Nguyễn Tuấn Anh viết hơn 2 năm trước
27 14
White
15 1
Giới thiệu Spring Framework Trong bài viết này, mình sẽ giới thiệu cho các bạn về một trong những Java EE framework rất nổi bật và phổ biến hiện n...
Nguyễn Tuấn Anh viết hơn 2 năm trước
15 1
Bài viết liên quan
White
2 0
I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this (Link), I want to check how Spring J...
Rey viết 7 tháng trước
2 0
White
0 0
Giới thiệu Trong bài hôm nay chúng ta sẽ tìm hiểu cách handle request POST của Spring Boot. Trước đó, bạn nên biết 1. 「Spring Boot 8」Tạo Web He...
https://loda.me viết 3 tháng trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
24 bài viết.
151 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!