Tạo một @Configuration
lớp có chú thích:
@Configuration
public class MyApplicationContext {
}
Đối với mỗi <bean>
thẻ, hãy tạo một phương thức được chú thích bằng @Bean
:
@Configuration
public class MyApplicationContext {
@Bean(name = "someBean")
public SomeClass getSomeClass() {
return new SomeClassImpl(someInterestingProperty); // We still need to inject someInterestingProperty
}
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass() {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); // We still need to inject beanFromSomewhereElse
}
}
Để nhập, beanFromSomewhereElse
chúng ta cần nhập định nghĩa của nó. Nó có thể được định nghĩa trong một XML và chúng tôi sẽ sử dụng @ImportResource
:
@ImportResource("another-application-context.xml")
@Configuration
public class MyApplicationContext {
...
}
Nếu bean được định nghĩa trong một @Configuration
lớp khác, chúng ta có thể sử dụng @Import
chú thích:
@Import(OtherConfiguration.class)
@Configuration
public class MyApplicationContext {
...
}
Sau khi chúng tôi nhập các @Configuration
lớp hoặc lớp XML khác , chúng tôi có thể sử dụng các bean mà chúng khai báo trong ngữ cảnh của chúng tôi bằng cách khai báo một thành viên riêng cho @Configuration
lớp như sau:
@Autowired
@Qualifier(value = "beanFromSomewhereElse")
private final StrangeBean beanFromSomewhereElse;
Hoặc sử dụng trực tiếp nó làm tham số trong phương thức xác định bean phụ thuộc vào điều này beanFromSomewhereElse
bằng cách sử dụng @Qualifier
như sau:
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse);
}
Nhập thuộc tính rất giống với nhập bean từ xml hoặc @Configuration
lớp khác. Thay vì sử dụng, @Qualifier
chúng tôi sẽ sử dụng @Value
với các thuộc tính như sau:
@Autowired
@Value("${some.interesting.property}")
private final String someInterestingProperty;
Điều này cũng có thể được sử dụng với biểu thức SpEL .
Để cho phép spring xử lý các lớp như vậy như vùng chứa bean, chúng ta cần đánh dấu điều này trong xml chính của chúng ta bằng cách đặt thẻ này vào ngữ cảnh:
<context:annotation-config/>
Bây giờ bạn có thể nhập @Configuration
các lớp giống hệt như cách bạn tạo một bean đơn giản:
<bean class="some.package.MyApplicationContext"/>
Có nhiều cách để tránh hoàn toàn các XML mùa xuân nhưng chúng không nằm trong phạm vi của câu trả lời này. Bạn có thể tìm thấy một trong những tùy chọn này trong bài đăng trên blog của tôi mà tôi đang dựa trên câu trả lời của mình.
Về cơ bản, tôi thấy phương pháp khai báo bean này thoải mái hơn nhiều so với việc sử dụng XML do một số ưu điểm mà tôi thấy:
Những nhược điểm không nhiều như tôi thấy nhưng có một số nhược điểm mà tôi có thể nghĩ đến: