【问题标题】:Spring injected resource is always nullSpring注入的资源始终为空
【发布时间】:2014-01-15 00:58:44
【问题描述】:

问题:

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

背景:

我有两个豆子,一个叫另一个。这是它们在 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 个阻止服务被注入的接口有关?如果不是,还有哪些其他因素会影响它?

【问题讨论】:

  • 您能否发布您尝试注入MyService 的类的类声明以及整个配置?
  • 我已更新 OP 以包含更多信息。基本上我在 MyService 接口或实现类中没有注释。干杯
  • 如果你的 bean 配置文件不包含 &lt;context:annotation-config/&gt; 我不相信 @Resource 会起作用。请参阅我发布的要点。我已经测试过了,它可以工作。如果它不能满足您的需求,请告诉我您的情况有何不同,我会修改。
  • 我已将 OP 更新为更清晰

标签: java spring dependency-injection


【解决方案1】:

当你使用注解时,只需用@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() {}
}

还要确保您在调度程序文件中的 &lt;context:component-scan /&gt; 元素中提及您的包名称为

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

希望这能解决你的问题

【讨论】:

    【解决方案2】:

    确保您注入 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注解上指定name元素

    @Resource(name="myBean")
    private MyService myService;
    

    这是解释这些概念的Github Gist

    【讨论】:

    • 嗨 Kevin,首先感谢您为创建 Git Gist 所做的努力。略有不同的是,您定义为 MyApp 的 bean 实现了 3 个接口,而 MyServiceImpl bean 实现了一个接口“MyService”。当我尝试上面的建议时,我现在收到一个部署错误,说没有名为“myBean”的 bean,因为你的“SomeClass”就是我所说的“MyBeanImpl”。我将更新我的 OP 以使其更清晰
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多