用于场注入的空指针

时间:2015-12-29 21:40:07

标签: spring spring-mvc

我在这里缺少基本的东西,我很抱歉这个问题,基本上我试图从Autowring for @Sevice field failed模拟我自己的问题,但是以非常简单的形式,我试图以某种方式提出错误是为了建立理解,但是当它出现时,我就无法处理它。

x-servlet.xml

<beans xmlns= ...... >
   <context:component-scan base-package="com" /> 
     <context:annotation-config />
    <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />   
    </bean>
</beans>

com.domain

Boss.java

package com.domain;
public class Boss {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

员工:

package com.domain;
import org.springframework.beans.factory.annotation.Autowired;
public class Employee {
    @Autowired
    private Boss boss;
     String nameBoss;

    public String getNameBoss() {
       nameBoss = this.boss.getName();
       return nameBoss;
    }

}

com.controller

controller.java :

package com.controller
import com.domain.Boss;
import com.domain.Employee;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class controller {    
    @RequestMapping("/try")
    public String show() { 
        Boss b = new Boss();
        b.setName(" hans");

         Employee e =  new Employee();  
          String bossName = e.getNameBoss();            
        System.out.println(bossName );      

    return "";
}
 }

我在想,

String bossName = e.getNameBoss();
控制器中的

不会为空,因为 Boss 已经在 Employee 构建之前初始化了,但我错了..

1 个答案:

答案 0 :(得分:1)

您确定要对域对象进行依赖注入(DI)吗?这不是典型的用法......对于DI,容器必须创建实例 - 所以不要使用new运算符......

您可以使用ApplicationContext.getBean()替换new运算符(如果bean是原型类型),但正如我上面所说 - 即使您知道如何创建这样的bean,Spring应该知道哪个{{{ 1}}你想拥有员工吗?

首先需要的是控制器中的应用程序上下文,它应该可以添加接口Boss,或者您可以简单地autowire it然后使用它“标准”方式(ac是ApplicationContext):

org.springframework.context.ApplicationContextAware

我将 Boss b = ac.getBean(Boss.class); Employee e = ac.getBean(Employee.class, b); Boss标记为注释:

Employee