在Spring中创建抽象对象 - 查找方法

时间:2017-11-13 20:39:57

标签: java spring

当我在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");

我们正在创建一个抽象对象!哪个分开的框架是不允许的。为什么这里有可能,或者我在理解整个概念时犯了错误?

1 个答案:

答案 0 :(得分:1)

这是可能的,因为Spring Framework在运行时操作字节码来创建bean类的子类,该类通过lookup-method定义至少一个这些属性。
这是Spring 5 Lookup method injection documentation

  

查找方法注入

     

查找方法注入是容器覆盖的能力   容器托管bean上的方法,用于返回查找结果   容器中另一个命名的bean。查找通常涉及到   原型bean,如上一节中描述的场景。    Spring Framework通过使用实现此方法注入   从CGLIB库生成字节码以动态生成a   覆盖该方法的子类。

无论方法是抽象的,Spring都依赖于相同的机制:动态生成的子类 在第一种情况下,它实现。
在第二种情况下,它会覆盖。

  

如果方法是抽象的,则动态生成子类   实现方法。否则,动态生成的子类   覆盖原始类中定义的具体方法。