春天:autowired字段为空

问题描述:

我需要将外部lib类连接到我的bean,以便将它用作单例。
.XML配置:春天:autowired字段为空

<bean id="myBean" class="com.my.MyBean"> 
<property name="someLib" value="com.ExternalBean" /> 
</bean> 

的java bean:

@Service 
public class MyBean { 

    @Autowired 
    private ExternalBean externalBean; 


    public void setExternalBean(ExternalBean externalBean) { 
     this.externalBean = externalBean; 
    } 

而且我用有线变量externalBean公共方法,为了不实例化它的每一个方法调用。 问题是null

是否正确导线?什么是错误。

您必须将外部类定义为bean才能使@Autowired正常工作。

<bean id="externalBean" class="some.external.package.ExternalBean"> 
</bean> 

<bean id="myBean" class="com.my.MyBean"> 
</bean> 

此外,如果您使用@Autowired,则不需要setter。

+1

+1。而且该属性元素是无用的,因为它是自动装配的。如果它不是自动装配的,它的值必须是ExternalBean引用,而不是String“com.ExternalBean”。 –

+0

loodakrawa,您好,非常感谢您指出.Strange,但仍然无效。它为空。 – sergionni

+0

@sergionni 很高兴帮助:) 由于各种原因,它仍然可能为空。基于相对有限的信息,我很难猜测。我建议你使用显式的依赖注入而不是自动装配,因为这样你就有了更大程度的控制。我建议阅读以下内容:http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-collaborators – loodakrawa

loodakrawa是正确的。第二件可能导致问题的情况是,您有一个用于myBean的xml bean声明,并且附加注释了该bean的@Service。我想这会在使用启用组件扫描后立即引起麻烦。

我认为,更好的IDE AIS使用上下文路径扫描:

<context:component-scan base-package="some.external.package"> 
</context:component-scan> 

确保所有这些类的包内。然后用注解之一标记这两个类(@Repository, @Service, @Component)。

其中一个好处,不需要setter。

P.S:如果您重新使用扫描库,则不需要将类声明为bean,注释已足够

+0

danny.lesnik,是的,我在我的组件扫描声明。 xml和它是正确的,但自动装配的字段仍然是null.I不能标记外部的lib类。 – sergionni

+0

请发布。 –

+0

我是否需要对外部库进行组件扫描? – sergionni