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 所谓的“初始化方法”的通用注解。
  • **javax.annotation.PreDestroy**: JSR-250 用于 Spring 所谓的“销毁方法”的通用注解。
  • **javax.annotation.Resource**: JSR-250 用于按名称注入外部组件的通用注解。在 JSR-250 术语中,“资源”实际上指的是中间件组件,例如 DataSource。
  • **javax.xml.ws.WebServiceRef**: 类比于 @Resource,用于 JAX-WS 服务查找,注入 JAX-WS 端口代理。
  • **javax.ejb.EJB**: 类比于 @Resource,用于 EJB 会话 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 类!这是一个重要的设计目标:Spring 2.5 可以作为标准 JSF 1.2 托管 bean 功能的直接替代,只需选择 **SpringBeanFacesELResolver** 作为您的自定义 JSF ELResolver 即可。

从配置方面来说,要启用上述所有注解,您只需在 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 时才可用。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 代理中,基于注解的事务仅限于通过代理传入的公共方法调用。

如果您的环境能够进行加载时编织,则以下配置足以启用 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 导出。默认的 MBeanServer 将在所有常用平台上自动检测,包括标准 Java 5 平台 MBeanServer 以及 WebLogic 9/10 和 WebSphere 6 公开的特殊 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**: 在公共方法级别使用,以指示一个导出器 MBean 操作。


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

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

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,帮助您快速提升进度。

了解更多

获取支持

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

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部