[Series] Spring Core - Keep It Simple (P5): Tìm kiếm bean
spring
65
spring core
49
Java
155
White

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

Tiếp theo 4 phần trong series Spring Core - Keep It Simple, trong phần 5 này chúng ta sẽ cùng tìm hiểu các cách để tìm kiếm bean thông qua ApplicationContext.


1. Tìm kiếm bean thông qua tên

Giả sử, chúng ta có bean foo sau:

Foo.java

package org.ashina.tutorial.spring;

import org.springframework.stereotype.Component;

@Component
public class Foo {

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

}

AppConfig.java

package org.ashina.tutorial.spring;

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

@Configuration
@ComponentScan(basePackages = "org.ashina.tutorial.spring")
public class AppConfig {

}

Chúng ta sẽ sử dụng phương thức getBean(String name) để tìm kiếm:

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);
        Foo foo = (Foo) ctx.getBean("foo");
        foo.doStuff()
        ctx.close();
    }

}

Kết quả:

This is foo bean

2. Tìm kiếm bean thông qua class

Vẫn là bean foo ở trên.

Chúng ta sẽ sử dụng phương thức getBean(Class clazz) của ApplicationContext để tìm kiếm:

Foo foo = (Foo) ctx.getBean(Foo.class);
foo.doStuff();

Kết quả:

This is foo bean

3. Tìm kiếm bean thông qua interface (chỉ có một bean implement interface)

Foo.java

public interface Foo {

    void doStuff();

}
@Component
public class FooImpl implements Foo {

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

}

Với trường hợp này, chúng ta sẽ dùng lại phương thức getBean(Class clazz) ở phần trước để tìm kiếm:

Foo foo = (Foo) ctx.getBean(Foo.class);
foo.doStuff();

Kết quả:

This is foo bean

4. Tìm kiếm bean theo interface (nhiều bean cùng implement interface)

Giả sử, chúng ta 2 bean là bar1bar2. Class của 2 bean này (Bar1Bar2) đều là implementation của interface Bar:

Bar.java

package org.ashina.tutorial.spring;

public interface Bar {
    void doStuff();
}

Bar1.java

package org.ashina.tutorial.spring;

import org.springframework.stereotype.Component;

@Component
public class Bar1 implements Bar {

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

}

Bar2.java

package org.ashina.tutorial.spring;

import org.springframework.stereotype.Component;

@Component
public class Bar2 implements Bar {

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

}

Chúng ta sẽ sử dụng phương thức getBeansOfType(Class clazz) của ApplicationContext để tìm kiếm:

// key: bean name
// value: bean instance
Map<String, Bar> bars = ctx.getBeansOfType(Bar.class);
for (Map.Entry<String, Bar> entry : bars.entrySet()) {
    System.out.println(entry.getKey());
    entry.getValue().doStuff();
}

Kết quả:

bar1
This is bar1 bean
bar2
This is bar2 bean

5. Tìm kiếm bean theo annotation

Giả sử chúng ta có annotation Baz được khai báo ở 2 bean baz1baz2:

Baz.java

package org.ashina.tutorial.spring;

import org.springframework.stereotype.Component;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface Baz {
}

Baz1.java

package org.ashina.tutorial.spring;

@Baz
public class Baz1 {
}

Baz2.java

package org.ashina.tutorial.spring;

@Baz
public class Baz2 {
}

Chúng ta sẽ sử dụng phương thức getBeansWithAnnotation(Class clazz) của ApplicationContext để tìm kiếm:

// key: bean name
// value: bean instance
Map<String, Object> bazs = ctx.getBeansWithAnnotation(Baz.class);
for (Map.Entry<String, Object> entry : bazs.entrySet()) {
    System.out.println(entry.getKey());
    System.out.println(entry.getValue().getClass().getName());
}

Kết quả:

baz1
class org.xyz.Baz1
baz2
class org.xyz.Baz2
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.
152 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
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
24 bài viết.
152 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á!