简介: 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。Coursebean 将包含一个对Modulebean 的引用,后者包含对Assignmentbean 的引用。

在理想的场景中,您可以在表示应用程序上下文的 XML 中定义 bean。以下代码展示了创建课程用例中的上下文 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 代码定义了Coursebean,它引用Modulebean。Modulebean 有一个Assignmentbean 的引用。您现在要删除这段 XML,编写同等效果的 Java 代码。您将使用基于 Java 的配置定义上面指定的 bean。我们会将 XML 替换为 Java 类,这个 Java 类现在将用作 bean 配置的平台。我们将这个类命名为AppContext.java。以下代码展示了AppContext类。

@Configuration
public class AppContext {@Beanpublic Course course() {Course course = new Course();course.setModule(module());return course;}@Beanpublic Module module() {Module module = new Module();module.setAssignment(assignment());return module;}@Beanpublic 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类的使用:

public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);Course course = ctx.getBean(Course.class);course.getName();
}

正如以上代码所示,AppContext配置类的注册方式是将其传递给AnnotationConfigApplicationContext构造函数。此外,您还可以使用所述上下文类的register方法来注册配置类。以下代码展示了另外一种方法。

public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext();ctx.register(AppContext.class)
}

注册配置类将自动注册@Bean注释的方法名称,因而其对应的 bean 就是CourseModuleAssignment。随后您可以使用getBean方法来获取相关的 bean,并调用其业务方法。如您所见,编写 Java 的配置类并将其注册到 Spring 上下文非常简单。下一节将讨论如何将基于 Java 的配置与 Web 应用程序配合使用。

过去,您通常要利用XmlWebApplicationContext上下文来配置 Spring Web 应用程序,即在 Web 部署描述符文件 web.xml 中指定外部 XML 上下文文件的路径。XMLWebApplicationContext是 Web 应用程序使用的默认上下文类。以下代码描述了web.xml中指向将由ContextLoaderListener监听器类载入的外部 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类。上述代码将修改如下:

<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 的生命周期回调和范围的实现。

您还可以使用基于 Java 的配置来管理 bean 的生命周期。@Bean支持两种属性,即initMethoddestroyMethod,这些属性可用于定义生命周期方法。在实例化 bean 或即将销毁它时,容器便可调用生命周期方法。生命周期方法也称为回调方法,因为它将由容器调用。使用@Bean注释注册的 bean 也支持 JSR-250 规定的标准@PostConstruct@PreDestroy注释。如果您正在使用 XML 方法来定义 bean,那么就应该使用 bean 元素来定义生命周期回调方法。以下代码显示了在 XML 配置中通常使用 bean 元素定义回调的方法。

<bean id="course" class="demo.Course" init-method="setup" destroy-method="cleanup" ><property name="module" ref="module"/>
</bean>

以下代码演示了使用 Java 配置的生命周期方法

@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注释现在有两个额外的属性,即initMethoddestroyMethod。它们定义了生命周期方法的设置和清除。这些方法是在已经注册的 bean 中实现的,最终由容器在 bean 初始化及其销毁之前调用它。这里以Coursebean 为例,提供了生命周期方法实现。所实现的方法是setupcleanup。同样,您还可以在ModuleAssignmentbean 中实现这些方法。

bean 的方法是使用@Scope注释定义的。XML 中实现这一目标的方法是指定 bean 元素中的 scope 属性。

<bean id="course" class="demo.Course" scope="prototype" ><property name="module" ref="module"/>
</bean>

以下代码展示了使用 Java 配置的 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注释为Coursebean 定义了一个prototype范围。默认范围是singleton

利用 Java 配置可以做许多事情。本文只触及了一些基础内容。使用 Java 配置并无显著优势,它仅仅是 Spring 提供的 XML 配置的替代方法。对于不喜欢在框架中使用 XML 的人来说,这是实现配置的一种出色方法。但缺点也是显而易见的,如果您对 Java 类中的配置做出了任何更改,就必须重新编译应用程序。

转自http://www.ibm.com/developerworks/cn/webservices/ws-springjava/

转载于:https://blog.51cto.com/lccloud/1369013

