初学者对 Spring 中的自动装配感到困惑

Beginner confusion about autowiring in Spring

全部:

刚开始Spring学习,有一个概念让我很困惑:Autowiring.

我需要明确的问题是:

What kind of thing can be autowired? Is it only other beans?

如果我定义一个class栏:

public class Bar {
    @Autowired
    public String name;
}

我在想,如果我将 @Autowired 注释添加到成员变量,如 String name; 并在 bean 配置 XML 中,我写道:

<bean id="bar" class="com.Bar">
    <property name="name" value="Bar" />
</bean>

在 Spring 中做同样事情的方法太多了,这让我很困惑。总计。 有什么好的技巧可以清楚的记住和分辨不同方式的区别吗?

谢谢

是的,您只能@Autowired Beans。 @Autowired是Spring中使用依赖注入的方式。它是为 Beans 提供的——一次编写多次使用的组件。在 String 属性 上使用 DI 是没有意义的,我认为你得到了 Exception.

您不能像您所做的那样自动装配字符串值。

通过编写您的 XML bean 声明,您所做的是创建一个 Bar 的单例实例,并将名称字段设置为 'Bar' 的值。

如果你想在你的应用程序的其他地方使用这个 Bar class(比如在一个名为 Foo 的 class 中)你可以这样做:

public class Foo {
    @Autowired
    private Bar bar;
}

Spring 然后会将您的 Bar 实例注入您的 Foo class.

但是因为 Bar 默认情况下是一个单例,所以无论您将多少个 Bar 实例自动连接到不同的 classes,您都将拥有相同的 Bar 实例=] 在所有这些中。因此,如果您尝试修改一个 class 中的名称,所有其他 class 中的名称都会更改。

作为一般经验法则,如果您的 class 有任何可变数据(将被更改和更新的数据),那么您的 class 不是您应该为自动装配声明的东西(因为在您的 Spring 应用程序中只会有一个实例)。它更适合 DAO 和服务 classes 之类的东西。在回答您的第一个问题时,是的,您只能自动装配 classes(bean)的实例。

如果您需要从某处获取 String/Integer/Long/Array/Mutable 数据类型值,请配置一个属性文件,并阅读如何使用 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer class with the @Value 注释。