默认弹簧自动装配

时间:2012-03-12 14:33:51

标签: java spring frameworks

我是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注入而不是构造函数注入? 依赖注入也和自动装配一样吗? 请帮帮我。

感谢。

5 个答案:

答案 0 :(得分:2)

首先,你自己通过写作来注入价值:

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

使用bean-element创建了一个具有实例名称“javaLanguage”的类“LanguageBean”的新实例。使用property-element,您可以通过提交注入将值“Java”注入该bean(手动)。如果需要构造函数注入,请改用constructor-element。

使用自动装配,您可以自动将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>

答案 1 :(得分:0)

默认情况下,它会解析为“Setter injection”。这就是你能够获得价值的原因。

答案 2 :(得分:0)

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

在你的情况下,看起来你已经在你的XML配置中明确地将你的languageName属性连接到“Java”,当Spring bean是你的时候,这将调用你的setLanguageName() setter,其值为“Java”创建

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

<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

答案 3 :(得分:0)

它没有得到自动装配。您已在类中定义了setter,并且您正在XML配置中定义该值。 要使用自动装配功能,您必须在类中明确声明它(使用@Autowired注释)

答案 4 :(得分:0)

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

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

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

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

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

您提供的示例是第二种情况,其中您的bean布线在XML文件中指定,并由Spring加载到应用程序上下文中 在启动时。在XML中有两种指定bean属性的方法:setter injection和constructor arguments。 'property'标签使用前者, 'constructor-arg'标记后者。所以你的代码依赖于基于XML的setter注入。如果要进行自动装配,则应使用@Autowired注释 私人领域。但是代码在运行时也会起作用,注释只会减少你需要编写的代码量。

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

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

Spring是您将找到的文档最齐全的库之一,我认为您可以在那里回答更多问题。