Spring 2.5 的全面注解支持

工程 | Juergen Hoeller | 2008 年 1 月 28 日 | ...

Spring 2.5 背后的核心主题之一是全面的基于注解的配置。我们一直在讨论并撰写大量关于 @Autowired、Spring MVC 的 @RequestMapping 以及对使用 JUnit4 或 TestNG 编写的注解测试的新支持的博客。@Autowired 无疑是 Spring 2.5 中最重要的注解,可用于服务组件、Web 组件、单元测试,甚至在使用 Spring 的 @Configurable 结合 AspectJ 织入时的领域对象。Spring MVC 的 @RequestMapping 同样灵活,支持多种处理程序方法签名变体。

今天我想把重点放在不同的方面,即 Spring 支持的广泛的依赖注入注解集。以下列表包含了可在 Spring 2.5 bean 中使用的关键注解

  • org.springframework.beans.factory.annotation.Required: 标识必须被调用的 bean 属性 setter(与可选的 setter 相对)。自 Spring 2.0 起支持。
  • org.springframework.beans.factory.annotation.Autowired: Spring 2.5 的核心注入注解,适用于构造函数、配置方法和字段。按类型执行组件注入,支持“限定符”注解,以便在有多个匹配项时缩小潜在候选集的范围。
  • javax.annotation.PostConstruct: JSR-250 的通用注解,用于 Spring 称为“init 方法”的用途。
  • javax.annotation.PreDestroy: JSR-250 的通用注解,用于 Spring 称为“destroy 方法”的用途。
  • javax.annotation.Resource: JSR-250 的通用注解,用于按名称注入外部组件。在 JSR-250 术语中,“resource”实际上是指诸如 DataSource 之类的中间件组件。
  • javax.xml.ws.WebServiceRef: 类似于 @Resource,用于 JAX-WS 服务查找,注入 JAX-WS 端口代理。
  • javax.ejb.EJB: 类似于 @Resource,用于 EJB Session Bean 查找,注入 EJB 组件引用。
  • javax.persistence.PersistenceUnit: 按持久化单元名称注入 JPA EntityManagerFactory。自 Spring 2.0 起支持。
  • javax.persistence.PersistenceContext: 按持久化单元名称注入 JPA EntityManager。自 Spring 2.0 起支持。


这组注解包含了 Java EE 5 的所有通用注解,这意味着您可以在例如 Servlet 2.5 的 servlet、JSF 1.2 的托管 bean 和 Spring 的托管 bean 中使用相同的通用注解。换句话说,如果您有一些使用了注解的标准 JSF 1.2 托管 bean,您可以按原样将它们的定义从 faces-config 移到 Spring 应用上下文,而无需更改 bean 类!这是一个重要的设计目标:通过简单地选择 SpringBeanFacesELResolver 作为您的自定义 JSF ELResolver,Spring 2.5 可以直接替代标准的 JSF 1.2 托管 bean 功能。

在配置方面,您只需在 Spring 应用上下文中使用以下简单的配置元素即可启用上述完整的注解集

<context:annotation-config/>

请注意,此设置仅与依赖注入相关,不需要任何参数化。(对于自定义,可以考虑定义 Spring 的独立 AnnotationBeanPostProcessor,例如 CommonAnnotationBeanPostProcessor)。但是,annotation-config 元素激活任何形式的代理或特殊导出。为此,Spring 提供了更具体的配置元素

<tx:annotation-driven/>

此设置激活事务注解的处理,Spring 2.5 开箱即用支持以下两种变体

  • org.springframework.transaction.annotation.Transactional: Spring 自身的事务注解,自 Spring 1.2 引入。允许在事务级别指定传播行为(REQUIRED, REQUIRES_NEW 等)、只读标志、自定义隔离级别(REPEATABLE_READ, SERIALIZABLE 等)以及自定义回滚规则。
  • javax.ejb.TransactionAttribute EJB 3.0 的事务注解。除了传播行为(REQUIRED, REQUIRES_NEW 等)之外,没有其他自定义选项。


旁注:与 Spring 的所有支持选项一样,EJB 3.0 TransactionAttribute 注解仅在 EJB 3.0 API 实际存在于 classpath 中时可用。Spring 会自动适应该 API 的存在,类似于 JSR-250 API 或 JPA API(如上所述)。

<tx:annotation-driven> 元素允许进行事务特定配置,例如要与之通信的 Spring PlatformTransactionManager(通过“transaction-manager”属性)以及操作的模式

<tx:annotation-driven transaction-manager="myTm" mode="aspectj"/>

事务注解处理的显式 AspectJ 模式是 Spring 2.5 中的新功能,允许使用 Spring 的 AnnotationTransactionAspect 代替传统的 AOP 代理。这需要 AspectJ 编译时织入或加载时织入,修改恰好使用了 @Transactional 注解的类的字节码。这种织入允许支持注解在任何类型的方法上:无论是 public、protected 还是 private,无论是外部调用还是对象内部的调用,事务都将始终按照注解的指定启动。这与传统的 AOP 代理形成鲜明对比,在传统的 AOP 代理中,注解驱动的事务仅限于通过代理进入的 public 方法调用。

如果您的环境支持加载时织入,那么以下配置足以启用 AspectJ 风格的事务注解处理。请注意,这需要具有内置织入支持的运行时环境(例如 WebLogic 10、OC4J 10.1.3.1、配置了 Spring 的 TomcatInstrumentableClassLoader 的 Tomcat),或者在 JVM 启动时指定 Spring 的 VM 代理(“-javaagent:spring-agent.jar”)。

<context:load-time-weaver/>

<tx:annotation-driven mode="aspectj"/>

<bean id="transactionManager" class="..."/>

最后,Spring 2.5 还提供了一个方便的配置元素用于激活 JMX 导出。在所有常见平台上,包括标准的 Java 5 平台 MBeanServer 以及 WebLogic 9/10 和 WebSphere 6 暴露的特殊 MBeanServer,默认的 MBeanServer 都将自动检测到。

<context:mbean-export/>

Spring 管理的 bean 可以实现标准的 MBean/MXBean 约定,符合 JMX 规范的 MBean 类,或者使用以下注解声明其管理签名(自 Spring 1.2 起已知)

  • org.springframework.jmx.export.annotation.ManagedResource: 用于类型级别,表示一个通过 JMX 暴露的组件。
  • org.springframework.jmx.export.annotation.ManagedAttribute: 用于 bean 属性 setter/getter 级别,表示一个 MBean 属性。
  • org.springframework.jmx.export.annotation.ManagedOperation: 用于 public 方法级别,表示一个导出的 MBean 操作。


这体现了 Spring 注解配置模型的真正强大之处:不同的配置关注点无缝地融合成一个统一的整体,具有一致的配置风格和统一的组件生命周期——归根结底,它仍然是一个由 Spring ApplicationContext 管理的标准 Spring bean!

关于 Spring 核心配置注解的简要介绍到此为止。如果您有兴趣了解更多关于 Spring 2.5 的新功能以及它们如何协同工作,我邀请您参加本周三的Spring 2.5 网络研讨会,我将在其中涵盖 Spring 2.5 的所有关键功能领域,从 Java 6 支持到基于注解的配置!

订阅 Spring 快讯

订阅 Spring 快讯,保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将到来的活动

查看 Spring 社区的所有即将到来的活动。

查看全部