Spring框架中的属性注入

时间:2015-01-06 14:44:23

标签: java spring spring-mvc inject

我在使用Spring MVC向bean注入一个值时遇到了问题。

这是我对Spring的部分配置:

<beans>
    <!-- Enable Annotation based configuration -->
    <context:annotation-config />

    <!-- MailGun.org Authentication -->
    <bean class="com.example.something.util.MailSender">
        <property name="smtpHost" value="smtp.mailgun.org" />
        <property name="smtpUsername" value="USERNAME_HERE" />
        <property name="smtpPassWord" value="PASSWORD_HERE" />
    </bean>
</beans>

这是要注入的豆子:

package com.example.something.util;

@Component
public class MailSender {
    public void sendMail(String recipient, String subject, String text) {
        System.out.println(smtpHost);
    }

    @Autowired
    private String smtpHost;
}

为了测试这个,我创建了一个测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:test-spring-context.xml"})
public class MailSenderTest {
    @Test
    public void testSendMail() {
        MailSender sender = new MailSender();
        sender.sendMail("zjhzxhz@gmail.com", "Mail From MailGun", "This is a test mail");
    }
}

当我运行这个测试用例时,我得到了一个例外:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.example.something.util.MailSender.smtpHost; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
    ... 41 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1308)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
    ... 43 more

它出了什么问题?请帮我。 THX!

1 个答案:

答案 0 :(得分:2)

您在@Autowired上不需要smtpHost,如果您从Spring上下文中获取MailSender bean,则应该已填充它。你不会这样做,因为用new MailSender()实例化它会完全绕过Spring。相反,您应该使用context.getBean(MailSender.class)