CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Trang chủHướng dẫnCách sử dụng @Configuration Annotation trong Spring để quản lý Bean
Java

Cách sử dụng @Configuration Annotation trong Spring để quản lý Bean

CyStack blog 3 phút để đọc
CyStack blog11/09/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 3 minutes

@Configuration annotation trong Spring cho biết rằng lớp chứa các phương thức được đánh dấu bằng @Bean. Nhờ đó, Spring Container có thể xử lý lớp này và tạo ra các Spring Bean để sử dụng trong ứng dụng.

Configuration Annotation trong Spring

@Configuration annotation trong Spring

@Configuration Annotation cho phép chúng ta dùng annotation để thực hiện Dependency Injection. Hãy cùng tìm hiểu cách tạo Spring Configuration class, ta sẽ bắt đầu bằng việc tạo một Java Bean class đơn giản.

package com.journaldev.spring;

public class MyBean {

	public MyBean() {
		System.out.println("MyBean instance created");
	}
	
}

Trước khi chúng ta sử dụng bất kỳ lớp nào của Spring Framework, chúng ta sẽ phải thêm các dependency của nó vào dự án Maven.

<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>5.0.6.RELEASE</version>
</dependency>

Bây giờ hãy tạo lớp Cấu hình Spring (Spring Configuration class).

package com.journaldev.spring;

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

@Configuration
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
		return new MyBean();
	}
	
}

Hãy viết một lớp đơn giản và cấu hình lớp cấu hình Spring đơn giản.

package com.journaldev.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MySpringApp {

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

		// MyBean mb1 = ctx.getBean(MyBean.class);

		// MyBean mb2 = ctx.getBean(MyBean.class);

		ctx.close();
	}

}

Nếu bạn chạy ứng dụng trên, nó sẽ tạo ra kết quả như sau:

May 23, 2018 12:34:54 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Wed May 23 12:34:54 IST 2018]; root of context hierarchy
MyBean instance created
May 23, 2018 12:34:54 PM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Wed May 23 12:34:54 IST 2018]; root of context hierarchy

Hãy lưu ý rằng Spring nạp các bean vào context của nó ngay cả trước khi chúng ta yêu cầu. Điều này nhằm đảm bảo tất cả các bean được cấu hình đúng cách và ứng dụng sẽ fail-fast nếu có sự cố xảy ra. Ngoài ra, ctx.refresh() phải được gọi, nếu không chúng ta sẽ nhận được lỗi sau khi cố gắng lấy bất kỳ bean nào từ context.

Exception in thread "main" java.lang.IllegalStateException: org.springframework.context.annotation.AnnotationConfigApplicationContext@f0f2775 has not been refreshed yet
	at org.springframework.context.support.AbstractApplicationContext.assertBeanFactoryActive(AbstractApplicationContext.java:1076)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1106)
	at com.journaldev.spring.MySpringApp.main(MySpringApp.java:11)

Nếu bạn bỏ dấu comment ở những dòng lấy instance của MyBean, bạn sẽ thấy constructor của MyBean không được gọi lại. Điều này là vì scope mặc định của Spring bean là Singleton. Chúng ta có thể thay đổi scope bằng annotation @Scope.

Điều gì xảy ra nếu bỏ @Configuration annotation?

Nếu bạn bỏ annotation @Configuration khỏi lớp MyConfiguration, bạn sẽ thấy chương trình vẫn chạy bình thường, Spring vẫn đăng ký và truy xuất bean dưới dạng singleton. Tuy nhiên, trong trường hợp này, nếu bạn gọi trực tiếp phương thức myBean() thì đó chỉ là một lời gọi phương thức Java thông thường, và bạn sẽ nhận được một instance mới của MyBean — tức là nó không còn là singleton nữa. Để chứng minh điều này, chúng ta sẽ định nghĩa thêm một bean khác sử dụng MyBean instance.

package com.journaldev.spring;

public class MyBeanConsumer {

	public MyBeanConsumer(MyBean myBean) {
		System.out.println("MyBeanConsumer created");
		System.out.println("myBean hashcode = "+myBean.hashCode());
	}

}

Lớp Spring Configuration được cập nhật của chúng ta là:

package com.journaldev.spring;

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

//@Configuration
public class MyConfiguration {

	@Bean
    public MyBean myBean() {
		return new MyBean();
	}
	
	@Bean
    public MyBeanConsumer myBeanConsumer() {
		return new MyBeanConsumer(myBean());
	}
}

Bây giờ khi chúng ta chạy lớp MySpringApp, nó sẽ tạo ra kết quả như sau.

MyBean instance created
MyBean instance created
MyBeanConsumer created
myBean hashcode = 1647766367

Vậy là MyBean không còn là singleton nữa, bây giờ hãy chú thích MyConfiguration với annotation @Configuration một lần nữa và chạy lớp MySpringApp. Lần này kết quả sẽ như dưới đây.

MyBean instance created
MyBeanConsumer created
myBean hashcode = 1095088856

Vì vậy, tốt hơn là nên sử dụng annotation @Configuration với các lớp cấu hình để đảm bảo spring container hoạt động đúng như chúng ta mong muốn. Nếu vì một lý do nào đó mà bạn không muốn sử dụng annotation @Configuration, chúng ta vẫn có thể tạo lớp cấu hình bằng cách không gọi trực tiếp phương thức myBean(), mà thay vào đó sử dụng một biến instance của MyBean được cấu hình thông qua annotation @Autowired. Một đoạn mã như dưới đây cũng sẽ hoạt động.

package com.journaldev.spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
public class MyConfiguration {

	@Autowired
	MyBean myBean;
	
	@Bean
    public MyBean myBean() {
		return new MyBean();
	}
	
	@Bean
    public MyBeanConsumer myBeanConsumer() {
		return new MyBeanConsumer(myBean);
	}
}

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất