无法自动装配包中的属性

Unable to autowire attributes in package

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

例如:

servlet-context.xml

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

root-context.xml(也尝试在此处添加服务)

<context:component-scan base-package="security" />

这不起作用:在配置包中设置 class。我收到空指针错误。

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

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

尝试改用此配置:

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

发生这种情况可能是因为 @Service class UserService 在两个包中的任何一个中都不可见 "config" 或 "controller" 我假设您还需要对包含服务的包进行组件扫描:

<context:component-scan base-package="service" />

编辑:

通常你应该记住,如果 Bean/Component 不在扫描的上下文中,它将始终是 null 注入(自动装配)。

编辑 2:

所以你可能已经看到 Spring 有两种类型的上下文,ApplicationContextServletContext。如果你在 ServletContext 中扫描一个 bean,它只能从 Controllers 访问(或者从 servlets 的名称状态),但是扫描的 beans ApplicationContext 也可以从 Services 或其他 Components 访问,任何 servlet 都可以访问此处扫描的 beans,而无需在 servlet 上下文中扫描它们。

在您的情况下,您应该进行以下设置:

servlet-context.xml:

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

In applicationContext.xml or root-context.xml (我假设你已经引用了它web.xml)

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

下图说明了来自 Spring:

的上下文层次结构