在这个博客上,有关Spring的文章正变成一种趋势,我应该申请一个SpringSource的位置。由于我在使用XML 为Spring做配置时的固执,我的同事时常会骂我。是的,他看起来似乎是2000年代的,但XML确实具有一定的优势:
- 配置集中化,所有的组件并不是分散的,因此使你对beans有一个很好的概览,而且他们在同一个地方进行连接。
- 如果你需要分割文件,没问题,Spring可以帮你实现。然后(Spring)会通过内部<import>标签进行重新组合或者外部上下文文件进行聚合。
- 只有XML的配置可以显示的装配—而不是自动装配。有时候,后者(自动装配)对于我自己的口味有点过于神奇。表面上看很简单,却隐藏了复杂性:我们不仅需要在按类型和按名称自动装配之间进行切换,但更重要的是,在所有合格的转义,但经验更加丰富的Spring开发人员选择相关bean的策略。配置文件似乎让这变得更容易,但相对还是陌生的且了解的不够。
- 最后,但同等重要的,XML对Java文件是完全适用的:在两者之间没有耦合,因此类可以再多个不同的上下文配置文件中使用。
XML的唯一问题是你要等到运行时的时候来发现Bean里面的错误或者其他愚蠢的问题。另一方面,使用Spring的IDE插件(或者其他整合了Spring Tools Suite)就能帮助到你(处理这方面问题)。
在XML和直接注解在一个Bean类之间有一个有趣的选择,它就是JavaConfig,它是从V3.0后嵌入到Spring里的一个以前的独立项目。它用Java的编译时检查整合了XML的去耦的优势。JavaConfig能够等价看成是XML文件,不过它只是用Java编写的。它的完整文档在网上可以看到,而这篇文章帮助你开始使用JavaConfig。让我们把下面的XML文件移植为一个JavaConfig来作为一个例子吧:
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
02 | < beans xmlns = "http://www.springframework.org/schema/beans" |
03 | xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" |
04 | xsi:schemaLocation="http://www.springframework.org/schema/beans |
06 | http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> |
08 | < bean id = "button" class = "javax.swing.JButton" > |
09 | < constructor-arg value = "Hello World" /> |
12 | < bean id = "anotherButton" class = "javax.swing.JButton" > |
13 | < property name = "icon" ref = "icon" /> |
16 | < bean id = "icon" class = "javax.swing.ImageIcon" > |
18 | < bean class = "java.net.URL" > |
19 | < constructor-arg value = "http://morevaadin.com/assets/images/learning_vaadin_cover.png" /> |
下面是等价的文件:
01 | import java.net.MalformedURLException; |
04 | import javax.swing.Icon; |
05 | import javax.swing.ImageIcon; |
06 | import javax.swing.JButton; |
08 | import org.springframework.context.annotation.Bean; |
09 | import org.springframework.context.annotation.Configuration; |
12 | public class MigratedConfiguration { |
15 | public JButton button() { |
17 | return new JButton( "Hello World" ); |
21 | public JButton anotherButton(Icon icon) { |
23 | return new JButton(icon); |
27 | public Icon icon() throws MalformedURLException { |
29 | URL url = new URL( "http://morevaadin.com/assets/images/learning_vaadin_cover.png" ); |
31 | return new ImageIcon(url); |
用法很简单:使用@Configuration注解主要的类个别的生成方法就用@Bean来注解。恕我直言,唯一的缺点是它使用了自动连接。除此之外,它做的不错。
请注意,在Web工程中,Web部署文件应该增加以下几行:
2 | < param-name >contextClass</ param-name > |
3 | < param-value >org.springframework.web.context.support.AnnotationConfigWebApplicationContext</ param-value > |
6 | < param-name >contextConfigLocation</ param-name > |
7 | < param-value >com.packtpub.learnvaadin.springintegration.SpringIntegrationConfiguration</ param-value > |
这篇文章Maven/Eclipse下的源码 下载
更多:
- Java-based container configuration documentation
- AnnotationConfigWebApplicationContextJavaDoc
- @ContextConfigurationJavaDoc (to configure Spring Test to use JavaConfig)