【问题标题】:Default Spring Autowiring默认 Spring 自动装配
【发布时间】:2012-03-12 14:33:50
【问题描述】:

我是 Spring 框架的新手......

我想知道默认情况下将使用哪种自动连接方式将属性值注入到类中。

当我阅读时,我知道没有可用的默认自动装配,所以在下面我没有提到任何自动装配的情况下,它是如何自动装配的。

beans.xml 文件

<bean id="javaLanguage" class="LanguageBean">
<property name="languageName" value="Java"/>
</bean>

LanguageBean.java

public class LanguageBean implements BeanNameAware
{
private String languageName;
private String beanName;

setter & getter are there.

}

当我运行程序时,我得到了属性名称 languageName 的值,那么它通过哪种机制注入了值,如何知道使用 setter 注入而不是构造函数注入? 依赖注入和自动装配一样吗? 请帮帮我。

谢谢。

【问题讨论】:

标签: java spring frameworks


【解决方案1】:

一开始你确实是自己注入了价值:

<property name="languageName" value="Java"/>

使用 bean 元素,您创建了一个名为“javaLanguage”的类“LanguageBean”的新实例。使用属性元素,您将通过归档注入(手动)将值“Java”注入该 bean。如果您想要构造函数注入,请改用构造函数元素。

通过自动装配,您可以自动将 bean 或值注入其他 bean。这意味着您没有在 beans.xml 中明确定义注入。假设您在上下文中定义了另一个名为“AnotherBeanUsingLanguageBean”的 bean:

<bean id="javaLanguage" class="LanguageBean">
    <property name="languageName" value="Java"/>
</bean>

<bean id="anotherBean" class="AnotherBeanUsingLanguageBean" />

AnotherBeanUsingLanguageBean:

public class AnotherBeanUsingLanguageBean {
    @Autowiring
    private LanguageBean languageBean;
}

在启动时,LanguageBean 的实例将自动注入到 anotherBean 实例中。有关自动装配的更多信息,请查看此处:http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/beans.html#beans-autowired-annotation

手动注入如下所示:

<bean id="javaLanguage" class="LanguageBean">
    <property name="languageName" value="Java"/>
</bean>

<bean id="anotherBean" class="AnotherBeanUsingLanguageBean" >
    <property name="languageBean" ref="javaLanguage"/>
</bean>

【讨论】:

  • 非常感谢您的清晰解释,这对我帮助很大。我现在明白了
【解决方案2】:

默认情况下,它解析为“Setter injection”。这也是您能够获取这些值的原因。

【讨论】:

  • 请参阅第 3.3.5 节。在这里自动装配合作者 [链接]:static.springsource.org/spring/docs/2.5.6/reference/beans.html
  • 我在一些文章中读到,如果你不提供任何东西,那么它不会做任何事情,而是你必须使用 ref 属性手动编写自动接线的东西,我有点困惑,你能提供一些包含对此描述的链接将很有帮助...
【解决方案3】:

它没有自动接线。您已经在类中定义了 setter,并且在 XML 配置中定义了值。 要使用自动装配功能,您必须在类中显式声明它(使用@Autowired 注解)

【讨论】:

    【解决方案4】:

    这是依赖注入的维基百科定义:

    http://en.wikipedia.org/wiki/Dependency_Injection

    所有的 Spring 应用都在一定程度上依赖于依赖注入,但 Spring 的实现不需要自动装配。有几种方法可以应用依赖注入:

    • 在全局主程序中以编程方式组装您的 bean
    • 在 XML 文件中指定要由 Spring 在启动时组装的 bean
    • 使用 @Autowired 注释您的 bean 类

    每种技术都实现了相同的目标:减少组件之间的耦合以实现可测试性。

    您提供的示例是第二种情况,您的 bean 连接在 XML 文件中指定,并由 Spring 加载到应用程序上下文中 在启动时。在 XML 中有两种指定 bean 属性的方法:setter 注入和构造函数参数。 'property' 标签使用前者, 'constructor-arg' 标记后者。所以你的代码依赖于基于 XML 的 setter 注入。如果你想自动装配,你应该使用 @Autowired 注释 私人领域。但是代码在运行时的工作方式是一样的,注解只是减少了你需要编写的代码量。

    您可以在 Spring 文档中找到有关 bean 连接机制的更多信息:

    http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/

    Spring 是您会发现的文档记录最完善的库之一,我认为您的更多问题可以在那里得到解答。

    【讨论】:

    • 嗨朋友们,非常感谢您的宝贵回答,实际上我对自动装配和依赖注入感到困惑。所以总结一下我得到的答案是,我在这里使用 Spring 的默认依赖注入功能,在这种情况下没有使用自动接线,对吗?当我们使用 标签时,默认情况下它会使用 setter 方法设置值,而当我们使用 时,它将使用 标签内的构造函数注入进行设置。解释我如果我理解错了......
    【解决方案5】:

    默认的自动连接设置是"no",这意味着您必须显式连接您的依赖项(使用@Autowire 或基于XML 的配置)。

    在您的情况下,您似乎已在 XML 配置中将您的 languageName 属性显式连接到“Java”,这将在创建 Spring bean 时调用您的 setLanguageName() 设置器,其值为“Java”。

    自动布线与此不同。它将使用您指定的策略隐式连接依赖项。如果您设置default-autowire="byType",Spring 将尝试使用 Class 类型自动装配您的属性以确定最佳匹配。所以:

    <beans xmlns="springframework.org/schema/beans"; 
           xmlns:xsi="w3.org/2001/XMLSchema-instance"; 
           xsi:schemaLocation="springframework.org/schema/beans springframework.org/schema/beans/spring-beans-2.5.xsd"
    
           default-autowire="byType"> <!-- Autowire by class type -->
    
        <!-- NOTE: No property values are set here -->
        <bean id="steering" class="Steering" />
        <bean id="car" class="Car" />
    </beans>
    
    public class Steering {
    }
    
    public class Car {
    
        private Steering steeringLogic;
    
        // This setter will be called by Spring with the "Steering" bean, which is 
        // the best matching class type for the field
        public void setSteeringLogic(Steering steeringLogic) {
            this.steeringLogic = steeringLogic;
        }
    
    }
    

    有关 Spring 接线的更多信息,请参阅本文:http://springindepth.com/book/in-depth-ioc-autowiring.html

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多