我的app-servlet.xml
中有以下内容<mvc:annotation-driven />
<context:component-scan base-package="com.merc.myProject.web.controllers"/>
<context:component-scan base-package="com.merc.myProject.web.forms"/>
我的控制器包中的所有内容都被注入,但是form包中的相同内容始终为null。
我的表单看起来像这样
public class SelectDatesForm {
@Inject IUserService userService;
.....
}
我的控制器看起来像这样
@Controller
public class SelectDates {
@Inject IUserService userService;
.....
}
有人请帮忙
答案 0 :(得分:4)
<context:component-scan>
查找使用@Component
,@Controller
,@Service
等内容注释的类,并将其配置为bean。如果这些类具有使用@Inject
或@Resource
注入的属性,那么这些属性也将被处理。
但是,如果您的课程没有注释,那么@Inject
将不会被处理。这是SelectDatesForm
的情况。如果您使用@Component
对其进行注释,则应该将其选中。
我在这里要小心一点 - 形式通常不适合Spring bean,因为它们往往是丢失的瞬态对象。
答案 1 :(得分:1)
我猜你的SelectDatesForm
是用new
手动实例化的,而不是从Spring上下文中获取的。在这种情况下,它不是Spring bean,因此不是依赖注入的主题。
通常,您不需要将依赖项注入手动创建的对象中。如果您确实需要这样做,您有几种选择:
将您的SelectDatesForm
声明为原型范围的bean,并从Spring上下文中获取它的新实例,而不是使用new
创建它:
@Component @Scope("prototype")
public class SelectDatesForm { ... }
当你需要获得它的新实例时:
SelectDatesForm newForm = applicationContext.getBean(SelectDatesForm.class);
但是,这种方法将您的代码与Spring的ApplicationContext
相结合。
如果您无法控制SelectDatesForm
的实例化(即它发生在您的代码之外),您可以使用@Configurable
您也可以手动方便自动装配使用new
创建的对象:
SelectDatesForm newForm = new SelectDatesForm();
applicationContext.getAutowireCapableBeanFactory().autowireBean(newForm);