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 weaving 时也可以用于领域对象。Spring MVC 的 **@RequestMapping** 也同样灵活,支持多种 handler 方法签名变体。

今天我想换个重点,namely,介绍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的核心注入注解,应用于构造函数、配置方法和字段。通过类型执行组件注入,支持“qualifier”注解,可在有多个匹配项时缩小候选集。
  • javax.annotation.PostConstruct:JSR-250中用于Spring称为“init methods”的通用注解。
  • javax.annotation.PreDestroy:JSR-250中用于Spring称为“destroy methods”的通用注解。
  • javax.annotation.Resource:JSR-250中用于按名称注入外部组件的通用注解。“resource”在JSR-250术语中实际上是指中间件组件,例如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 servlets、JSF 1.2 managed beans和Spring managed beans中使用相同的通用注解。换句话说,如果您有一些使用注解的标准的JSF 1.2 managed beans,您可以直接将它们从faces-config移动到Spring应用程序上下文中,而无需更改bean类!这是一个重要的设计目标:Spring 2.5可以通过选择SpringBeanFacesELResolver作为自定义JSF ELResolver,直接替换标准的JSF 1.2 managed bean功能。

在配置方面,您需要的所有操作,以启用上述完整的注解集,是在您的Spring应用程序上下文中添加以下简单的配置元素:

<context:annotation-config/>

请注意,此设置仅与依赖注入相关,不需要任何参数化。(如需自定义,请考虑定义Spring的individual AnnotationBeanPostProcessors,例如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"/>

Spring 2.5中新增的显式AspectJ模式事务注解处理,允许使用Spring的AnnotationTransactionAspect而不是传统的AOP代理。这需要AspectJ编译时织入或加载时织入,修改恰好使用@Transactional注解的类的字节码。这种织入允许注解在任何类型的方法上生效:无论是public、protected还是private——无论是外部调用还是对象内部的调用——事务都会按照注解的指定进行。这与传统的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导出。默认的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:在public方法级别使用,表示一个导出器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 社区所有即将举行的活动。

查看所有