Spring注入的资源始终为null

时间:2014-01-15 00:58:45

标签: java spring dependency-injection

ISSUE:

我正在尝试将服务注入bean,但服务实例始终为null。

背景

我有两个豆子从另一个叫来。这是它们在XML配置中的定义方式:

<context:annotation-config />
<bean class="com.test.MyBeanImpl" name="myBean"/>
<bean id="myService" class="com.test.MyServiceImpl" />

并且bean实现如下:

MyServiceImpl.java

class MyServiceImpl implements MyService {
    public void getString() {
        return "Hello World";
    }
} 

MyBeanImpl.java

@Component
class MyBeanImpl implements MyBean, SomeOtherBean1, SomeOtherBean2 {
    @Resource(name="myBean")
    private MyService myService;

    public MyBeanImpl() {}
}

问题:

是否有一些与我的bean实现3个接口阻止服务被注入这一事实相关的原因?如果没有其他因素可能影响它?

2 个答案:

答案 0 :(得分:6)

正在使用注释只需使用@Service注释标记服务类并使用@Autowired注释来获取服务类的实例

MyServiceImpl.java

package com.mypackage.service;
@Service
class MyServiceImpl implements MyService {

    public void getString() {
        return "Hello World";
    }
} 

MyBeanImpl.java

@Component
class MyBeanImpl implements MyBean, SomeOtherBean1, SomeOtherBean2 {

    @Autowired  
    private MyService myService;

    public MyBeanImpl() {}
}

还要确保在调度程序文件的<context:component-scan />元素中提及您的包名称

<context:annotation-config />
<context:component-scan base-package="com.mypackage" />

希望这能解决您的问题

答案 1 :(得分:1)

确保注入MyService的bean是bean。

/* This must be a bean, either use @Component or place in configuration file */
@Component
public class SomeClass{
   @Resource
   private MyService myService;
}

还要确保在配置中指定应用程序使用基于注释的配置:

<context:annotation-config/>

由于您使用多个接口,因此最好使用名称来限定bean:

<bean class="com.test.MyBeanImpl" name="myBean" />

然后在@Resource注释

上指定名称元素
@Resource(name="myBean")
private MyService myService;

这是解释这些概念的Github Gist