Spring MVC依赖注入理解

时间:2017-12-13 16:23:05

标签: java spring spring-mvc dependency-injection

我是Spring MVC的新手。我正在学习依赖注入的概念。我正在使用依赖注入的Spring代码示例链接此链接。

Spring Example

在那个例子中,我非常清楚依赖注入的概念。但我有一个小问题,如何告诉Spring我想要使用多个形状。在第一个例子(基于构造函数)中,他给出了一个圆形对象的引用,以便绘制一个圆圈。

<bean id="geometryExample1" class="com.boraji.tutorail.spring.GeometryExample1">
    <constructor-arg ref="circleShape"/>
</bean>

但是如果想画圆形,矩形和其他形状呢?我如何告诉或配置Spring,根据我提供的形状,它应该使用适当的形状来绘制形状。

感谢任何帮助。提前致谢。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

请找一个使用Java配置而不是XML配置的教程。如果您学习使用Java配置,您的生活会更容易。

自动装配时,您可以指定@Qualifier并通过ID引用bean,例如

// This is your circle object
@Autowired
@Qualifier("geometryExample1")
public GeometryExample1 circleShape;

如果你有

<bean id="squareExample" class="com.boraji.tutorail.spring.GeometryExample1">
    <constructor-arg ref="squareShape"/>
</bean>

...然后在你的代码中你会有这个:

// This is your square object
@Autowired
@Qualifier("squareExample")
public GeometryExample1 squareShape;

有关更多详细信息和使用Java配置实例化bean的示例,请参阅How to autowire by name in Spring with annotations?

答案 1 :(得分:0)

实施你的课程:

class CircleShape implements Shape {
    void draw() {
        // TODO implementation
    }
}

class RectangleShape implements Shape {
    void draw() {
        // TODO implementation
    }
}

声明bean:

<bean id="rectangleShape" class="com.boraji.tutorail.spring.RectangleShape" />
<bean id="rectangleShape" class="com.boraji.tutorail.spring.CircleShape" />

<bean id="geometryExample1" class="com.boraji.tutorail.spring.GeometryExample1">
    <constructor-arg ref="rectangleShape"/>
</bean>

Java方法是虚方法,因此调用RectangleShape中的draw()。 将geometryExample1 bean构造函数arg更改回CircleShape:

<bean id="geometryExample1" class="com.boraji.tutorail.spring.GeometryExample1">
    <constructor-arg ref="circleShape"/>
</bean>

现在调用CircleShape中的draw()。

详细了解虚拟方法here。请使用注释。

我希望我能正确理解你的问题。

编辑: 示例类:

class GeometryExample1 {
    private Set<Shape> shapes;

    void example() {
        shapes.foreach(Shape::draw);
    }

    public void setShapes(Set<Shape> shapes) {
         this.shapes = shapes;
    }

    public Set<Shape> getShapes() {
        return shapes;
    }
 }

和bean声明:

<bean id="geometryExample1" class="com.boraji.tutorail.spring.GeometryExample1">
    <property name="shapes">
        <set>
            <ref bean="circleShape" />
            <ref bean="rectangleShape" />
        </set>
    </property>
</bean>

在这种情况下,注释配置应该更清晰。