当我在Spring中查找有关LookUp方法的信息时,我发现了这篇文章ARTICLE。我无法理解那里没有解释的一件事。如果我们上课了:
public abstract class PizzaShop {
public abstract Pizza makePizza();
public abstract Pizza makeVeggiePizza();
}
和Spring Container:
<?xml version="1.0" encoding="UTF-8"?>
(...)
<bean id="pizzaShop" class="com.javarticles.spring.PizzaShop">
<lookup-method name="makePizza" bean="pizza"/>
<lookup-method name="makeVeggiePizza" bean="veggiePizza"/>
</bean>
<bean id="pizza" class="com.javarticles.spring.Pizza" scope="prototype"/>
<bean id="veggiePizza" class="com.javarticles.spring.Pizza" scope="prototype">
<property name="isVeg" value="true"/>
</bean>
其中有一个基于抽象类创建的bean! 现在,当我们在main方法中执行这样的代码时:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
PizzaShop pizzaShop = (PizzaShop) context.getBean("pizzaShop");
我们正在创建一个抽象对象!哪个分开的框架是不允许的。为什么这里有可能,或者我在理解整个概念时犯了错误?
答案 0 :(得分:1)
这是可能的,因为Spring Framework在运行时操作字节码来创建bean类的子类,该类通过lookup-method
定义至少一个这些属性。
这是Spring 5 Lookup method injection documentation。
查找方法注入
查找方法注入是容器覆盖的能力 容器托管bean上的方法,用于返回查找结果 容器中另一个命名的bean。查找通常涉及到 原型bean,如上一节中描述的场景。 Spring Framework通过使用实现此方法注入 从CGLIB库生成字节码以动态生成a 覆盖该方法的子类。
无论方法是抽象的,Spring都依赖于相同的机制:动态生成的子类
在第一种情况下,它实现。
在第二种情况下,它会覆盖。
如果方法是抽象的,则动态生成子类 实现方法。否则,动态生成的子类 覆盖原始类中定义的具体方法。