我在寻找有关Spring中LookUp方法的信息时,偶然发现了这篇文章。有一件事我不能理解,那里没有解释。如果我们有一个班:
public abstract class PizzaShop {
public abstract Pizza makePizza();
public abstract Pizza makeVeggiePizza();
}
和弹簧容器:
<?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!现在,当我们在主要方法中执行这样的代码时:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
PizzaShop pizzaShop = (PizzaShop) context.getBean("pizzaShop");
我们正在创建一个抽象对象!哪个分开的框架是不允许的。为什么这里有可能,或者我在理解整个概念时犯了错误?
这是可能的,因为Spring Framework在运行时操纵字节码来创建bean类的子类,该子类至少使用lookup-method
定义了其中一个属性
这是Spring5Lookup方法注入文档。
查找方法注入
查找方法注入是容器重写的能力方法,以返回的查找结果容器中的另一个命名bean。查找通常涉及原型bean,如前一节中描述的场景。Spring Framework通过使用从CGLIB库生成字节码,以动态生成重写该方法的子类
无论方法是否抽象,Spring都依赖于相同的机制:动态生成的子类
在第一种情况下,它实现
在第二种情况下,它会覆盖
如果方法是抽象的,则动态生成的子类实现该方法。否则,动态生成的子类重写在原始类中定义的具体方法。