我在这里缺少基本的东西,我很抱歉这个问题,基本上我试图从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 构建之前初始化了,但我错了..
答案 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