我们正在使用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>
答案 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.*" />
试试看,让我知道结果。 希望它有所帮助。