理解 @Configuration 和 @Bean 注释
在理想的场景中,您可以在表示应用程序上下文的 XML 中定义 bean。以下代码展示了创建课程 用例中的上下文 XML 及 bean 定义:
清单 1. XML 与 bean 定义
<beans>
<bean id="course" class="demo.Course">
<property name="module" ref="module"/>
</bean>
<bean id="module" class="demo.Module">
<property name="assignment" ref="assignment"/>
</bean>
<bean id="assignment" class="demo.Assignment" />
</beans>
以上 XML 就是您在使用 Spring 配置 bean 时通常会编写的代码。这段 XML 代码定义了 Course
bean,它引用 Module
bean。Module
bean 有一个 Assignment
bean 的引用。您现在要删除这段 XML,编写同等效果的 Java 代码。您将使用基于 Java 的配置定义上面指定的 bean。我们会将 XML 替换为 Java 类,这个 Java 类现在将用作 bean 配置的平台。我们将这个类命名为 AppContext.java
。以下代码展示了 AppContext
类。
清单 2. 包含 bean 定义的 AppContext 配置类
@Configuration
public class AppContext {
@Bean
public Course course() {
Course course = new Course();
course.setModule(module());
return course;
}
/**
*实现了bean的嵌套注入
**/
@Bean
public Module module() {
Module module = new Module();
module.setAssignment(assignment());
return module;
}
@Bean
public Assignment assignment() {
return new Assignment();
}
}
正如您通过以上代码所看到的那样,现在可以以编程的方式将 bean 定义为基于 Java 的配置的一部分。AppContext
类现在就像 XML 一样表示配置类。这是通过利用 @Configuration
注释实现的。@Configuration
注释位于类的顶端。它告知 Spring 容器这个类是一个拥有 bean 定义和依赖项的配置类。@Bean
注释用于定义 bean。上述注释位于实例化 bean 并设置依赖项的方法上方。方法名称与 bean id 或默认名称相同。该方法的返回类型是向 Spring 应用程序上下文注册的 bean。您可使用 bean 的 setter 方法来设置依赖项,容器将调用它们来连接相关项。基于 Java 的配置也被视为基于注释的配置。