Spring注释与我的设计指南相矛盾

概观
运用

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

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

  • CGLib不能代理最终课程
  • CGLib需要默认(空)构造函数
  • 一些服务需要通过JMX公开
  • 除非由CGLib代理,否则MBean导出程序无法工作
  • 一些@Transactional @Service可以通过Facade服务来访问,这需要在Facade事务中包含多个服务(例如,2个应用程序组件的Observer服务)
  • 一些接口有多个实现(目前通过@Qualifier区分)
  • 未来的指南(或者很有特色) - 每个应用程序模块都有beanRefContext.xml文件来配置其内部应用程序上下文
  • 当我使用XML配置工作时,我能够执行上面介绍的所有准则,但切换到注释时,Spring看起来像是行为不端。
    我的团队中的开发人员更喜欢注释配置(我似乎更容易连线和编写新代码),但我注意到他们向代码引入了所有类型的“黑客”,以防止处理Spring应用程序上下文故障。

    问题(S)

  • 使用注释配置时,我应该遵循哪些最佳做法?
  • 当每个接口使用多个实现时(试图减少@Primary@Qualifier的使用)
  • 在使用@Transactional
  • 使用@ManagedResource
  • 当使用上述组合时
  • 有没有办法停止使用CGLib,保持注释配置,仍然能够导出我的MBeans注释?
  • 保留大多数(最好是全部)我的指导方针的适当实施是什么?

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

  • 每个依赖项目(Maven模块)都有它自己的ApplicationContext
  • 每个依赖项目应用程序上下文都在beanRefContext.xml定义
  • 这些应用程序上下文使用Spring上下文层次机制在层次结构中加载。
  • 这一步实际上并未得到Spring的全面支持,需要额外的工作
  • 由于我的应用程序是分层的,所以我可以在JMX图层以外的所有模块上禁用CGLib(我可以使用它:-))。
  • 上述步骤还使我能够减少Spring了解测试的执行时间(每个模块只加载一个子集的bean)。

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


    回答第2点)您可以使用AspectJ代替CGLib。

    链接地址: http://www.djcxy.com/p/62811.html

    上一篇: Spring annotations conflicts with my design guidelines

    下一篇: How does autowiring work in Spring?