[Series] Spring Core - Keep It Simple (P7): Tìm hiểu thêm về khởi tạo bean
Java
155
spring
65
spring core
49
White

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

1. @Lazy

Như chúng ta đã biết, các singleton bean sẽ được khởi tạo tại thời điểm startup của ứng dụng Spring. Cơ chế khởi tạo này được gọi với cái tên quen thuộc là eager. Đối lập với eager là lazy. Trong một số trường hợp, chúng ta chỉ muốn khởi tạo singleton bean khi có request đầu tiên mà thôi (các bạn tránh nhầm lẫn với prototype bean).

Lúc này, chúng ta sẽ cần sử dụng đến annotation org.springframework.context.annotation.Lazy. @Lazy được khai báo cùng @Bean.

FooService.java

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;
import org.springframework.context.annotation.Lazy;

@Configuration
public class AppConfig {

    @Bean
    @Lazy
    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();
        FooService fooService2 = ctx.getBean(FooService.class);
        fooService2.doStuff();
        ctx.close();
    }

}

Kết quả:

fooService was initialized
This is foo bean
This is foo bean
fooService was destroyed

Chú ý: Nếu các bạn muốn tất cả các bean trong class @Configuration đều lazy initialization thì @Lazy sẽ được khai báo cùng @Configuration.


2. @DependsOn

Annotation org.springframework.context.annotation.DependsOn giúp chúng ta kiểm soát thứ tự khởi tạo bean.

Giả sử chúng ta có 3 bean là: fooService, barServicebazService. Bean fooService chỉ được khởi tạo sau khi 2 bean barServicebazService đã khởi tạo.

FooService.java

package org.ashina.tutorial.spring;

import javax.annotation.PostConstruct;

public class FooService {

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

}

BarService.java

package org.ashina.tutorial.spring;

import javax.annotation.PostConstruct;

public class BarService {

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

}

BazService.java

package org.ashina.tutorial.spring;

import javax.annotation.PostConstruct;

public class BazService {

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

}

AppConfig.java

package org.ashina.tutorial.spring;

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

@Configuration
public class AppConfig {

    @Bean
    @DependsOn({"barService", "bazService"})
    public FooService fooService() {
        return new FooService();
    }

    @Bean
    public BarService barService() {
        return new BarService();
    }

    @Bean
    public BazService bazService() {
        return new BazService();
    }

}

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);
        ctx.close();
    }

}

Kết quả:

barService was initialized
bazService was initialized
fooService was initialized
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
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
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
{{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á!