我有一个关于Spring继承的问题: 假设我有一个实现 Knight 界面的类(bean) BraveKnight 。在我使用id-> knight 在xml文件中声明这个bean之后,我正在尝试获取bean的引用:
Knight knight = (Knight) context.getBean("knight");
这是它的工作方式。但是为什么不可能从bean的名称本身获取bean引用:BraveKnight(为什么不能在没有接口的情况下工作)?
BraveKnight knight = (BraveKnight) context.getBean("knight");
答案 0 :(得分:2)
首先请使用:
public <T> T getBean(String name, Class<T> requiredType)
而不是:
public Object getBean(String name)
你会避免这种讨厌的类演员。
其次你的问题是关于它为什么没有使用没有界面的问题有点不明显。我猜你在BraveKnight没有实现任何界面的时候会遇到一些问题。如果你想这样做,你必须强制Spring使用CGLIB而不是动态代理机制。如果您在将Bean转换为BraveKnight时遇到ClassCastException问题,则意味着Spring使用动态代理并实现$ Proxy0类,该类仅实现Knigh接口并且不直接扩展BraveKnigh。无论您遇到什么问题,请尝试更好地了解CGLIB和JDK动态代理机制,以便下次Spring将使用您的对象做什么时不会感到惊讶。
如果答案与您的问题不符,请尝试附上更多信息,堆栈跟踪或说明。
答案 1 :(得分:1)
你 使用其名称获取bean:“knight”。您使用Spring bean名称作为密钥。
如果您的问题是“为什么我不能使用其类型查找bean”,答案是只要只有一个类型的bean就可以。它被称为“自动装配”。如果添加注释和一些必需的XML标记,Spring可以为您完成。
至于为什么它不能用于没有界面,谁说它没有?您可以使用Spring连接具体类类型。
更好的问题是“何时以及为什么我更喜欢在Spring中使用接口?”答案是,无论您是否使用Spring,为实现可能发生变化的情况设计界面都是一种很好的做法。它使Spring可以根据需要生成动态代理(例如,将事务添加到持久性对象)。
答案 2 :(得分:0)
您可以从应用程序上下文中调用没有接口而没有任何问题。
只有在使用AOP Proxy时才需要接口,在这种情况下,任何不通过接口调用的对象引用都会导致异常。
答案 3 :(得分:0)
您可以使用BraveKnight
作为bean名称,这样可以使您更容易理解映射。 Craig Walls Spring In Action
使用Knight
作为bean名称,以明确您的映射正在调用Knight
的实现。
同样它不适用于接口,因为在java中你无法实例化接口。 直接映射到Knight就像这样做;
Knight knight = new Knight(); // This is illegal
您将实例化Knight的实现以使其工作,例如:
Knight knight = new BraveKnight()//legal Implementation to Knight
这就是将实现用作上下文文件中的映射的原因。