【发布时间】: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) 可见实现
问题
- CGLib 无法代理最终类
- CGLib 需要默认(空)构造函数
- 某些服务需要通过 JMX 公开
- 除非由 CGLib 代理,否则 MBean 导出器无法工作
- 一些
@Transactional@Services 是通过外观服务访问的,这需要在外观事务中包含多个服务(例如,超过 2 个应用程序组件的观察者服务) - 有些接口有多个实现(目前以
@Qualifier区分) - 未来的指导方针(或很高兴拥有功能) - 每个应用程序模块都将有
beanRefContext.xml文件来配置其内部应用程序上下文
当我过去使用 XML 配置时,我能够强制执行我上面介绍的所有准则,但是当切换到注释时,Spring 似乎行为不端。
我小组中的开发人员更喜欢注解配置(我似乎更容易连接和编写新代码),但我注意到他们在代码中引入了各种“黑客”,以防止处理 Spring 应用程序上下文故障。
问题
- 在使用注释配置时我应该遵循哪些最佳实践?
- 当每个接口使用多个实现时(试图减少
@Primary或@Qualifier的使用) - 当使用
@Transactional - 当使用
@ManagedResource - 结合使用上述方法时
- 当每个接口使用多个实现时(试图减少
- 有没有办法停止使用 CGLib,保留注解配置并且仍然能够导出带有注解的 MBean?
- 什么是保留我的大部分(最好是全部)指南的合适实施方式?
【问题讨论】:
-
恕我直言,这些准则很奇怪。为什么不尝试遵守 Java Beans 规范呢?无论如何,如果它们只是指导方针,我想如果最后是合理的,你可以忽略中间的那些。
-
我不会说它们奇怪,它们继承自有效的 Java 编程指南。这些不是 Java bean,而是 Spring bean。另外,当使用 XML 时,遵循这些准则没有问题,因此恕我直言,注释是不合理的。
标签: java spring annotations cglib