Spring bean 是使用传统的 XML 方法配置的。在这篇文章中,您将学习使用基于纯 Java 的配置而非 XML 来编写 Spring bean 并配置它们。本文将介绍可用来配置 bean 的多种注释。此外还将演示基于 Java 的配置,将它与基于传统 XML 的方法进行比较。
概述
众所周知,Spring 框架是控制反转 (IOC) 或依赖性注入 (DI) 模式的推动因素,而这种推动是通过基于容器的配置实现的。过去,Spring 允许开发人员使用基于 XML 的配置,通过利用应用程序上下文 XML 文件来管理 bean 依赖性。此文件处于应用程序的外部,包含 bean 及其与该应用程序的依赖项的定义。尽管使用 XML 配置较为简单和便捷,但仍有另外一种方法可定义 bean 及其依赖项。这种方法也称为基于 Java 的配置。不同于 XML,基于 Java 的配置使您能够以编程方式管理 bean。这可通过运用多种注释来实现。 这篇文章将演示 Java 配置示例,并将其与传统 XML 配置方法相对比。本文将按照如下步骤演示基于 Java 的配置的基本用法:
- 理解 @Configuration 和 @Bean 注释
- 使用 AnnotationConfigApplicationContext 注册配置类
- 配置 Web 应用程序
- 实现 bean 生命周期回调和范围
我们将使用一所在线大学的 “创建课程” 用例。在创建课程的过程中,还会创建主题或者模块,而各主题可能又有着不同的作业。因此,我们要创建三个 bean,分别为 Course、Module 和 Assignment。Course
bean 将包含一个对 Module
bean 的引用,后者包含对 Assignment
bean 的引用。
理解 @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 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 的配置也被视为基于注释的配置。
使用 AnnotationConfigApplicationContext 注册配置类
在传统 XML 方法中,您可使用 ClassPathXmlApplicationContext
类来加载外部 XML 上下文文件。但在使用基于 Java 的配置时,有一个AnnotationConfigApplicationContext
类。AnnotationConfigApplicationContext
类是 ApplicationContext
接口的一个实现,使您能够注册所注释的配置类。此处的配置类是使用 @Configuration
注释声明的 AppContext
。在注册了所述类之后,@Bean
注释的方法返回的所有 bean 类型也会得到注册。以下代码演示了 AnnotationConfigApplicationContext
类的使用:
清单 3. 使用 AnnotationConfigApplicationContext 注册 AppContext 类
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class); Course course = ctx.getBean(Course.class); course.getName(); }
正如以上代码所示,AppContext
配置类的注册方式是将其传递给 AnnotationConfigApplicationContext
构造函数。此外,您还可以使用所述上下文类的 register
方法来注册配置类。以下代码展示了另外一种方法。
清单 4. 注册 AppContext 类:另外一种方法
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppContext.class) }
注册配置类将自动注册 @Bean
注释的方法名称,因而其对应的 bean 就是 Course
、Module
和 Assignment
。随后您可以使用 getBean
方法来获取相关的 bean,并调用其业务方法。如您所见,编写 Java 的配置类并将其注册到 Spring 上下文非常简单。下一节将讨论如何将基于 Java 的配置与 Web 应用程序配合使用。
配置 Web 应用程序
过去,您通常要利用 XmlWebApplicationContext
上下文来配置 Spring Web 应用程序,即在 Web 部署描述符文件 web.xml 中指定外部 XML 上下文文件的路径。XMLWebApplicationContext
是 Web 应用程序使用的默认上下文类。以下代码描述了 web.xml
中指向将由ContextLoaderListener
监听器类载入的外部 XML 上下文文件的元素。
清单 5. 使用外部 XML 上下文文件的 web.xml
<web-app> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>sampleServlet</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> </servlet> ... </web-app>
现在,您要将 web.xml
中的上述代码更改为使用 AnnotationConfigApplicationContext
类。切记,XmlWebApplicationContext
是 Spring 为 Web 应用程序使用的默认上下文实现,因此您永远不必在您的 web.xml
文件中显式指定这个上下文类。现在,您将使用基于 Java 的配置,因此在配置 Web 应用程序时,需要在 web.xml
文件中指定 AnnotationConfigApplicationContext
类。上述代码将修改如下:
清单 6. 修改后的使用 AnnotationConfigApplicationContext 的 web.xml
<web-app> <context-param> <param-name>contextClass</param-name> <param-value> org.springframework.web.context. support.AnnotationConfigWebApplicationContext </param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value> demo.AppContext </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>sampleServlet</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextClass</param-name> <param-value> org.springframework.web.context. support.AnnotationConfigWebApplicationContext </param-value> </init-param> </servlet> ... </web-app>
以上修改后的 web.xml
现在定义了 AnnotationConfigWebApplicationContext
上下文类,并将其作为上下文参数和 servlet 元素的一部分。上下文配置位置现在指向 AppContext
配置类。这非常简单。下一节将演示 bean 的生命周期回调和范围的实现。
实现 bean 生命周期回调和范围
生命周期回调
您还可以使用基于 Java 的配置来管理 bean 的生命周期。@Bean
支持两种属性,即 initMethod
和 destroyMethod
,这些属性可用于定义生命周期方法。在实例化 bean 或即将销毁它时,容器便可调用生命周期方法。生命周期方法也称为回调方法,因为它将由容器调用。使用 @Bean
注释注册的 bean 也支持 JSR-250 规定的标准 @PostConstruct
和 @PreDestroy
注释。如果您正在使用 XML 方法来定义 bean,那么就应该使用 bean 元素来定义生命周期回调方法。以下代码显示了在 XML 配置中通常使用 bean 元素定义回调的方法。
清单 7. 使用 XML 方法实现生命周期回调
<bean id="course" class="demo.Course" init-method="setup" destroy-method="cleanup" > <property name="module" ref="module"/> </bean>
以下代码演示了使用 Java 配置的生命周期方法
清单 8. 使用 AppContext 配置类实现 bean 生命周期方法
@Configuration public class AppContext { @Bean(initMethod = "setup", destroyMethod = "cleanup") public Course course() { Course course = new Course(); course.setModule(module()); return course; } @Bean(initMethod = "setup", destroyMethod = "cleanup") public Module module() { Module module = new Module(); module.setAssignment(assignment()); return module; } ... } public class Course { private Module module; private String name; public Course() { } public void setup() { this.name = "M100 Pythagoras Theorems" } public void setModule(Module module) { this.module = module; } public void cleanup() { module = null; } }
上面的代码重新访问了 AppContext
配置类。@Bean
注释现在有两个额外的属性,即 initMethod
和 destroyMethod
。它们定义了生命周期方法的设置和清除。这些方法是在已经注册的 bean 中实现的,最终由容器在 bean 初始化及其销毁之前调用它。这里以 Course
bean 为例,提供了生命周期方法实现。所实现的方法是 setup
和 cleanup
。同样,您还可以在 Module
和 Assignment
bean 中实现这些方法。
Bean 范围
bean 的方法是使用 @Scope
注释定义的。XML 中实现这一目标的方法是指定 bean 元素中的 scope 属性。
清单 9. 使用 XML 方法定义 bean 范围
<bean id="course" class="demo.Course" scope="prototype" > <property name="module" ref="module"/> </bean>
以下代码展示了使用 Java 配置的 bean 范围定义:
清单 10. 使用 AppContext 配置类定义 bean 范围
@Configuration public class AppContext { @Bean(initMethod = "setup", destroyMethod = "cleanup") @Scope("prototype") public Course course() { Course course = new Course(); course.setModule(module()); return course; } ... }
正如您在上面的代码中所看到的那样,在 Java 配置类中定义 bean 的范围非常简单。上面的 AppContext
配置类使用 @Scope
注释为 Course
bean 定义了一个 prototype 范围。默认范围是 singleton。
利用 Java 配置可以做许多事情。本文只触及了一些基础内容。使用 Java 配置并无显著优势,它仅仅是 Spring 提供的 XML 配置的替代方法。对于不喜欢在框架中使用 XML 的人来说,这是实现配置的一种出色方法。但缺点也是显而易见的,如果您对 Java 类中的配置做出了任何更改,就必须重新编译应用程序。
相关推荐
的配置,通过利用应用程序上下文XML文件来管理bean依赖性。此文件处于应用程序的外部,包含bean 及其与该应用程序的依赖项的定义。尽管使用XML配置较为简单和便捷,但仍有另外一种方法可定义bean
在实际开发中,我们可以使用Eclipse的Spring插件来简化Bean配置的创建和管理,同时结合Maven来构建和运行Spring应用。 通过以上内容,你应该对Spring框架中的Bean XML配置有了初步的理解。掌握这些知识点后,你将...
这里我们将详细探讨如何在Java中通过Spring获取配置的bean。 1. **BeanFactory与ApplicationContext** - **BeanFactory** 是Spring中最基础的IoC容器,负责管理和实例化Bean。它允许开发者定义Bean的生命周期和...
- **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...
在Spring中,Bean的管理包含多个方面:创建Bean实例、配置Bean属性、控制Bean的生命周期以及Bean作用域的定义。接下来将详细解释这些知识点。 1. Spring的工厂类: Spring通过工厂模式设计了一系列工厂类来创建对象...
Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...
在Spring框架中,Bean的配置方式主要有两种:XML配置和基于Java的配置。本文将深入探讨"使用java类...在实际操作中,应结合具体的项目需求,合理地使用XML配置、Java配置或是两者的混合使用,以达到最佳的配置效果。
综上所述,Spring Bean重复执行两次的问题通常是由于配置错误、依赖注入循环、初始化回调的不当使用、静态工厂方法的误用、AOP代理的配置问题或是Bean作用域设置不准确导致的。通过仔细检查和修正这些问题,可以避免...
实例化Spring Bean的方式多种多样,包括XML配置、注解配置以及Java配置等。而工厂方法是其中一种自定义实例化过程的方法。 1. **实例工厂方法** 实例工厂方法是通过一个具体的工厂类实例来创建Spring Bean。在...
3. **Java配置**:Spring 3.0引入了Java配置类,允许在Java类中定义Bean。这种方式更加面向对象,可以利用Java的强类型和IDE的检查功能。 **IOC容器BeanFactory和ApplicationContext**: Spring提供了两种主要的...
虽然通常这个注解用于Spring管理的Bean,但也可以在非Spring管理的类中使用,只要确保配置的加载和绑定过程正确执行。 为了读取YAML配置,你需要在Spring Boot应用的启动类或者其他适当的初始化点,注册`@...
例如,可以使用 Spring 的 @Order 注解来指定 bean 的初始化顺序,也可以使用 Spring 的生命周期接口(如 InitializingBean)来控制 bean 的初始化顺序。 总结 控制 2 个 bean 的初始化顺序是一个常见的问题,本篇...
此外,Spring还支持基于Java配置的组件扫描,使用`@ComponentScan`注解: ```java @Configuration @ComponentScan("com.example.myapp") public class AppConfig { // ... } ``` 除了自动扫描,Spring还提供了注解...
在本篇博文中,我们将深入探讨如何在Spring Boot应用中使用Java代码来创建Bean并将其注册到Spring容器中。这是Spring Boot的核心特性之一,它使得...总的来说,理解并熟练运用Java配置是掌握Spring Boot的关键步骤。
在Spring中,核心概念之一就是Bean,它是一个简单的Java对象,由Spring IoC容器管理。Spring通过XML配置文件或注解来定义、配置和管理Beans。下面将深入探讨`<beans>`、`<bean>`及其属性,以及其他相关的配置元素。 ...
2. **依赖注入**:在Bean定义中,可以使用`<property>`标签(XML配置)或`@Autowired`注解(Java配置)来注入依赖。例如: ```xml <bean id="myBean" class="com.example.MyClass"> </bean> ``` 或者: ```...
4. 可配置性:事务管理可以通过XML配置、注解或Java配置类灵活调整,Bean同样可以通过这些方式进行定义和定制。 5. 错误处理:事务提供了回滚机制来处理运行时错误,而Bean可能需要捕获异常并处理。 在实际开发中...
最后,关于文件`SpringApplyChapter4_6`,这可能是一个包含示例代码或练习的章节,可能涵盖了Spring Java配置的更多细节和应用场景,包括如何加载Java配置、如何使用@Bean创建复杂Bean、如何处理依赖关系等。...
3. **Java配置类**:Spring 3.0引入了Java配置,允许我们使用Java类来配置Bean。 ```java @Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } } ``` 这里的`@Bean...
3. **Spring Java Config**:在现代的Spring应用中,XML配置逐渐被Java配置取代。我们可以创建一个配置类,然后在其中声明bean,使用`@ComponentScan`扫描包含普通类的包,这样Spring就能自动管理普通类。同时,也...