我可以让春季服务课最后?这样做有什么害处吗?没有人会延长课程。有什么问题吗?
public final class MyService {
// Depedencies go here.
}
答案 0 :(得分:19)
不要让他们final
。如果在具体类上使用任何AOP(包括事务支持),spring将使用CGLIB动态扩展您的类以生成代理。 CGLIB工作的要求是让你的课程不是final
。否则将抛出异常。
答案 1 :(得分:6)
如果满足以下条件,Spring将创建一个JDK动态代理而不是CGLIB代理:
如果这三个都是真的,那么你可以声明最终的类。 (如果你愿意,你甚至可以使类包私有和构造函数私有,Spring将能够实例化它。)
否则,Spring将创建一个CGLIB代理。如果bean中没有公共方法,您仍然可以声明类final(假设它没有使用@Repository修饰并且您没有声明PersistenceExceptionPostBeanProcessor)。一旦有了单个公共方法,就无法使用CBLIB代理声明类final。 (注意:通过CGLIB代理时,必须至少有一个package-private,no-argument构造函数)。
以上什么时候有用?假设您有一个服务接口(所有服务通常应该具有接口),并且具有包私有的实现bean。该服务使用JDK动态代理。因此,它可能是最终的,在包外不可见,泄漏的实现细节较少。假设服务需要数据访问对象。如果没有其他服务使用此DAO,为什么要将其或其任何方法公开?如果DAO上的所有方法都是包私有的,那么服务实现仍然可以连接DAO并使用其方法。从包外部,调用者只能看到界面(一件好事)以及界面签名中使用的任何类型。
最后(没有双关语意),尽可能做出决赛。具体的继承往往会混淆被滥用(见fragile base problem)。最终类还允许一些编译器优化。