@Resource为类String的bean返回null

时间:2014-09-05 12:37:36

标签: java spring dependency-injection

我是Spring新手,我遇到以下问题: 我有以下bean:

<bean id="lastName" class="java.lang.String"> <constructor-arg value="Johnson"/> </bean>

然后,在我的班级RegisterPerson中,我有以下

@Configurable
public class RegisterPerson
   @Resource(name="lastName")
   private String lastName;

然后在我的方法displayName(){ System.out.println(lastName) }

lastName为空。

我找了一些例子,但找不到与我的问题类似的东西。任何意见或建议将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:2)

将String注入到类中的最佳方法是在Spring XML中声明属性configurer:如下所示:

<bean id="propertyConfigurer"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="locations">
        <list>
            <value>classpath:/cfg/yourPropsFile.properties</value>
        </list>
    </property>
</bean>

如果您正在使用注释,请确保在spring文件中包含以下行:

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

然后只需将要注入spring bean的字符串添加到该文件中,例如:

my.prop=Johnson

然后使用@Value注释将其注入您的控制器:

@Value("${my.prop}")
private String lastName;

这假设您的值需要是可配置的。

否则,如果您需要按照现在尝试的方式注入String值,请注意默认情况下使用@Configurable注释自动装配不起作用。要启用自动装配,您需要使用@Configurable(autowire = Autowire.BY_NAME)启用它,但除非您确实需要,否则不应使用它。 @Configurable注释主要用于AspecJ,这不是你想要在这里实现的。

因此,使用@Component并使用:

定义您的课程
@Autowired 
@Qualifier("lastName")
private String lastName;

将解决您的问题。

答案 1 :(得分:1)

您应该使用自动装配和限定符注释..

@Autowired 
@Qualifier("lastName")
private String lastName;

尝试此配置

public class Test {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("app-context.xml");
        String s = (String) context.getBean("lastName");
    }
}