我是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注入而不是构造函数注入? 依赖注入也和自动装配一样吗? 请帮帮我。
感谢。
答案 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文件中指定,并由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是您将找到的文档最齐全的库之一,我认为您可以在那里回答更多问题。