我的任务是更新一个我没写过的旧项目。
该项目基于Spring MVC,并且具有我不熟悉的旧版Spring Controller配置。
控制器的bean配置如下
<bean id="controllerName" class="the.project.controller.class">
<property name"serviceName">
<ref bean="serviceName">
</property>
<property name"successView">
<value>viewName</value>
</property>
</bean>
其中serviceName是指用@Service
注释的类,如下所示
@Service(value=serviceName)
这是xml配置的正确替代品吗?
@Autowired
@Qualifier("serviceName")
ServiceNameImpl serviceName
感谢
这里编辑的是serviceName类和接口的组织
public interface ServiceName {
// methods omitted
}
@Service(value="serviceName")
public class ServiceNameImpl implments ServiceName {
//methods omitted
}
我无法使用@Resource注释(Spring 3.0.7)并且上面的Autowire失败(因为它看起来类型不如下所述)
org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching beans of type [the.project.ServiceNameImpl] found for dependency
鉴于编辑,我在这里做错了什么(道歉,遗漏这些信息)?
最后我需要能够访问接口的方法及其实现
例如
serviceName.doSomething(someVar);
答案 0 :(得分:4)
这是正确的,但请考虑为private
使用serviceName
修饰符。另一种方法是使用@Resource
:
@Resource
private ServiceNameClass serviceName;
请注意,在这种情况下,默认情况下@Qualifier("serviceName")
使用类型时,您不需要@Resource
- @Autowired
自动装配(字段)名称。只有当你有几个相同/兼容类型的bean时才会出现问题。
此外,您可以通过使用controllerName
注释控制器类来完全跳过@Controller
bean定义。
顺便说一下,您还可以使用以下语法缩短XML配置:
<bean id="controllerName" class="the.project.controller.class">
<property name"serviceName" ref="serviceName"/>
<property name"successView" value="viewName"/>
</bean>
(IntelliJ建议进行此转换并为您执行此操作)。