Spring控制器未创建为singleton

时间:2013-09-17 20:53:29

标签: java spring

我有一个Spring控制器,根据我在调试代码时看到的对象ID,我认为它不止一次被实例化。

控制器:

@Controller
@RequestMapping("/services/user")
public class UserController{

private UserService userService;

public void setUserService(UserService userService) {
    this.userService = userService;
}

public UserService getUserService() {
    return userService;
}

@RequestMapping(method = RequestMethod.POST, value = "/createUser")
public @ResponseBody String createUser(@RequestBody User user) throws UserNotCreatedException {

    try {
        userService.createUser(user);
        return user.getEmail();
    } catch (Exception e) {
        e.printStackTrace();
        throw new UserNotCreatedException("User not created");

    }
}

Spring配置文件:

  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<!-- Scans the classpath of this application for @Components to deploy as 
    beans -->
<context:component-scan base-package="com.xyz.controller" />

<context:annotation-config />

<bean id="userController" class="com.xyz.UserController">
    <property name="userService" ref="userService" />
</bean>

<bean id="userService" class="com.xyz.UserServiceImpl">
    <property name="userDao" ref="userDaoMysql" />
</bean>

<bean id="userDaoMysql" class="com.xyz.UserDaoImpl" >
    <property name="dataSource" ref="dataSource"></property>
    <property name="template" ref="jdbcTemplate"></property>
</bean>
   </beans>

当我发出通过UserController的请求时,我意识到userService为null时,我注意到了这个问题。然而;当我提出断点时,我看到userService确实在另一个UserController实例中设置。

3 个答案:

答案 0 :(得分:4)

此主题中的其他注释没有考虑UserController类的包。提供的Spring配置初始化com.xyz.controller上的组件扫描作为基础包。 UserController类似乎在com.xyz之外,因此不会被组件扫描拾取(除非这是一个错字@ user269091 - 这可能是你的问题!)。

我应该注意,我不明白为什么你的控制器不在你的controller包中。将控制器移到那里,在行@Autowired上方添加private UserService userService;并删除Spring配置中的手动UserController定义是最清晰的,这样组件扫描就会拿起你的bean自动并连接UserService

话虽如此,我真的不明白为什么你所展示的内容会出现问题。您的代码中的任何地方都有new UserController()吗?还有其他Spring配置吗?

答案 1 :(得分:1)

建立@ adashr的答案

如果删除手动配置,那么您现在正在根据注释初始化内容。 @Controller注释将正确创建Controller,但现在UserService中没有任何连线

你需要一个@Autowired for UserService来实例化它,因为你的spring配置现在是注释驱动的

答案 2 :(得分:0)

您正在混合注释和bean xml配置。 如果您正在使用@Controller annotaion,则无需在XML中定义控制器bean。

指令

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

负责为您注册控制器bean(您的控制器bean在该包内)。

我建议您在配置Spring MVC时使用mvc命名空间,以保持配置最小化和可读性。