【问题标题】:Spring MVC Dependency Injection UnderstandingSpring MVC依赖注入理解
【发布时间】:2017-12-13 16:23:04
【问题描述】:

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

Spring Example

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

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

但是如果想同时绘制圆形、矩形和其他形状怎么办?我如何在 Spring 中告诉或配置,根据我提供的形状,它应该使用适当的形状来绘制形状。

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

【问题讨论】:

  • 您的问题与Spring无关。如何绘制形状的逻辑封装在它的每个子类中。 GeometryExample1 不知道也不应该知道如何绘制形状,它只调用draw 方法,该方法基于传递给它的Shape 实例具有不同的实现。

标签: java spring spring-mvc dependency-injection


【解决方案1】:

请查找使用 Java 配置而不是 XML 配置的教程。如果你学会使用 Java config,你的生活会轻松很多。

自动装配时,您可以指定 @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;

请参阅How to autowire by name in Spring with annotations? 了解更多详细信息以及使用 Java 配置实例化 bean 的示例。

【讨论】:

  • 嗨@Paul 非常感谢您的建议。我也会学习基于注释的配置。但是你能帮我如何在这里传递多个形状而不是一个吗?
  • 我如何在 spring 中进行配置以使其接受多种形状? @保罗
  • @KamilNoster 的回答似乎很完整 - 如果它不起作用,请尝试并评论。
【解决方案2】:

实现你的类:

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>

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

【讨论】:

  • 谢谢。但是如果我想一个接一个地画一个圆形和一个矩形呢?我们不能回过头来更改每个形状的配置。那么你能解释一下配置和使用它们的方式吗?
  • 感谢您的回答。但是可能有特殊情况对吗?比如如果我只想画一次矩形,同时画一次矩形和圆形怎么办?所以我应该在这种情况下在配置中进行更改。那么是否有一种动态的方式将其传递给 Shape 对象,并且可以将多个形状传递给同一个对象?
猜你喜欢
  • 2011-11-06
  • 1970-01-01
  • 2018-03-12
  • 2010-11-23
  • 1970-01-01
  • 2014-12-03
  • 2015-10-08
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多