Spring Bean配置方式之一:Java配置相关推荐

  1. SpringBoot中使用AMQ的两种方式(Java配置、注解方式)

    Java配置方式使用AMQ 1. 引入依赖(pom.xml) <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns ...

  2. Spring MVC 5 + Thymeleaf 基于Java配置和注解配置

    Spring MVC 5 + Thymeleaf 注解配置 Spring的配置方式一般为两种:XML配置和注解配置 Spring从3.0开始以后,推荐使用注解配置,这两种配置的优缺点说的人很多,我就不 ...

  3. 【Spring第七篇】Java配置类:JavaConfig

    Java配置类:JavaConfig 在spring配置中 applicationContext.xml <?xml version="1.0" encoding=" ...

  4. Spring bean注入方式

    版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5619525.html  Spring bean提供了3中注入方式:属 ...

  5. Spring之注解方式实例化Java类

    我们知道一个<bean></bean>就代表一个对象,如果想创建多个对象,就要使用多个<bean></bean>,所以这里有个简便的方法: <co ...

  6. xp java配置_WinXP系统Java配置环境变量的方法

    谈起Java环境变量我想大多数编程人员都知道,因为我们想要进行编程就必须先配置它,不过不少用户不知道WinXP系统Java怎么配置环境变量,为此小编赶紧整理了一篇WinXP系统Java配置环境变量的方 ...

  7. java timmer模式配置_使用java配置定时任务的几种配置方式及示例

    Spring定时器,主要有两种实现方式,包括Java Timer定时和Quartz定时器! 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 package ...

  8. java bean spring_Java+Spring+Bean+注入方式

    1.首先准备共享文件 调用方法Client端Client.java: import org.springframework.context.support.ClassPathXmlApplicatio ...

  9. java spring配置类_spring 配置 Java配置类装配bean

    https://www.cnblogs.com/chenbenbuyi/p/8457700.html 自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应 ...

  10. Spring Bean的三种配置方式

    目录 一.传统的XML配置方式 二.基于java注解的配置 三.基于类的Java Config 正文 Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java C ...

最新文章

  1. 【UVA】11991 Easy Problem from Rujia Liu? (整数v第k次出现在什么位置)
  2. 人脸识别再遭弃用,美国之后这回轮到欧盟
  3. 使用VMware桥接模式组建局域网测试MSMQ(二)
  4. Maven私服的配置和使用
  5. cocos2dx 回调函数
  6. 和小哥哥一起刷洛谷(6) 图论之SPFA算法
  7. 函数 tostring_QDate、QTime、QDateTime的相关函数说明
  8. 计算机毕业设计看这篇就够了(二)毕设流程
  9. 微信小程序中英文切换
  10. delphi阿里云短信(支持SendSms短信发送、SendBatchSms短信批量发送、QuerySendDetails查询短信发送记录),D7~XE10可用
  11. 人工智能成热门 苹果谷歌等科技公司竞相涌入改变神经科学研究
  12. 调研目前主要的开源网络爬虫,并且说明各自的特点、局限性以及相互之间的区别
  13. php获取手机号码6,php随机生成姓名,手机号,6位数
  14. 小米android通知栏图标不显示,MIUI开发版更新:已修复原生样式下部分通知图标不显示的问题...
  15. R count函数_第477期|R语言绘图之图形组合
  16. 【回炉重造】带你搞懂什么是机器学习?
  17. windows批处理bat脚本技巧
  18. LeetCode T46 Permutations
  19. 成都富华力鼎:抖音直播技巧
  20. 分享一个毕业实习体会

热门文章

  1. 批量插入/修改网页代码的asp脚本
  2. 拉丁法谚讲习1-24 【ZZ】
  3. 系统负载LoadAverage
  4. The Interface name: -- index:21 you checked seems not up.
  5. line-height 行高
  6. .NET Core竟然无法在Mac下进行build
  7. What are some time-saving tips that every Linux us
  8. 【JAVASCRIPT】jquery实现新闻滚动效果
  9. 【原创】腾讯微博的XSS攻击漏洞
  10. Spring Boot WebFlux 全局异常处理(404,500)解决IllegalArgumentException: Property 'message...