春天自动装配没有发生?对象根本没有初始化

时间:2017-09-18 06:46:42

标签: java spring spring-mvc autowired

我们正在使用Spring MCV,我正在尝试使用弹簧自动接线来解耦我的代码。然而,自动装配根本不会发生。您能否在下面的代码/调度程序中建议任何问题

调度-servlet.xml中

<beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
               http://www.springframework.org/schema/mvc
               http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-4.1.xsd"
           xmlns:context="http://www.springframework.org/schema/context">
        <context:component-scan base-package="com.eos.accounts" />
    </beans>

User.java

package com.eos.accounts.data;
@Service
public class User {
.......
    @Autowired
    public UserMilesHelper  userMilesHelper             ;
.....
public static setUserPoints(User user){
 user.setPoints(user.userMilesHelper.getUserPoints(user.getUserId()));
}

IUserMilesHelper.java

package com.eos.accounts.data;

public interface IUserMilesHelper {

    public int getUserPoints(int userId);

}

UserMilesHelper.java

    package com.eos.accounts.data;

    import org.springframework.stereotype.Component;
   //I have used @Repository or Qualifier etc, no avail 
    @Component
    public class UserMilesHelper implements IUserMilesHelper {

        @Override
        public int getUserPoints(int userId) {
            return 10;
        }

    }

Web.xml

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>throwExceptionIfNoHandlerFound</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>50</load-on-startup>
</servlet>

4 个答案:

答案 0 :(得分:0)

您的User.java课程也必须使用@Component或其任何子女注释。

@Controller @Service @RestController

答案 1 :(得分:0)

在他的上下文中通过扫描包并查找带有构造型(@Controller@Service@Repository ....)的类或通过显式实例化手动添加豆。如果您使用new它不会调用Spring启动机制并且不会注入依赖性。

我认为您的User类不是单例类,因此您应该添加@Scope("prototype")并使用applicationContext.getBean(User.class)来实例化依赖性。

但说实话,我会改为重构代码以避免公共成员和静态方法设置变量并具有类似的类:

@Service
public class UserService{

   private IUserMilesHelper userHelper;

   @Autowired
   public UserService(IUserMilesHelper userHelper){
       this.userHelper = userHelper:
   }

   public setUserPoints(User user){
      user.setPoints(userHelper.getUserPoints(user.getUserId()));
   }
}

答案 2 :(得分:0)

默认情况下,调度程序servlet的名称是xxx-servlet.xml,其中xxx是servlet名称。这意味着spring正在寻找 dispatcher-servlet.xml ,这不是XML配置的名称。

因此,不会为您加载上下文本身。改变并测试。

除此之外,请确保遵循最佳做法。在接口上自动装配,而不是在具体类上。快速链接 - Spring: Why do we autowire the interface and not the implemented class?

答案 3 :(得分:0)

请将<context:component-scan base-package="com.eos.accounts" />更改为 <context:component-scan base-package="com.eos.accounts.*" />

试试看,让我知道结果。 希望它有所帮助。