无法在包中自动装配属性

时间:2015-05-13 23:44:05

标签: spring spring-mvc dependency-injection spring-annotations

出于某种原因,在我的配置包中,我无法在我的控制器包中自动装配字段,似乎没有任何问题。

例如:

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..*/
}

为什么它适用于控制器包但不适用于配置包?

2 个答案:

答案 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的上下文层次结构:

enter image description here

答案 1 :(得分:1)

请尝试使用此配置:

<context:component-scan base-package="config,controller" />