Spring - Cấu hình dựa trên Java
Đến đây bạn đã thấy cách chúng tôi cấu hình Spring bean bằng tệp cấu hình XML. Nếu bạn cảm thấy thoải mái với cấu hình XML, thì thực sự không bắt buộc phải học cách tiếp tục với cấu hình dựa trên Java vì bạn sẽ đạt được kết quả tương tự bằng cách sử dụng một trong các cấu hình có sẵn.
Tùy chọn cấu hình dựa trên Java cho phép bạn viết hầu hết cấu hình Spring của mình mà không cần XML nhưng với sự trợ giúp của một số chú thích dựa trên Java được giải thích trong chương này.
@Configuration & @Bean Annotations
Chú thích một lớp với @Configurationchỉ ra rằng lớp có thể được sử dụng bởi Spring IoC container làm nguồn định nghĩa bean. Các@Beanchú thích cho Spring biết rằng một phương thức được chú thích bằng @Bean sẽ trả về một đối tượng nên được đăng ký dưới dạng bean trong ngữ cảnh ứng dụng Spring. Lớp @Configuration đơn giản nhất có thể sẽ như sau:
package com.tutorialspoint;
import org.springframework.context.annotation.*;
@Configuration
public class HelloWorldConfig {
@Bean
public HelloWorld helloWorld(){
return new HelloWorld();
}
}
Đoạn mã trên sẽ tương đương với cấu hình XML sau:
<beans>
<bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" />
</beans>
Ở đây, tên phương thức được chú thích bằng @Bean hoạt động như bean ID và nó tạo và trả về bean thực. Lớp cấu hình của bạn có thể có một khai báo cho nhiều hơn một @Bean. Khi các lớp cấu hình của bạn được xác định, bạn có thể tải và cung cấp chúng cho vùng chứa Spring bằng AnnotationConfigApplicationContext như sau:
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(HelloWorldConfig.class);
HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
helloWorld.setMessage("Hello World!");
helloWorld.getMessage();
}
Bạn có thể tải các lớp cấu hình khác nhau như sau:
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class, OtherConfig.class);
ctx.register(AdditionalConfig.class);
ctx.refresh();
MyService myService = ctx.getBean(MyService.class);
myService.doStuff();
}
Thí dụ
Hãy để chúng tôi có một IDE Eclipse đang hoạt động và thực hiện các bước sau để tạo một ứng dụng Spring -
Các bước | Sự miêu tả |
---|---|
1 | Tạo một dự án với tên SpringExample và tạo một gói com.tutorialspoint trongsrc thư mục trong dự án đã tạo. |
2 | Thêm các thư viện Spring bắt buộc bằng cách sử dụng tùy chọn Thêm JAR bên ngoài như được giải thích trong chương Ví dụ về Spring Hello World . |
3 | Bởi vì bạn đang sử dụng các chú thích dựa trên Java, vì vậy bạn cũng cần thêm CGLIB.jar từ thư mục cài đặt Java và thư viện ASM.jar có thể tải xuống từ asm.ow2.org . |
4 | Tạo các lớp Java HelloWorldConfig , HelloWorld và MainApp trong gói com.tutorialspoint . |
5 | Bước cuối cùng là tạo nội dung của tất cả các tệp Java và tệp Cấu hình Bean và chạy ứng dụng như được giải thích bên dưới. |
Đây là nội dung của HelloWorldConfig.java tập tin
package com.tutorialspoint;
import org.springframework.context.annotation.*;
@Configuration
public class HelloWorldConfig {
@Bean
public HelloWorld helloWorld(){
return new HelloWorld();
}
}
Đây là nội dung của HelloWorld.java tập tin
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
Sau đây là nội dung của MainApp.java tập tin
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;
public class MainApp {
public static void main(String[] args) {
ApplicationContext ctx =
new AnnotationConfigApplicationContext(HelloWorldConfig.class);
HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
helloWorld.setMessage("Hello World!");
helloWorld.getMessage();
}
}
Khi bạn đã hoàn tất việc tạo tất cả các tệp nguồn và thêm các thư viện bổ sung cần thiết, hãy để chúng tôi chạy ứng dụng. Bạn cần lưu ý rằng không cần tệp cấu hình. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau:
Your Message : Hello World!
Tiêm phụ thuộc Bean
Khi @Beans có các phụ thuộc vào nhau, việc biểu thị rằng phụ thuộc đơn giản như việc một phương thức bean gọi một phương thức khác như sau:
package com.tutorialspoint;
import org.springframework.context.annotation.*;
@Configuration
public class AppConfig {
@Bean
public Foo foo() {
return new Foo(bar());
}
@Bean
public Bar bar() {
return new Bar();
}
}
Ở đây, foo bean nhận được một tham chiếu đến thanh thông qua việc chèn hàm tạo. Bây giờ chúng ta hãy xem xét một ví dụ làm việc khác.
Thí dụ
Hãy để chúng tôi có một IDE Eclipse đang hoạt động và thực hiện các bước sau để tạo một ứng dụng Spring -
Các bước | Sự miêu tả |
---|---|
1 | Tạo một dự án với tên SpringExample và tạo một gói com.tutorialspoint trongsrc thư mục trong dự án đã tạo. |
2 | Thêm các thư viện Spring bắt buộc bằng cách sử dụng tùy chọn Thêm JAR bên ngoài như được giải thích trong chương Ví dụ về Spring Hello World . |
3 | Bởi vì bạn đang sử dụng các chú thích dựa trên Java, vì vậy bạn cũng cần thêm CGLIB.jar từ thư mục cài đặt Java và thư viện ASM.jar có thể tải xuống từ asm.ow2.org . |
4 | Tạo các lớp Java TextEditorConfig , TextEditor , SpellChecker và MainApp trong gói com.tutorialspoint . |
5 | Bước cuối cùng là tạo nội dung của tất cả các tệp Java và tệp Cấu hình Bean và chạy ứng dụng như được giải thích bên dưới. |
Đây là nội dung của TextEditorConfig.java tập tin
package com.tutorialspoint;
import org.springframework.context.annotation.*;
@Configuration
public class TextEditorConfig {
@Bean
public TextEditor textEditor(){
return new TextEditor( spellChecker() );
}
@Bean
public SpellChecker spellChecker(){
return new SpellChecker( );
}
}
Đây là nội dung của TextEditor.java tập tin
package com.tutorialspoint;
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor(SpellChecker spellChecker){
System.out.println("Inside TextEditor constructor." );
this.spellChecker = spellChecker;
}
public void spellCheck(){
spellChecker.checkSpelling();
}
}
Sau đây là nội dung của một tệp lớp phụ thuộc khác SpellChecker.java
package com.tutorialspoint;
public class SpellChecker {
public SpellChecker(){
System.out.println("Inside SpellChecker constructor." );
}
public void checkSpelling(){
System.out.println("Inside checkSpelling." );
}
}
Sau đây là nội dung của MainApp.java tập tin
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;
public class MainApp {
public static void main(String[] args) {
ApplicationContext ctx =
new AnnotationConfigApplicationContext(TextEditorConfig.class);
TextEditor te = ctx.getBean(TextEditor.class);
te.spellCheck();
}
}
Khi bạn đã hoàn tất việc tạo tất cả các tệp nguồn và thêm các thư viện bổ sung cần thiết, hãy để chúng tôi chạy ứng dụng. Bạn cần lưu ý rằng không cần tệp cấu hình. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau:
Inside SpellChecker constructor.
Inside TextEditor constructor.
Inside checkSpelling.
Chú thích @Import
Các @Importchú thích cho phép tải các định nghĩa @Bean từ một lớp cấu hình khác. Hãy xem xét một lớp ConfigA như sau:
@Configuration
public class ConfigA {
@Bean
public A a() {
return new A();
}
}
Bạn có thể nhập khai báo Bean ở trên trong một Khai báo Bean khác như sau:
@Configuration
@Import(ConfigA.class)
public class ConfigB {
@Bean
public B b() {
return new B();
}
}
Bây giờ, thay vì cần chỉ định cả lớp ConfigA.class và ConfigB.class khi khởi tạo ngữ cảnh, chỉ cần cung cấp ConfigB như sau:
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);
// now both beans A and B will be available...
A a = ctx.getBean(A.class);
B b = ctx.getBean(B.class);
}
Gọi lại vòng đời
Chú thích @Bean hỗ trợ chỉ định các phương thức gọi lại khởi tạo và hủy tùy ý, giống như các thuộc tính init-method và Dest-method của Spring XML trên phần tử bean -
public class Foo {
public void init() {
// initialization logic
}
public void cleanup() {
// destruction logic
}
}
@Configuration
public class AppConfig {
@Bean(initMethod = "init", destroyMethod = "cleanup" )
public Foo foo() {
return new Foo();
}
}
Chỉ định phạm vi đậu
Phạm vi mặc định là singleton, nhưng bạn có thể ghi đè điều này bằng chú thích @Scope như sau:
@Configuration
public class AppConfig {
@Bean
@Scope("prototype")
public Foo foo() {
return new Foo();
}
}