概述
使用
- 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
是通过外观服务访问的,这需要在外观事务中包含多个服务(例如,超过 2 个应用程序组件的观察者服务) - 一些接口有多个实现(目前用 区分
@Qualifier
) - 未来指南(或很高兴拥有功能) - 每个应用程序模块都有
beanRefContext.xml
文件来配置其内部应用程序上下文
当我过去使用 XML 配置时,我能够强制执行我上面介绍的所有准则,但是当切换到注释时,Spring 似乎行为不端。
我小组中的开发人员更喜欢注解配置(我似乎更容易连接和编写新代码),但我注意到他们在代码中引入的各种“黑客”以防止处理 Spring 应用程序上下文故障。
问题
- 使用注释配置时我应该遵循哪些最佳实践?
- 当每个接口使用多个实现时(试图减少使用
@Primary
or@Qualifier
) - 使用时
@Transactional
- 使用时
@ManagedResource
- 使用上述组合时
- 当每个接口使用多个实现时(试图减少使用
- 有没有办法停止使用 CGLib,保留注释配置并且仍然能够导出带有注释的 MBean?
- 保留我的大部分(最好是全部)指南的合适实施是什么?