【问题标题】:Spring annotations conflicts with my design guidelinesSpring 注解与我的设计准则冲突
【发布时间】:2010-12-09 16:11:58
【问题描述】:

概述
使用

  • Spring 3.0.1(注解配置)
    • 当前配置使用 CGLib 作为代理创建者,但这不是我的偏好
    • 事务是没有任何特殊设置的注释配置
    • 所有配置都使用注释完成(@Service@Transactional@ManagedResource@Inject 等)
  • Hibernate 3.5(实体使用 javax.persistence 注释)

指南要点

  • 每个使用@Repository@Service 注释的bean 都必须有一个接口
  • 构造函数 DI(不需要重新配置时)
    • 构造函数具有默认可见性 (Foo(Bar bar) {...})
  • Bean 字段是 final(不需要重新配置时)
    • 导致没有默认构造函数
  • default 使用 final 修饰符 (final class Foo) 可见实现

问题

  1. CGLib 无法代理最终类
  2. CGLib 需要默认(空)构造函数
  3. 某些服务需要通过 JMX 公开
  4. 除非由 CGLib 代理,否则 MBean 导出器无法工作
  5. 一些@Transactional@Services 是通过外观服务访问的,这需要在外观事务中包含多个服务(例如,超过 2 个应用程序组件的观察者服务)
  6. 有些接口有多个实现(目前以@Qualifier 区分)
  7. 未来的指导方针(或很高兴拥有功能) - 每个应用程序模块都将有 beanRefContext.xml 文件来配置其内部应用程序上下文

当我过去使用 XML 配置时,我能够强制执行我上面介绍的所有准则,但是当切换到注释时,Spring 似乎行为不端。
我小组中的开发人员更喜欢注解配置(我似乎更容易连接和编写新代码),但我注意到他们在代码中引入了各种“黑客”,以防止处理 Spring 应用程序上下文故障。

问题

  1. 在使用注释配置时我应该遵循哪些最佳实践?
    • 当每个接口使用多个实现时(试图减少 @Primary@Qualifier 的使用)
    • 当使用@Transactional
    • 当使用@ManagedResource
    • 结合使用上述方法时
  2. 有没有办法停止使用 CGLib,保留注解配置并且仍然能够导出带有注解的 MBean?
  3. 什么是保留我的大部分(最好是全部)指南的合适实施方式?

【问题讨论】:

  • 恕我直言,这些准则很奇怪。为什么不尝试遵守 Java Beans 规范呢?无论如何,如果它们只是指导方针,我想如果最后是合理的,你可以忽略中间的那些。
  • 我不会说它们奇怪,它们继承自有效的 Java 编程指南。这些不是 Java bean,而是 Spring bean。另外,当使用 XML 时,遵循这些准则没有问题,因此恕我直言,注释是不合理的。

标签: java spring annotations cglib


【解决方案1】:

我想出了以下解决方案(针对问题 #2 和 #3),以便能够执行我的设计指南并继续使用基于注释的配置:

  • 每个依赖项目(Maven 模块)都有自己的ApplicationContext
  • 每个相关的项目应用程序上下文都在beanRefContext.xml 中定义
  • 这些应用程序上下文使用 Spring 上下文层次结构机制加载到层次结构中。
    • 这一步实际上Spring并不完全支持,需要额外的work
  • 由于我的应用程序是分层的,因此我可以在除 JMX 层之外的所有模块上禁用 CGLib(我可以忍受它:-))。

上述步骤还使我能够减少 Spring 感知测试的执行时间(每个模块仅加载一个 bean 子集)。

作为一个实用指南(对于问题 #1),如果一个接口有多个实现,我将 @Primary 放置在广泛使用的一个和其他客户端上,需要另一个实现,使用 @Qualifier 连接 bean。

【讨论】:

    【解决方案2】:

    回答第 2 点) 您可以使用 AspectJ 而不是 CGLib。

    【讨论】:

    • 我会很感激一个例子(如果可能的话),因为我的尝试付诸东流
    • 您需要一个示例 Spring 如何使用 AspectJ 而不是 CGLib 代理? -- 我问是因为提供一个例子需要一些工作吗?
    • 我知道如何让它与 Java Proxy 而不是 CGLib 一起工作,但它与 MBean 的导出冲突
    • 我不是在谈论 Java Proxy,我是在谈论“真正的”AspectJ。 @see static.springsource.org/spring/docs/3.0.x/… -- 我相信这不会对 MBean 产生负面影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多