Bean实例未加载

时间:2017-07-06 06:13:39

标签: java spring dependency-injection

我需要关于依赖注入的帮助。

我有一个bean类,它有一个JdbcTemplate的对象引用,我正在使用@Autowired来 创建该对象的实例。但是该对象没有被加载,因此抛出了NullPointerException 来自setCustName()方法。

请帮忙

Bean类:

class CustomerBean {

    private String custName;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void setCustName(String custName) {
    this.custName = custName;
    jdbcTemplate.update(query);
    }
}

XML:

<bean id="myjdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
 </bean>  

 <bean id="custBean" class="com.test.CustomerBean">
        <property name="custName" value="John" />
 </bean>  

堆栈跟踪:

PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'custName' threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:334)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1419)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1160)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)

3 个答案:

答案 0 :(得分:1)

你得到NullPointerException,因为jdbcTemplate为null /未注入。

如果用xml描述bean custBean,就像你一样,你应该添加: &LT; property name =“jdbcTemplate”value =“myjdbcTemplate”/&gt;用于将jdbcTemplate注入到bean中。

你有混合配置 - xml和注释。你的xml应该是:

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

支持@Autowired和CustomerBean应该是@service或@component。

vaiant1:

添加到xml和

@Component
class CustomerBean {

    private String custName;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void setCustName(String custName) {
        this.custName = custName;
        jdbcTemplate.update(query);
    }
}

variant2:

class CustomerBean {

private String custName;
private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
     this.jdbcTemplate = jdbcTemplate;
}

public void setCustName(String custName) {
   this.custName = custName;
   jdbcTemplate.update(query);
}

}

和xml

 <bean id="custBean" class="com.test.CustomerBean">
        <property name="custName" value="John" />
        <property name="jdbcTemplate" ref="myjdbcTemplate" />
 </bean>

答案 1 :(得分:1)

  1. 将@Component注释添加到包含可以自动装配的bean的bean类中。
  2. 在bean上添加上面的@Component注释后,我们需要告诉spring扫描这些相应的bean并加载所有自动连接的依赖项。这可以通过声明以下XML配置

    来完成

    <context:component-scan base-packages="<your_package_names>"/>

    例如,如果我的包结构是com.mycompany

    <context:component-scan base-packages="com.mycompany"/>

答案 2 :(得分:0)

使用<context:annotation-config>可以在bean类中使用不同的注释。

另外,我强烈建议不要在属性设置器中使用不同的依赖项。在你的代码示例中,你假设在调用setter之前jdbcTemplate是自动装配的,事实上你无法确定。

因此,您在setter中放置的关于jdbc模板的逻辑将更适合放置在使用@PostConstruct注释的方法中。