出于某种原因,在我的配置包中,我无法在我的控制器包中自动装配字段,似乎没有任何问题。
例如:
servlet的context.xml中
<context:component-scan base-package="service, controller, config" />
root-context.xml(尝试在这里添加服务)
<context:component-scan base-package="security" />
这不起作用:配置包中的安装类。我收到一个空指针错误。
@Component
public class Setup { //inside the config package
@Autowired
private UserService userService; //null pointer error
/*..other stuff */
}
这确实有效:控制器包内的控制器:
@Controller
@RequestMapping(value="/contact")
public class ContactController { //inside the controller package
@Autowired
private UserService userService; //this works
/*..other stuff..*/
}
为什么它适用于控制器包但不适用于配置包?
答案 0 :(得分:2)
这是因为可能 @Service 类 UserService 在任何两个软件包中都不可见&#34; config &#34 ;或&#34; 控制器&#34;我假设您还需要对包含服务的包进行组件扫描:
<context:component-scan base-package="service" />
修改强>
通常你应该记住,如果 Bean / 组件不在扫描的上下文中,它在注入(自动装配)时将始终为 null
编辑2:
因为您可能已经看到Spring有两种类型的上下文, ApplicationContext 和 ServletContext 。如果您在 ServletContext 中扫描bean,则只能从控制器(或从servlet中显示名称)访问它,但是 ApplicationContext <扫描的bean / strong>也可以从服务或其他组件访问,任何servlet都可以访问此处扫描的bean,而无需在servlet上下文中扫描它们。
在您的情况下,您应该进行以下设置:
在 servlet-context.xml :
<context:component-scan base-package="controller" />
在 applicationContext.xml 或 root-context.xml (我假设您已在web.xml中引用它)
<context:component-scan base-package="config, security, services" />
下图显示了Spring的上下文层次结构:
答案 1 :(得分:1)
请尝试使用此配置:
<context:component-scan base-package="config,controller" />